Siguenos en ...

Google+facebooktwitter

youtubepinterest RSS aquihayapuntes

Últimos Tutoriales


Licencia

Creative Commons

 

Todo el contenido de este sitio está bajo una licencia de Creative Commons

 

Comunicación USB-PIC con HID

USB-HIDEjemplo de comunicación USB Multiplataforma entre un PIC (18F4550) y un PC utilizando la clase HID y la librería HIDAPI. La aplicación de escritorio está realizada en C++ con las librerías gráficas de Qt y el IDE QtCreator. El firmware utilizado en el PIC es el ejemplo ex_usb_hid.c proporcionado por CCS y que podéis encontrar en la carpeta Examples en la ruta donde hayáis instalado el compilador. La aplicación permite el envío de datos hacía el PIC (control del estado ON-OFF de dos Leds) y la recepción de dos entradas de datos (Señal analógica a través de un potenciómetro y entrada digital proporcionada por un pulsador).

 

 

Acerca de la clase HID (Human Interface Device)

 

Una característica que hace muy interesante el uso de dispositivos que implemente en su firmware la clase HID es que la mayoría de Sistemas Operativos modernos implementan los controladores necesarios para poder comunicarse con ellos sin ser necesaria la instalación de ningún driver adicional por parte del usuario. Ejemplos de dispositivos HID tenemos por ejemplo los teclados y ratones del PC sin embargo, también pueden utilizar esta clase dispositivos que no requieran una interacción humana directa como termómetros, voltímetros, lectores de códigos de barras, etc. Lo que la hace muy interesante a la hora de utilizarla en proyectos que utilizan  Microcontroladores.


Un esquema general y personalizado a lo que sería esta demo de una comunicación HID entre una aplicación de escritorio y un Microcontrolador sería el siguiente:

 

Diagrama Comunicación HID

 

Sobre este diagrama se pueden comentar algunos conceptos:

  • Un Endpoint es un buffer de memoria RAM situado físicamente en el Microcontrolador, desde ese buffer se reciben o se envían los datos desde el dispositivo hacía el Host. Como se ve en la figura el host también tiene Buffers para almacenar temporalmente la información pero solo a los buffers del dispositivo se les denomina Endpoint. Cada Endpoint puede ser de entrada o de salida o bidireccional, la dirección se considera siempre desde el punto de vista del Host, así un Endpoint de salida será un canal que transmita datos desde el host al dispositivo (PIC). Un Endpoint configurado como control es bidireccional, es decir, será capaz de enviar o recibir datos en ambas direcciones. Todos los dispositivos deben de tener un Endpoint de control, numerado con el número cero. El Sistema Operativo instalado en el PC realiza el proceso de enumeración y control a través de él cuando el dispositivo es enchufado al PC.
  • Una interfaz está formada por una colección de Endpoint y una determinada configuración puede estar formada a su vez por varias interfaces.
  • Las pipes o tuberías son canales de comunicación que sirven para transmitir datos entre el PC-Host y un Endpoint en particular.
  • En la clase HID los datos se intercambian a través de unas estructuras de datos llamadas informes (Reports). Este formato es flexible y permite manejar casi cualquier tipo de dato, en los descriptores es donde se especifica el tamaño de los datos de los Reports así como información adicional sobre ellos.
  • Las limitaciones que tienen en cuanto a velocidad de transferencia los dispositivos HID son: para un dispositivo low-speed máximo 800 bytes/s, para full-speed 64KB/s. las únicas transferencias soportadas son las de control e Interrupción.

 

¿Qué es HIDAPI?

 

Es una librería Multiplataforma (Windows, Linux y MAC) que facilita la comunicación entre una aplicación y un dispositivo que implementa la clase HID.


Hay varias formas de utilizar HIDAPI dependientes del sistema operativo utilizado:

 

  • Windows (usando hid.dll)
  • Linux/hidraw (usando el driver hidraw del kernel)
  • Linux/libusb (usando libusb-1.0)
  • Mac (usando IOHidManager)

Para esta demo se utilizará hid.dll para la aplicación de escritorio de Windows y la librería libusb 1-0 para la aplicación de escritorio que correrá en Linux.

 

Aplicación de escritorio para Windows

 

Para poder trabajar con la librería HIDAPI en Windows debemos hacerlo a través de una librería dinámica, para compilar la .dll seguiremos los siguientes pasos:

  • Nos Bajamos las fuentes de la librería (signal11-hidapi) desde aquí.
  • Descargarnos e instalamos el Visual Studio C++ 2008 desde la página de Microsoft.
  • Ejecutamos el Visual Studio C++ 2008 y desde el menú del programa seleccionamos File-> Open->Project/Solution… y seleccionamos la solución al proyecto contenida en la carpeta Windows de la librería (hidapi.sln)
  • Seleccionamos la configuración Release.
  • Y compilamos seleccionando en el menú Build-> BuildSolution (F7).
  • La compilación nos generará la librería dinámica hidapi.dll que tendremos que incluir en el directorio donde tengamos el ejecutable de nuestra aplicación de escritorio y el archivo hidapi.lib que será la librería que tendremos que añadir al proyecto de la aplicación desde QtCreator.


La librería hidapi.lib la añadimos seleccionando la carpeta del proyecto y haciendo clic en Add Library… en el menú contextual.   

Nota: esta opción solo está disponible en las últimas versiones de QtCreator.

 

Añadir librería

 

El la ventana que nos aparece seleccionamos External  library:

 

Seleccionar librería

 

Y al pulsar Next seleccionaremos hidapi.lib, las demás opciones dejamos las que vienen por defecto.

A los archivos del proyecto también tenemos que añadir el archivo de cabecera hidapi.h.

La configuración del proyecto en QtCreator una vez añadidas las librerías necesarias debe de quedar según se muestra en la figura:

 

Configuración Proyecto Windows

 

La aplicación de escritorio mostrará la siguiente interfaz:

 

Ejemplo HID Windows

 

 

© 2007-2017 AquiHayapuntes.com