Está en la página 1de 39

Clase de Visual C++ en software libre para comunicacin USB de HID genricos

Contenidos

1 Introduction 2 Public Methods o 2.1 usbHidCommunication(System::Void) - Constructor o 2.2 System::Void requestDeviceNotificationsToForm(System::IntPtr handleOfWindow) o 2.3 System::Void handleDeviceChangeMessages(Message% m, System::Int16 vid, System::Int16 pid) o 2.4 System::Boolean isDeviceAttached(System::Void) o 2.5 System::Boolean isDeviceBroken(System::Void) o 2.6 System::Void findDevice(System::Int16 usbVid, System::Int16 usbPid) o 2.7 System::Boolean sendUsbCommandWriteOnly(System::Int16 usbCommandId) o 2.8 System::Boolean sendUsbCommandWriteRead(System::Int16 usbCommandId) o 2.9 System::Boolean writeToTheOutputBuffer(System::Int16 byteNumber, System::Byte value) o 2.10 System::Byte readFromTheInputBuffer(System::Int16 byteNumber) o 2.11 System::Void detachUsbDevice(System::Void) 3 Required include files 4 Status and Limitations 5 Further information about the class 6 Example code 7 Files for download

8 vea tambin

Introduccin

Si han tratado de construir sus propios dispositivos PIC USB (tal vez usando mi tutorial anterior construyendo un dispositivo USB con PIC18) se habrn dado cuenta que el cdigo anfitrin de Windows (basado en la pila de ejemplos de USB de Microchip) es todo menos claro acerca de cmo comunicarse con el dispositivo. Para hacer las cosas ms fciles para las personas que estn familiarizadas con lo intrincada que resulta ser la programacin de Windows, y el USB que yo he creado, una clase genrica de Visual C++ que maneja todos los problemas de comunicacin de dispositivos, incluyendo los aspectos plug & play de la deteccin de acoplamiento y desacoplamiento de dispositivos.

La clase genrica es recomendable para todos los tipos de dispositivos USB HID genricos (incluyendo dispositivos que usen el protocolo genrico HID basado en un soporte con micro controladores comunes que no sean los PIC18F) En este artculo explicar como usar esta clase, como funciona la clase y tambin dar algunos ejemplos prcticos de cmo puede ser usada para hacer tu propio software para Windows. Vea tambin: Framework en software libre para dispositivos USB HID genricos basados en PIC18F y Windows.

Mtodos Pblicos
Los mtodos pblicos de la clase son aquellos que son expuestos al programador usando la clase. T puedes utilizar la clase usando estos mtodos sin necesidad de indagar en el cdigo y entender cmo funciona. Las siguientes secciones detallan los mtodos pblicos, que hacen y como invocarlos.

usbHidCommunication (System::Void) - Constructor

usbHidCommunication (System::Void) - Constructor


El mtodo constructor debe ser llamado aadiendo una definicin de la clase dentro de una seccin 'private:' del archivo .h de la forma, debera quedar de esta manera: // Initialize the USB HID Communication object private:usbHidCommunicationNameSpace::usbHidCommunication a_usbHidCommunication; Esta accin habilita a la clase para su uso (inicia un objeto desde la clase)

System::Void requestDeviceNotificationsToForm handleOfWindow)

(System::IntPtr

Este mtodo solicita que las notificaciones del dispositivo sean enviadas a la forma principal que permite a la clase recibir los mensajes de acoplamiento y desacoplamiento del dispositivo desde el sistema operativo Windows. Tienes que pasa el dominio de la forma central al mtodo para que este sepa a dnde dirigir las notificaciones. Para simplificar esto pon el siguiente cdigo en la forma de construccin:
// //TODO: Add the constructor code here // // Request that this form receives device notifications a_usbHidCommunication.requestDeviceNotificationsToForm(this->Handle);

System::Void handleDeviceChangeMessages System::Int16 vid, System::Int16 pid)

(Message%

m,

Este mtodo es responsable de manejar los mensajes de notificacin de cambios en los dispositivos provenientes de Windows (los que le dicen a la clase cuando los dispositivos USB se conectan o desconectan del anfitrin).Para usar esto tienes que incluir el siguiente cdigo en la clase de la forma principal:
// Esta funcin de devolucin de Windows que vienen hacia la forma. llamada recibe los mensajes de

protected: virtual void WndProc (Message% m) override { a_usbHidCommunication.handleDeviceChangeMessages VID, PID); Form::WndProc( m ); } // END WndProc method

(m,

Tienes que pasar este mtodo, el VID y el PID de tu dispositivo que puede ser hecho ya sea directamente (simplemente especificando los nmeros como 0x1234, 0x4321) o (como en el ejemplo arriba) desde dos comandos #define en el inicio del archivo h. de tu forma

System::Boolean isDeviceAttached(System::Void)
Este mtodo devuelve verdadero si el dispositivo esta actualmente acoplado, y falso si es que no lo est, y puede ser usado para ver si el dispositivo USB est disponible para comunicacin.

System::Boolean isDeviceBroken(System::Void)
Este mtodo devuelve verdadero si un dispositivo est conectado pero, por alguna razn, es considerado interrumpido (problemas de comunicacin de i.e., etc). Ntese que si esta

bandera es verdadera el mtodo isDeviceAttached devolver falso. Esto te permite aadir alguna informacin extra de alerta si algo inesperado le ocurre al dispositivo.

System::Void findDevice(System::Int16 usbVid, System::Int16 usbPid)

Este mtodo intenta encontrar el dispositivo USB con el VID y PID alimentados. Si este tiene xito isDeviceAttached devolver verdadero cuando sea consultado. Debes realizar una bsqueda inicial para el dispositivo cuando la forma principal sea creada, si el dispositivo es conectado despus la notificacin del dispositivo har que llame a este mtodo automticamente. Debes incluir tambin, una llamada hacia este mtodo en el constructor de la forma central similar al siguiente cdigo.
public: Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // // Request that this form receives device notifications a_usbHidCommunication.requestDeviceNotificationsToForm(this>Handle); // Perform an initial search for the desired USB device a_usbHidCommunication.findDevice(VID, PID); // VID, PID }

System::Boolean usbCommandId)

sendUsbCommandWriteOnly(System::Int16

Este mtodo enva un comando (y probablemente algunos datos) al dispositivo USB, pero no espera que el dispositivo USB le enve algo en respuesta. Para usar esto tu simplemente configuras usbCommandId hacia el valor que deseas enviar y llamar el mtodo. El commandId es de hecho el 1er byte del paquete de 64-bytes que el HID genrico usa para comunicarse. Los otros 63 bytes estn disponibles para datos y pueden ser configurados usando el mtodo writeToTheOutputBuffer() detallado a continuacin. Aqu est un ejemplo de este mtodo en accin:
// Send the toggle LED command if (a_usbHidCommunication.sendUsbCommandWriteOnly(0x80) != true) this->lastErrorMessageLabel->Text = L"Read/Write command failed"; else this->lastErrorMessageLabel->Text = L"Read/Write command succeeded";

Este mtodo devuelve verdadero si la escritura fue exitosa y falso si falla.

System::Boolean usbCommandId)

sendUsbCommandWriteRead(System::Int16

Este mtodo es similar al mtodo sendUsbCommandWriteOnly(), sin embargo este espera que el dispositivo USB conteste al comando. La respuesta del dispositivo USB es obtenida usando el comando readFromTheInputBuffer() detallado a continuacin. Aqu est el mtodo en accin:
// Check the status of the switch a_usbHidCommunication.sendUsbCommandWriteRead(0x81); if (a_usbHidCommunication.readFromTheInputBuffer(2) == 0) this->switchStatusLabel->Text = L"Switch ON"; else this->switchStatusLabel->Text = L"Switch OFF";

System::Boolean writeToTheOutputBuffer(System::Int16 byteNumber, System::Byte value)


Este mtodo te permite escribir bytes en el buffer de salida para ser enviados cuando el siguiente mtodo de envo de comandos sea llamado. Tu simplemente proporcionas el numero de byte (2-64) del byte que quieres configurar (los bytes 0 y 1 estn reservados para comunicacin) y el valor del byte. El mtodo devuelve verdadero si es exitoso y falso si no tiene xito.

System::Byte readFromTheInputBuffer(System::Int16 byteNumber)


Este mtodo te permite leer bytes desde el buffer de entrada (datos que son devueltos despus de que un mtodo sendUsbCommandWriteRead() es llamado). Simplemente especifica el nmero de byte en el cual ests interesado (2-64), y el mtodo devuelve el valor.

System::Void detachUsbDevice(System::Void)
Este mtodo remueve el dispositivo USB de tu cdigo y limpia cualquier identificador de archivo, amenazas, etc. dejando la clase en el estado que posea cuando fue construida. Esto es til si deseas desacoplar el dispositivo por alguna razn. Nota: como esta clase est en user-space la misma no desacopla el dispositivo del anfitrin, tan solo de tu aplicacin.

Archivos que se deben incluir necesariamente


Para usar esta clase se tiene que incluir las cuatro libreras requeridas en tu archivo stdafx.h. Debera quedar similar al que se muestra a continuacin:
// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently #pragma once

// TODO: #include #include #include

reference additional headers your program requires here <Windows.h> <setupapi.h> <Dbt.h>

Estado y limitaciones
Esta clase es relativamente nueva y no se ha probado. Si la usas y encuentran algo incorrecto o que pueda ser hecho de mejor manera por favor djenme saber, me encantara or de ustedes. La principal limitante de esta clase es que solo puede manejar un dispositivo a la vez, es decir, si tienes 2 o ms dispositivos con el mismo VID y PID esta simplemente elegir el primero que encuentre. Espero remover esta limitante en un futuro prximo.

Informacin adicional acerca de la clase


Si les gustara saber ms acerca de los trabajos de esta clase por favor sintase con todo el derecho de mirar directamente en el cdigo fuente. Invert mucho tiempo haciendo este cdigo lo ms claro posible as como incluyendo muchos comentarios acerca de cmo funciona y lo que est pasando. Cdigo de ejemplo A continuacin encontraran una aplicacin de Windows de ejemplo con el cdigo clase incluido. Este cdigo est diseado para trabajar con mi simple dispositivo genrico HID del PIC18F el cual pueden encontrar en esta pgina.

Est diseado para usar el mismo firmware del PIC como el proyecto original. Obviamente este es dispositivo bastante simple, sin embargo la clase debera permitirte construir dispositivos mucho ms complejos sin tener que preocuparte acerca de los detalles de bajo nivel pertenecientes a la programacin de USB HID en Windows. Este cdigo compilar en Visual C++ 2008 para ambas, Visual Studio 2008 (versin gratuita) y la versin profesional. Para compilar carga el archivo del proyecto y selecciona compilar dentro de Visual Studio. Para usar la clase en tu propio cdigo simplemente hagan su propio cdigo y cpienlo sobre el archivo usbHidCommunication.h en su directorio de proyecto.

Estructura de Software Libre para dispositivos genricos USB HID basados en el PIC18F y Windows
Contenidos

1 Introduction 2 Version 2_0_0_0 3 Reference Hardware o 3.1 Circuit Schematic o 3.2 Breadboard Layout o 3.3 Self-Powered USB Devices 4 Reference Firmware 5 Reference Application 6 The USB Generic HID C# Class Library o 6.1 Using the class-library 6.1.1 findTargetDevice() 6.1.2 handleDeviceNotificationMessages() 6.1.3 onUsbEvent() 6.1.4 readMultipleReportsFromDevice() 6.1.5 readSingleReportFromDevice() 6.1.6 registerForDeviceNotifications() 6.1.7 writeRawReportToDevice() 6.1.8 isDeviceAttached 7 Conclusions 8 Files for download 9 Example Application - USB LCD Screen Device

10 See also Introduccin

Si has incursionado con micro controladores PIC18F y con estndar USB HID genrico antes (tal vez has intentado al menos mi construccin de un proyecto de dispositivo USB con PIC18F) entonces habrs notado que hay mucha complejidad en el soporte USB, tanto en el lado del PIC18F como por el lado del anfitrin Windows. Yendo ms all de lo bsico como: leer un Smith y hacer titilar un LED (por cierto cuantos proyectos has construido para hacer titilar LEDs), es realmente una extenuante tarea con una curva de aprendizaje escarpada. Para facilitar las cosas al aficionado que desea ahondar en proyectos ms emocionantes, he desarrollado una estructura para producir dispositivos USB que cubren tanto; el lado de desarrollo de aplicaciones del anfitrin Windows, y la estructura misma del PIC18F. La estructura consiste en una librera de clases en Visual Studio C# (que maneja todo el problema de lidiar con los SDKs especficos de Windows y los requerimientos del sistema operativo), una aplicacin de referencia de Windows (la cual indica cmo usar la librera de clases y acta como fronnt-end de prueba para la librera), un simple diseo de hardware USB de referencia y (al final pero no menos importante) un firmware para PIC18F45550 que se comunica con la librera de clases. En esencia esto significa que tu puedes desarrollar rpidamente un dispositivo USB y probarlo junto con la aplicacin anfitriona de Windows con un mnimo de conocimiento de protocolo de USB HID genrico. La librera de clases te da una interfaz muy simple hacia el dispositivo USB desde C# y el firmware sirve como ejemplo de cmo crear el software especifico necesario en el PIC para el diseo de tu dispositivo.

La estructura incluye la habilidad de pasar comandos y respuestas desde y hacia el dispositivo USB as como transferencia en masa bidireccional de datos, permitindote construir aplicaciones ms complejas de captura de datos que requieren que ms informacin sea pasada rpidamente desde el anfitrin al dispositivo y viceversa. En este artculo yo me detendr en cada elemento de la estructura y mostrar como pueden usarlo para desarrollar sus propios dispositivos USB creativos. Para los impacientes, aqu les va un rpido video de YouTube de la estructura en accin. El ejemplo del operador (driver) de LCD mostrado en el video puede ser descargado en el siguiente vnculo:

Versin 2_0_0_0
Versin 2 de la librera USB y el firmware no est disponible (2010-12-03). He hecho algunas mejoras a la librera as como el arreglo de algunos bichos (bugs). Aqu esta una lista de las mejoras y cambios: Firmware o Aad la habilidad de depuracin en secuencia desde el firmware hasta el anfitrin para permitir una depuracin fcil de firmwares complejos. o Mov las direcciones de mapeo de memoria a memorymap.h para permitir un acoplamiento de puertos a dispositivos diferentes al PIC18F2550 y PIC18F4550 o Aad directrices que controlan la compilacin del firmware dependiendo de si es usado un 2550 o un 4550; ahora puedes compilar para cualquier chip sin alterar el cdigo del firmware o Las definiciones de PID y VID fueron movidas a HardwareProfile.h para hacer ms simple de entender el cmo cambiar identificadores de dispositivos o Los productos, fabricantes y nmeros de serie fueron movidos a HardwareProfile.h para que el cambio de los mismos sea ms fcil o El firmware de referencia automticamente remapea los LEDs en el hardware de referencia desde el PUERTO D al PUERTO B cuando se est usando un PIC18F2550 o Limpieza (enceramiento) del cdigo general Aplicacin de referencia del anfitrin o Aad una ventana de depuracin demostrando como usar la nueva funcin de secuencia de registro en el firmware o Arregle un problema de localizacin, donde el desacoplamiento del dispositivo no era detectado en ciertas localidades o Limpieza (enceramiento) del cdigo general

Por favor asegrese de especificar que versin de librera de USB est usando cuando pregunta por ayuda en los foros

Hardware de referencia

El hardware de referencia es extremadamente simple y puede ser construido en una protoboard si se necesita. Yo puse los pines de salida de del hardware idnticos al tablero del PIC DEM FS USB disponible de Microchip para permitirle comprar un tablero de referencia (si es que se desea!) tambin puedes usar mi clon de la placa de Microchip el tablero de desarrollo de PIC USB. Si no tienes tiempo/dinero/inters para hacer un tablero (placa) de referencia aqu est un circuito de esquema del hardware mnimo requerido para el tablero de referencia:

Esquema del circuito

Diseo de la protoboard La siguiente figura muestra el hardware de referencia construido en una protoboard experimental. Mira que puedes usar el PIC18F4550 (si no tienes un 18F4550 a la mano) He puesto algunas notas en el cdigo fuente del firmware explicando lo que se necesita cambiar.

El hardware de referencia provee 4 LED's que son usados para mostrar el estado del dispositivo USB mientras este procesa todas las peticiones que pueden ser enviadas hacia este desde la aplicacin anfitriona en Windows. Los 4 LEDs (de izquierda a derecha) significan: 1. 2. 3. 4. Dispositivo encendido dispositivo listo USB enumerado dispositivo listo para comunicarse Indicador de xito (titila mientras los datos son procesados correctamente) Indicador de fallo (titila si un comando no fue correctamente procesado)

La Protoboard provee todo lo que necesitas para aadir lo necesario a tus dispositivos y circuitera, incluso puedes retirar los LEDs, la nica parte que el firmware realmente requiere es el puerto USB y su hardware asociado. Dispositivos autoalimentados El hardware de referencia mostrado anteriormente es para un dispositivo USB alimentado por el bus (toma su energa directamente de la computadora anfitriona) Este requiere un nmero mnimo de partes y da un circuito bastante simple, sin embargo el consumo de corriente del dispositivo est limitada a 100mA. Si deseas construir dispositivos que consuman ms energa (para manejar ms hardware como relays, motores, arreglos de LEDs, etc.) Necesitaras hacer autoalimentado al dispositivo. El siguiente esquemtico muestra una versin simple autoalimentada de la protoboard de referencia. Un regulador LM7805 5V es aadido para regular la entrada de CD y un diodo 1N5817 es usado para proteccin de la polaridad ( esto ayuda a proteger tu PIC y PC cuando se est experimentando) La entrada de 5V desde el bus USB es dirigida hacia RA0 en el PIC18F4550 el cual permite al firmware detectar cuando el cable USB est conectado o

desconectado. Puedes omitir esta funcin de censado de voltaje, sin embargo esto significa que tu firmware necesitar censar constantemente la pila USB para saber si un cable USB est conectado.

Firmware de Referencia
El firmware de referencia est basado la versin 2.6 de la pila USB de Microchip. Las modificaciones ms significativas que hice estn contenidas mayormente en el archivo main.c. Aparte de eso he llevado la pila para el compilador HiTechPIC18F (la cual yo creo que es superior a la del C18 pero esto probablemente es cuestin de gustos) y la especialic particularmente para soportar el protocolo HID USB Genrico. En el firmware encontrars (localizado en el archivo fuente main.c) una implementacin para algunos comandos que se reflejan en la aplicacin de referencia: 0x80: Escritura de paquete nico al dispositivo - Este comando recibe un comando y un paquete nicos desde el anfitrin (que es de 64 bytes) y luego los nmeros del 1 al 63 en los bytes restantes. Esto permite al firmware confirmar que todo el paquete ha sido recibido correctamente. 0x81: Escirtura/lectura de paquete nico Esta es similar a la 0x80, sin embargo el firmware genera un paquete de retorno (lleno de datos similares) y lo pasa de vuelta al anfitrin. 0x82: Escritura de paquete nico, lectura de 128 paquetes este comando recibe un paquete nico desde el anfitrin y, a cambio, enva de regreso 128 paquetes de 64 bytes que contienen datos. Este comando simula los requerimientos de trasferencia de datos en forma masiva desde el dispositivo hacia el anfitrin (para aplicaciones como captura de datos, etc.)

0x83: Escritura de 128 paquetes, lectura de paquete nico Este comando recibe un comando del administrador seguido de 128 paquetes de 64 bytes que contienen datos. Esto es bsicamente el opuesto de 0x82 donde el anfitrin est transfiriendo datos en forma masiva hacia el dispositivo USB (usado en aplicaciones como driver para display, etc.) 0x84: Escritura de paquete nico, tiempo de espera en la lectura Este comando es un poco diferente de los otros. Es usado para simular un escenario de falla en el lado del anfitrin donde un comando es enviado y el anfitrin espera una contestacin, pero el firmware no contesta (simulando un bicho bug en el firmware) Este realmente no hace mucho en el lado del dispositivo PIC, pero es til para probar lo que hace la aplicacin en el administrador cuando dicho evento ocurre.

El software de referencia no solo provee un entorno de prueba para la librera de clase del anfitrin, sino que tambin sirve como ejemplo de cmo comunicarse de manera bidireccional con el anfitrin. Esto para comando simple y respuesta, as como para transferencia de datos en forma masiva. El firmware de referencia un software libre a base de GPL, entonces son libres de usarlo y adaptarlo a sus requerimientos. Tambin si tienen sugerencias para el mejoramiento me encantara saber de ustedes en el foro. Aplicacin de Referencia La aplicacin de referencia usa la librera de clases de C# para comunicarse con el firmware de referencia. Este provee una interfaz simple hacia los 5 comandos disponibles permitindote seleccionar que comando desearas enviar. La aplicacin tambin crea los comandos y datos para enviar a los dispositivos, as como tambin interpreta los datos y respuestas enviadas de regreso por el firmware para confirmar que todo est trabajando como debera. Aqu se puede ver la interfaz GUI desde la aplicacin de referencia ejecutndose en una computadora con Windows 7:

Las 5 pruebas corresponden a los 5 comandos provistos por el firmware. Cuando se hace clic en el botn de prueba el comando es enviado al firmware y a ambos: el firmware (a travs de los LEDs de xito y falla) y el anfitrin (proveyendo un mensaje test passed o test failed) provee retroalimentacin en la prueba de xito. Adems, la librera de clase C# provee events del dispositivo USB a la aplicacin dejndola saber cuando el dispositivo USB est acoplado o desacoplado al anfitrin. Esto se prueba conectando y desconectando el conector USB y al mismo tiempo se mira la barra de estado al fondo de la ventana. Si todo est bien se debera ver los mensajes device attached o device detached. Tambin, la aplicacin desabilita los botones de prueba cuando ningn dispositivo es encontrado.

La librera de clase subyacente HID USB genrico de C# provee una clase base en la cual se puede construir aplicaciones. La aplicacin de referencia define una clase especializada para su propio dispositivo USB la que asume todas las funciones accesibles de la clase base. La aplicacin entonces extiende la clase base para incluir sus propios mtodos para la comunicacin con el dispositivo. Simplemente pon, la clase especializada tiene que proveer una interfaz de los comandos que el dispositivo debe soportar (0x80, 0x81, etc.) para el envo en masa y recibe mtodos provistos por la clase. Esto te permite ser muy flexible en cmo te comunicas con el firmware ya que eres libre de definir tus propios comandos de cualquier manera que desees. Cada vez que se hagan cambios, arreglo de bichos (bugs), o modificaciones en la librera de clase HID USB genrico puedes usar el firmware de referencia y la aplicacin para probar y asegurar que la librera todava est funcionando correctamente, esto ahorra mucho tiempo despus o cuando aparecen imprevistos (como siempre pasa!) La librera de clases HID USB genrico de C# Hay dos vas a saber para acceder a la librera de clases: Cmo la uso? y Cmo trabaja?. Si ests interesado en el funcionamiento interno de la librera de clase sugiero cargarlo en Visual Studio y mirar el cdigo. He tratado de estructurarlo y comentarlo lo ms claro posible. La mayor parte de la complejidad es tomada, adaptada y (en algunos casos!) escrita desde cero. Por medio de hacer a la librera de clases especfica para asuntos de comunicaciones de HID genrico con micro controladores. Me las he arreglado para remover bastante de la complejidad del proceso de escribir verdaderos drivers genricos. Tambin hay mucha informacin incorporada acerca de depuracin. Si compilas la aplicacin de referencia en el modo de depuracin de Visual Studio, vers un registro completo de las actividades de la aplicacin (y su librera de clase) una vez que salgas de la aplicacin.

Usando la librera de clase


Una vez que has incluido la librera de clases en tu proyecto (por ejemplo para saber cmo hacer esto simplemente mira los archivos de proyecto de la aplicacin de referencia los cuales estn incluidos a continuacin), necesitaras aadir en algunas lneas del cdigo C# hacia la forma principal (main), para poder poner la librera de clase en funcionamiento. Primero subir este cdigo el cual necesita ir dentro del constructor de clase de la forma central usualmente llamada (Form1()):
public Form1() { InitializeComponent(); // Create the USB reference device object (passing VID and PID) theReferenceUsbDevice 0x0045); // Register for device change notifications = new usbReferenceDevice(0x04D8,

theReferenceUsbDevice.registerForDeviceNotifications(this.Handle); // Add a listener for usb events theReferenceUsbDevice.usbEvent += new usbReferenceDevice.usbEventsHandler(usbEvent_receiver); // Perform an initial search for the target device theReferenceUsbDevice.findTargetDevice(); }

Este cdigo hace 4 cosas: 1. Primeramente inicia la clase usbReferenceDevice (la cual es una forma especializada de las libreras base de clase) y pasa el VID y PID del dispositivo blanco 2. A continuacin el controlador de la ventana de formas a una clase que registra la ventana para recibir eventos desde Windows acerca de las notificaciones del dispositivo 3. Aade una funcin listener a la forma, esta recbelos eventos generados por el dispositivo USB (acoplar y desacoplar dispositivos) 4. Finalmente ejecuta el primer intento para encontrar el dispositivo USB que se tiene por objetivo (el dispositivo puede estar ya conectado, por ende no se enviarn notificaciones, a pesar de que el dispositivo est ah Lo siguiente son tres artculos ms requeridos por la clase de biblioteca:
// Create an instance of the USB performance meter private usbReferenceDevice theReferenceUsbDevice; // Callback method for WndProc protected override void WndProc(ref Message m) { // Pass the message to our message handler theReferenceUsbDevice.handleDeviceNotificationMessages(m); // Pass the message on to the base WndProc base.WndProc(ref m); } // Listener for USB events private void usbEvent_receiver(object o, EventArgs e) { // Check the status of the USB device and update the form accordingly if (theReferenceUsbDevice.isDeviceAttached) { // Device is attached, do tasks here } else { // Device is detached, do tasks here } }

El primer comando genera una instancia de la clase de dispositivo USB que es usada por el primer cdigo de ejemplo para poner la clase en funcionamiento. El segundo mtodo (o procedimiento) intercepta los eventos de notificacin de Windows y los pasa a la librera de clase para su procesamiento. El tercer mtodo es el detector de eventos USB que es llamado por la clase cuando el dispositivo USB est acoplado o desacoplado y permite a la aplicacin realizar tareas tales como actualizar la barra de estado y activando/desactivando los controles de la forma (este mtodo provocado por evento, evita los mecanismos habituales de sondeo que usan la mayora de aplicaciones de forma para monitorear el estado del USB, y mucho ms eficiente) Una vez que esto se ha hecho eres libre de aadir cualquier ventana, botn y control que tu aplicacin necesite. La integracin primaria de la librera de clases es deliberadamente lo ms simple posible. Sin embargo, para comunicarte con tu dispositivo USB aun se deben hacer algo ms. Para representar tu propio dispositivo USB se debe generar una clase que represente al dispositivo. Esto es tan simple como aadir una clase al proyecto. La clase debe heredar la librera de clase base y tambin definir algunos mtodos para permitir a tu aplicacin comunicarse con el dispositivo USB. No te preocupes si esto suena complicado, porque realmente no lo es, y la aplicacin de referencia provee todo el cdigo de ejemplo que se necesita en el archivo fuente usbReferenceDevice.cs. La primera parte de esta clase define la clase misma y crea su propio constructor para permitirte aadir cualquier inicializacin que tu dispositivo pueda necesitar. El cdigo se ve de esta manera:
using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Diagnostics;

namespace USB_Generic_HID_reference_application { using usbGenericHidCommunications; class usbReferenceDevice : usbGenericHidCommunication { // Class constructor - place any initialisation here public usbReferenceDevice(int vid, int pid) : base(vid, pid) { }

En el cdigo ejemplo se puede ver la forma correcta de definir la clase (usando la librera de clases como la base) y, como pasar el VID y PID desde tu constructor hasta la librera de clases. Una vez que esto est hecho se puede incluir tranquilamente cualquier mtodo que el dispositivo requiera. Primariamente, estos sern mtodos que comunican hacia y desde tu dispositivo. En la aplicacin de referencia tienes cinco ejemplos de mtodos los cuales usan los cuatro tipos diferentes de comandos soportados por el firmware de referencia (as como el quinto comando el cul es netamente para demostrar cmo reacciona la clase a bichos del firmware) Aqu est un mtodo de ejemplo que enva un comando al dispositivo USB:

public bool test1() { // Test 1 - Send a single write packet to the USB device // Declare our output buffer Byte[] outputBuffer = new Byte[65]; // Byte 0 must be set to 0 outputBuffer[0] = 0; // Byte 1 must be set to our command outputBuffer[1] = 0x80; // Fill the rest of the buffer with known data int bufferPointer; Byte data = 0; for (bufferPointer = 2; bufferPointer bufferPointer++) { // We send the numbers 0 to 63 to the device outputBuffer[bufferPointer] = data; data++; } // Perform the write command bool success; success = writeRawReportToDevice(outputBuffer); // We can't tell if the device received the data ok, we are // only indicating that the write was error free. return success; }

<

65;

Como pueden ver desde la clase es muy simple, la librera de clases se ocupa de todos los detalles. T simplemente ensamblas el comando y los que deseas enviar y haces la llamada para escribir el mtodo, despus todo lo que resta es probar el resultado para asegurar que fue exitoso. Hay pocos mtodos pblicos que la clase provee, pero aqu est una lista de ellos y para qu son usados: findTargetDevice() Este mtodo busca el dispositivo USB basado en el VID y PID que fueron proporcionados cuando el objeto fue creado. handleDeviceNotificationMessages() Este mtodo se ocupa de interpretar las notificaciones recibidas de la aplicacin y de ver si estas se relacionan con el dispositivo USB. Si lo hacen, entonces el mtodo empieza a buscar el dispositivo USB, o lo registra como desacoplado dependiendo de los mensajes recibidos. onUsbEvent() Este mtodo es parte del mecanismo de evento usado por la librera de clases para informar a tu aplicacin si el dispositivo USB est siendo acoplado o desacoplado.

readMultipleReportsFromDevice() Este metodo es usado para transferencias de datos en masa entrantes, ver el archivo usbReferenceDevice.cs (en la aplicacin de referencia) para detalles de cmo es su uso. readSingleReportFromDevice() Este mtodo es usado para obtener un paquete nico de reporte desde el dispositivo USB. Una vez ms usbReference.cs es el mejor lugar para encontrar un ejemplo de cmo se usa este. registerForDeviceNotifications() Este mtodo es usado para indicar a Windows como enviar notificaciones del dispositivo a tu aplicacin (las cuales son despus recogidas por handleDeviceNotificationMessages() para su procesamiento) writeRawReportToDevice() Este metodo es usado para enviar comandos y datos al dispositivo USB. Una vez ms usbReference.cs es el mejor lugar para encontrar un ejemplo de cmo se usa este. isDeviceAttached Esta propiedad se puede probar para ver si el dispositivo USB est presente. Tiene un valor verdadero si el dispositivo est conectado y falso si el dispositivo est desconectado. La librera de clases C# y la aplicacin de referencia son las dos publicada bajo el GPL por ende las puedes usar y adaptar a tus necesidades libremente. No pretendo ser un experto en C#(!) as que si tienen algunas sugerencias para mejoras, o reporte de errores, acrquense al foro y djenme saber!

Conclusiones
Con un entorno completo de referencia y una serie de pruebas tienes todo lo que necesitas para crear tus propios proyectos USB avanzados. No hay lmite en el hardware que se puede interfazar a tu PC usando USB y micro controladores PIC. Inclusive si no eres un fantico de los PIC, la librera de clases es genrica para todos los micros controladores que soportan el protocolo de comunicaciones Genrico HID. Como en todas las experiencias de aprendizaje, empiecen con algo simple. Y, lenta y gradualmente profundicen en la manera como la librera de clases opera y como las aplicaciones de Windows son creadas en C#. Existe una infinidad de posibilidades para su prximo truco! Actualmente la librera de clase no soporta ms de un dispositivo USB con el mismo PID y VID haciendo el proceso de seleccin de dispositivos ms difcil (tanto para la librera como para la aplicacin) He incluido algunos mtodos de enumeracin de dispositivos muy fciles de entender, en la clase; as que aadir soporte debe ser fcil. Espero pronto apoyar esto en una versin actualizada de la librera.

Construyendo un dispositivo USB para PIC18F

Contenidos

1 Actualizacin 2 Introduccin 3 Hardware 4 Firmware o 4.1 Enumeracin de dispositivos o 4.2 Comunicacin con el anfitrin o 4.3 Comprensin del cdigo fuente del firmware o 4.4 Conexin del dispositivo 5 Software anfitrin 6 Que sigue despus? 7 Archivos para descargar

Actualizacin
Recientemente publique una clase de comunicacin para USB HID genrico en software libre C++. Por favor revisen acerca de ms informacin detallada acerca de la programacin de aplicaciones de Windows para HID genrico y una aplicacin de Windows actualizada para este proyecto Simon (2010-03-30) Hay ahora una versin de libreras en C# usadas para la comunicacin manejada por Windows. Se la puede leer aqu here - Simon (2010-05-05).

Introduccin
Recibo muchos correos cada mes, preguntando Cmo crear dispositivos USB usando el micro controlador PIC18F?Despus de haber visto proyectos como mi Atari Joystick USB Adaptor adaptador USB para Joystick de Atari y C64 VICE Front-End, parece existir una demanda de mayor informacin acerca de cmo hackear uno propio. En este artculo les mostrar como implementar en una protoboard un simple dispositivo USB HID genrico, creando el firmware y finalmente creando la interfaz de Windows para el dispositivo. La que te ayudar a controlar un LED desde la PC y leer el estado de un pulsador del dispositivo. Desde la llegada de Windows 7 se necesita una costosa certificacin de validacin de Windows para crear controladores USB propios (si esto la mayora de usuarios ni siquiera podrn instalar tu software) Usar los controladores embebidos para dispositivos HID genricos proveen un mtodo simple de crear dispositivos compatibles con Windows y Linux y tambin realiza la creacin del firmware y software de una manera mucho ms simple. Debido a que el estndar HID genrico no requiere controladores propios, no necesitaras obtener un certificado para tu controlador, tambin Windows y Linux tienen libreras incorporadas para ayudarte a comunicarte.

Para este artculo nos vamos a regir a un dispositivo USB bastante bsico. El dispositivo te permitir controlar un LED desde Windows y tambin ver el estado de un pulsador en el dispositivo. Este ser hecho de una manera simple usando los principios bsicos de la comunicacin USB de 2 vas, permitindote progresar hacia proyectos ms complejos. Para mantener la dificultad y los costos lo ms bajos posible me concentrare en la construccin del hardware en la protoboard usando pocos componentes, el firmware del PIC18F4550 se basar en el compilador C, MPLAB y Hitech (disponible de forma gratuita) El software ser creado usando la versin express de Microsoft Visual C++ 2008 (que tambin se pude descargar de forma gratuita) Sin bien este artculo se basa en el micro controlador PIC18F4550, este se puede sustituir fcilmente por el PIC18F2550 que es ms pequeo y barato. Y, cuyo cdigo es compatible con el 4550. Si quieres seguir con este artculo te sugiero que vayas hacia el final de la pgina y descargues el software que lo acompaa. Tambin asegrate de que tienes instalados: MPLAB, Hi Tech C para el PIC18F4550 y Microsoft Visual Studio 2008 express. Noten que todas las fotos del programa anfitrin fueron tomadas de un maquina con Windows 7, si necesitan encontrar las misma cosas o similares en una versin ms antigua de Windows por favor vayan a Google donde encontraran bastante informacin acerca de la ubicacin de cada tem en su mquina Windows Me.

Hardware
Para empezar necesitamos construir un dispositivo USB con el cual comunicarnos. El dispositivo incluye un conector ICSP (In Circuit Serial Programing) y una conexin USB tipo B. adems hay un solo LED y un solo pulsador para representar los dispositivos de entrada y salida.

Este circuito es muy simple (si no entiendes este nivel de electrnica de micro controladores te sugiero que construyas alguno de los muchos tutoriales de prender LEDs y pulsadores, disponibles en la web antes de intentar realizar esto) El PIC 18F4550 ser alimentado por el bus; esto significa que el dispositivo tomara su energa del USB anfitrin (tu PC) por ende no se requiere regulacin de voltaje. El capacitor de 470nF (C3) es necesario para que el PIC opere la circuitera USB interna (esta ayuda a regular los voltajes USB requeridos por la interfaz USB incorporada en el PIC) El conector ICSP permite conectar un programador PIC, yo sugiero usar el econmico programador PICkit2, claro que cualquier otro programador compatible con ICSP debera trabajar bien tambin. El oscilador de 20MHz es requerido para aplicaciones USB. Este le permite al PIC usar PLL, el mismo que eleva la velocidad del reloj hasta los 48MHz necesarios para comunicacin USB. (Un lector [Jason] me envo un email indicndome que un cristal de 20MHz no es estrictamente necesario cuando se usa el USB incorporado de los PIC18F, que es muy exacto. Puedes usar varios cristales provistos en el mercado, siempre y cuando cambies la configuracin de fusibles del PIC. Revisa la hoja de datos del PIC18F4550 en las pginas 29-30 para ms informacin gracias Jason!)

La siguiente fotografa muestra el circuito construido en una protoboard para aficionados. He aadido algunas etiquetas a la fotografa para indicar el lugar de cada componente. Por favor tengan en cuenta que, para programar estaremos usando la tensin de 5V que entrega el programador. Como este es un dispositivo USB alimentado por el bus las lneas de 5V tambin estarn conectadas al conector USB. Esto significa que si el programador y el cable USB estn conectados al mismo tiempo existe solo el potencial del programador para suministrar 5V al anfitrin USB, lo cual no es recomendable segn los estndares USB. Personalmente no he visto un caso donde esto importe (para propsitos de experimentacin), pero si deseas, puedes aadir un diodo de barrera al conector USB para prevenir esto. En mis proyectos generalmente uso un diodo de barrera schottky 1N5817.

Si no tienes un conector USB para tu protoboard puedes simplemente hacer uno usando una placa perforada (como mi adaptador simple en la fotografa de arriba), o tambin puedes cortar una punta de un cable USB, pelar los cables y ponerlos directamente en la protoboard. Yo recomendara tomarse el tiempo para hacer un adaptador, este reduce el riesgo de que se suelten algunos cables cuando se conecta o desconecta el cable USB de la computadora.

(Un lector [Brandon] me envi un email preguntando acerca de los valores de las resistencias y capacitores en este proyecto resistencias de de vatio indicadas para cualquier cosa mayor a 5 voltios son perfectas para este proyecto (sin embargo resistencia ms altas deberan trabajar bien tambin) Tambin la ubicacin de los pines del PIC18F4550 en el esquemtico es lgico (a diferencia de los diagramas fsicos en la hoja de datos) sin embargo la numeracin de los pines es la misma en los dos. Entonces, siempre y cuando sigas la numeracin no deberas tener problemas Gracias Brandon!)

Si estas inseguro del cableado para el cable USB la siguiente figura muestra la salida de los pines para un scalo USB (hembra tipo B) y el cdigo de colores de los cables estndar:

Una vez que has construido el circuito de arriba asegrate de revisar que no haya cortos en las conexiones de alimentacin positiva y negativa antes de conectar el dispositivo en tu PC. No querrs daar tu computadora. Siempre asegrate de revisar todo antes de conectar el cable USB o tu programador para evitar gastos de reparacin altos!

Firmware
Para conectar tu dispositivo USB a la computadora primero necesitaras escribir y compilar un firmware para el PIC18F4550. Microchip (el fabricante del micro controlador PIC) provee una pila USB gratuita para descargar especial para este propsito. Para hacer las cosas ms fciles he escrito un firmware simple para manejar el dispositivo, puedes usar esto para empezar y tambin como una base para entender cmo opera el firmware. Una vez que has logrado hacer funcionar tu primer dispositivo encontraras ms fcil entender cmo puedes adaptarlo para aplicaciones ms complejas. Enumeracin de Dispositivos Lo primero es la enumeracin de dispositivos USB - esta caracterstica que suena algo compleja es en realidad la comunicacin inicial con el anfitrin USB (el ordenador) cuando el dispositivo le dice al anfitrin que es y como desea comunicarse. La comunicacin USB es realizada usando endpoints (directivas en los extremos), las que envan informacin, ya sea al anfitrin o al dispositivo. As como el dispositivo debe configurar los canales comunicacin, tambin debe pasar su propio nombre de dispositivo y otros dos datos importantes: VID Y PID. El VID es la identificacin del vendedor e identifica a los fabricantes del dispositivo. Para obtener tu propio VID necesitas pagar ms o menos mil dlares al cuerpo de normas USB. En este ejemplo usaremos el VID de microchip para minimizar costos. Si de verdad quieres producir y vender dispositivos, necesitars registrar un VID propio. El PID es la identificacin del producto. Juntos con el VID forman una identificacin nica para tu dispositivo. Cuando tu dispositivo enumere primero a Windows guardar la combinacin VIP y PID para este dispositivo; esto se cumple incluso si usas un manejador genrico como el HID ya que reduce el tiempo que Windows necesita para alistar el dispositivo. Esto es importante, ya que si t decides cambiar la informacin de enumeracin de tu dispositivo (aadir endpoints, etc.), tambin necesitaras cambiar por lo menos el PID antes de reconectar el dispositivo. Si no haces esto recibirs errores de Device not started incluso si tu cdigo es

perfecto (por experiencia he notado que Linux no es tan quisquilloso y no tiende a crear problemas si conservas la misma combinacin PID/VID)

Comunicacin con el anfitrin


La segunda tarea importante que efecta el firmware es la comunicacin en s entre el anfitrin y el dispositivo. Cada comunicacin es identificada por un comando. Cuando usas el estndar genrico HID el comando le dice al anfitrin y al dispositivo como interpretar la informacin, que es pasada con el comando. Esta informacin podra ser cualquier cosa (no lo llaman genrico por nada!) y es as como se puede lograr una gran flexibilidad en las tareas que tu dispositivo desempee. Una vez que tu dispositivo est enumerado el anfitrin sondear al dispositivo eventualmente, esto siempre es iniciado por el anfitrin y no por el dispositivo (sin embargo habrn excepciones despus cuando te adentres ms en los protocolos de comunicacin) En cada sondeo el anfitrin puede enviar un comando y datos al dispositivo, as como tambin puede recibir un comando y datos del dispositivo. La parte principal del firmware que debes buscar es la seccin que se ocupa con las solicitudes de sondeo del anfitrin u realiza las acciones necesarias para hacer trabajar al dispositivo.

Entendiendo el cdigo fuente del firmware


En el archivo zip del dispositivo HID genrico del PIC18F incluido con este artculo encontrars un firmware completo y listo para usar para el PIC18F4550. Simplemente descomprime el archivo en el directorio de tu proyecto favorito de MPLAB y despus usa MPLAB para abrir el proyecto. He separado los archivos de cdigo fuente y archivos de encabezado en cdigo que deberas mirar y, a continuacin, las partes ms genricas de la pila de Microchip (guardadas en el navegador del proyecto bajo subdirecciones en la pila USB) Los archivos en los directorios de la pila USB son interesantes, pero para proseguir rpidamente no deberas preocuparte por adentrarte tanto en el cdigo hasta que te familiarices con los niveles avanzados. Ahora que los VIP/PID y el resto de informacin de enumeracin esta lista deberas empezar realizando una compilacin de todo el proyecto, y despus descarga el firmware resultante a tu PIC18F. Por supuesto que necesitaras un entorno de compilacin nimio para que esto trabaje, aunque hay muchsimas fuentes va Google si estas teniendo problemas con tu entorno. Intenta algunos ejemplos simples para asegurarte de que todo est bien antes de recargar el proyecto e intentarlo de nuevo. El firmware provee 3 comandos: 0x80 Intercambia el estado del LED 0x81 Lee el estado del pulsador 0x82 Lee el estado de LED

El cdigo que ejecuta estos comandos est localizado en el archivo fuente main.c en la funcin ProcessIO(). Esta funcin es responsable de determinar el comando requerido y despus enviar y recibir datos segn corresponda. Esto es muy sencillo ya que la pila USB se ocupa de toda la complejidad subyacente; dale un vistazo al cdigo fuente y te dars cuenta de lo simple

que es. La nica revisin extra realizada por esta funcin es para ver si el dispositivo esta en estado configurado; esto significa que el dispositivo est conectado al anfitrin y la enumeracin ha sido exitosa. La funcin principal simplemente llama a la pila USB para realizar cualquier tarea de bajo nivel del dispositivo y luego la funcin ProcessIO una y otra vez. Es posible hacer esto usando interrupciones en lugar de un lazo, sin embargo en este firmware lo he conservado lo ms simple posible. Para entender un poco ms acerca del proceso de enumeracin revisa el archivo usb_descriptors.c que contiene la informacin que pasada al anfitrin cuando el dispositivo es conectado por primera vez. En la fuente encontraras la informacin VID y PID para este dispositivo as como tambin una serie de descriptores de configuracin que explican al anfitrin que tipo de interfaces tiene el dispositivo y las capacidades de las mismas. Los endpoints son conectores para los conductos explicados anteriormente. Hay tambin algunos strings que describen al fabricante y al producto tesxtualmente. Windows usualmente usa estos strings cuando nombra dispositivos USB. Entender el proceso de enumeracin y los formatos del descriptor es algo complejo y est cubierto por las varias especificaciones USB as como tambin en un gran libro de Jan Axelson llamado 'USB Complete - Everything you need to develop custom USB peripherals' (ISBN 9781931448086). Si ests disfrutando este artculo y quieres entrar ms de lleno en el tema USB, recomiendo mucho obtener una copia de este libro que realmente me ayudo cuando yo estaba aprendiendo. Ms all de todo el firmware es bastante simple, todo lo que necesitas para comenzar a comunicarte dese y hacia el anfitrin est incluido. Obviamente puedes hacer esto tan complicado como gustes, pero para los propsitos de este artculo (encaminarte en el asunto USB) hay muchsimo con que experimentar.

Conectando el dispositivo
Una vez que has seguido los pasos indicados arriba y has descargado el firmware al tu dispositivo USB ests listo para conectarlo a tu PC. Ya que estamos usando los manejadores USB del HID genrico, no hay nada que instalar en la PC antes de conectar. Simplemente conecta el cable USB en tu dispositivo y luego conecta el otro extremo del cable USB den tu PC. Windows 7 debera detectar un nuevo dispositivo y mostrar el usual mensaje instalando dispositivo. Despus de unos pocos segundos deberas ver la ventana de dialogo:

Si despus navegas hacia tu men de inicio y seleccionas dispositivos e impresoras (si tienes una versin antigua de Windows necesitas buscar en algn otro lado del panel de control, pero el resultado es exactamente el mismo. Todas estas ilustraciones son de Windows 7) vers el dispositivo mostrado en la pantalla. Deberas ver algo as como la siguiente ventana:

Eso es todo, tu primer dispositivo USB est enumerado y listo para usarse! Ahora podemos movernos hacia el lado de la programacin del anfitrin y buscar cmo te puedes comunicar con tu dispositivo usando Microsoft Visual C++ 2008. Nota: El estado del LED por defecto es encendido, este debera encenderse un instante despus de conectar el dispositivo.

Software Anfitrin
Por favor note que: software actualizado para este proyecto est ahora disponible desde la pgina de software libre de la clase de Visual C++ para comunicacin con HID de USB genricos. El software del anfitrin es bastante sencillo y bsicamente consiste en 3 partes todas ellas contenidas en el archivo Form1.h: Monitorear el dispositivo USB para asegurar que est conectado (y, deshabilitar la entrada del usuario y la comunicacin del dispositivo si no lo est) Mostrar y procesar la forma de la interfaz del usuario para permitir al usuario interactuar con la aplicacin Comunicarse con el dispositivo USB y actualizar el estatus del dispositivo

He basado el software anfitrin en el software PnP del HID genrico de Microchip que viene con la pila USB. De cualquier forma, as como para el firmware, he tratado de hacerlo un poco ms fcil de entender. Para correr el software anfitrin descomprime el archivo zip de Visual Studio 2008 express y navega hacia el directorio Release, despus haz doble clic en el archivo WFF Generic HID Demo.exe. Entonces te debera aparecer el siguiente dialogo:

Para probar el dispositivo simplemente desconecta el cable ESB de tu PC. El dialogo debera cambiar a lo siguiente:

Ahora conecta el dispositivo USB, espera hasta que la ventana de dialogo se actualice (y muestre dispositivo conectado), ahora intenta hacer clic en el botn Toggle Led. Deberas ver entonces el LED en la protoboard prendindose y apangndose. Chvere no? Ahora asegrate que la etiqueta de estado del LED en la ventana coincida con el estado actual del LED. Este es el comando 0x82 del firmware en accin. Finalmente intenta presionar el pulsador en la protoboard, entonces debera cambiar el estado de la etiqueta push button en concordancia con el pulsador. Felicitaciones, eres ahora el orgulloso dueo de primer dispositivo USB hecho por ti mismo! He incluido el cdigo fuente completo en el archivo zip Visual Studio, por lo cual podrs ver el proyecto en Visual Studio para tener una mejor idea de su funcionamiento.

Y ahora qu?
La interfaz HID genrica USB es uno de los tantos tipos de interfaces disponibles en el estndar USB (aunque es posiblemente el ms til para los programadores de PIC) Usando exactamente las mismas tcnicas mostradas en este articulo puedes construir registros de datos, interfaces robticas, hardware de interfaz personalizada, etc, etc. La lista es interminable. Por fortuna este artculo te ha dado un vistazo de lo que es posible, para tus prximos pasos recomiendo que revises la pila USB de Microchip y algunos de los grandes libros de programacin de PIC, interfaces USB y programacin en Visual C++.

Por otra parte, si te gustara seguir experimentando pero quisieras un ambiente de referencia ms potente por favor revisa mi tablero de desarrollo PIC USB que te permite fcilmente experimentar con muchos ms diseos e interfaces USB.

Tablero de desarrollo PIC USB


De WFFwikki Ya que quera hacer algunos trabajos de desarrollo USB con la placa del PIC18F4550 y del PIC18F2550 (para proyectos como mi C64 VICE fornt-end y un adaptador para un joystick Atari) necesitaba una placa de referencia USB para desarrollar el software. Inicialmente llev la pila USB de Microchip al Hi-Tech C18 pro con la ayuda de Richard Stagg. En este artculo te mostrar como hacer tu propia placa de desarrollo USB que es compatible con la PICDEM USB FS de Microchip, pero construirla tu mismo es una opcin mucho ms barata. Con esta placa puedes compilar y cargar los ejemplos de la pila USB de Microchip directamente sin alterar el cdigo. T simplemente necesitas compilar los proyectos de la PICDEM FS USB que estn incluidos con los ejemplos de la pila.

Construccin de la placa PIC DEM FS USB


El esquemtico del circuito para la placa original est disponible en internet en la pgina de Microchip, las publicaron como parte de un manual de usuario para la placa. Yo us la

ubicacin de los pines para el micro controlador PIC, pero simplifique el diseo para hacer su construccin ms fcil y barata. Primeramente simplifique la regulacin de poder y remov el puerto serial fsico y el chip manejador serial en lnea. Aqu est el circuito esquemtico para la placa:

Como puedes ver en el diagrama todos los perifricos montados en la placa estn conectados a jumpers fsicos permitindoles ser deshabilitados. La razn para esto es que intent poner conectores SIL de 20 pines en cada lado del procesador permitindote conectar fcilmente la placa a la protoboard. Esto permite una creacin de prototipos USB ms rpida ( lo que hace a esta placa mucho ms til que la versin original de Microchip). Tambin se puede seleccionar entre la alimentacin desde el bus o alimentacin propia usando un jumper. La placa tiene una proteccin de polarizacin y un regulador de 5V. Tambin diodos de barrera protegen el puerto USB de un regreso de corriente no deseado (para hacerlo ms seguro para tu PC) Y como quera ser capaz de hacer la placa yo mismo necesit disear una baquelita de una sola cara que pueda ser fcilmente grabada. Yo tambin quise dejar espacio para unas patitas en la baquelita, para que se pueda usar sin una caja protectora (lo que hara difcil el acceso a los conectores SIL) Aqu est la ilustracin del diseo resultante de la baquelita:

Adicin de un puerto fsico RS232


Como una opcin conectable para esta placa tambin puedes construir un adaptador RS232 que simplemente se inserta en los conectores SIL del lado derecho del procesador. Ya que el UART Tx/Rx y las lneas de poder estn disponibles, la placa es un simple chip MAX 232 con 4 capacitores de 1uF y uno de 10uF. Aqu est una figura de la placa RS232 conectada a la mini placa PICDEM FS USB:

Como el circuito era tan simple no necesit hacer un esquemtico, pero aqu est la ilustracin del diseo resultante de la baquelita. (Los valores de los componentes estn marcados en el diseo)

Caso PC USB LCD


Contenidos Introduccin Hardware Firmware Software anfitrin de Windows Montado de la LCD Archivos para descargar

Introduccin Para la primera versin de mi framework en software libre para dispositivos HID USB genricos basados en el PIC18F y Windows, hice un ejemplo rpido de cmo usar la librera empleando una interfaz para una LCD. Ahora que he completado la segunda versin de la librera pienso que sera divertido mejorar el proyecto de la LCD a un modulo LCD independiente que cabra en el espacio de 5.25 pulgadas de la PC. Este proyecto explica cmo puede ser configurado el mdulo LCD con el firmware del PIC y el software anfitrin de Windows escrito en base a la librera HID USB genrica en C#. Para el cdigo anfitrin de ejemplo la utilizacin de la CPU y la memoria es mostrada en la LCD junto con el tiempo actual. El hardware es del mismo tamao que la misma LCD y puede ser montado directamente detrs del modulo LCD ATM1602B 2*16 para proveer una LCD compacta alimentada por el anfitrin, para muchas aplicaciones.

Hardware El diseo del hardware es extremadamente simple y puede ser construido usando el diseo de la baquelita provisto o en una placa perforada. El circuito consiste en un PIC18F2550 con un oscilador de 20MHz y los componentes requeridos para la pantalla LCD y el USB. La ilustracin del diseo de la baquelita necesaria para construir la placa de control esta disponible en los archivos zip al final de este articulo. Aqu est el esquemtico del circuito para la placa de control de la LCD:

La placa del circuito usa principalmente dispositivos de montaje superficial (claro que podras usar dispositivos DIL en el mismo espacio pero lo otro ahorra tiempo ya que no tienes que taladrar los orificios) Tambin la conexin USB es provista por un conector mini-USB de montaje superficial lo que hace a todo el modulo muy delgado y ahorra espacio. Solo se usa baquelita de una sola capa (y no hay puentes) Aqu les pongo una foto de la placa completada:

Como puedes ver en la foto, el display est conectado a la placa de control usando un alambre de una sola tira. Simplemente sueldas el cable a la placa de control y despus montas la LCD sobre ella usando tornillos (yo use algunas tuercas M6 como espaciadores) y luego sueldas los alambres a la LCD. El potencimetro para controlar el contraste est montado bajo la placa para permitir una fcil ajuste despus de que la LCD ha sido montada. El diodo puede ser soldado en la parte superior de la placa; decid ponerlo en la parte superior para que el modulo terminado se vea ms elegante. Firmware El firmware est basado en el software disponible de mi framework en software libre para dispositivos HID USB genricos basados en los PIC18F y Windows (Versin 2_0_0_0) e implementa varios comandos USB permitiendo al anfitrin limpiar la pantalla, mover el cursor, texto de salida y escritura de un bit puro en la LCD. El comando del bit puro permite al anfitrin enviar comandos personalizados a la LCD para que puedas implementar cosas como caracteres especiales de la LCD sin tener que alterar el firmware del PIC (si es que tienes algo de conocimiento acerca de la comunicacin que es posible con la ATM1602B) a parte de este no hay razn para que puedas usar el mismo firmware para comunicarte con versiones ms grandes como la pantalla de 4*16. Yo escog la de 2*16 porque puede encajar en uno solo de los espacios de la carcasa de la PC. Software anfitrin de Windows El software anfitrin est escrito usando Visual Studio C# 2010 y ha sido probado con Windows 7 (sin embargo debera trabajar bien con vista y XP)

El software anfitrin implementa los contadores de rendimiento y pasa las cadenas apropiadas de texto al firmware del PIC. El mecanismo es muy simple y debe ser extremadamente flexible si deseas implementar tu propia informacin en la pantalla. Adicional a esto, la versin 2 de la librera HID USB implementa una secuencia de registro de depuracin de ejemplo, desde el firmware USB hasta el anfitrin lo que es demostrado en el cdigo anfitrin. Aqu est una foto del GUI:

Como puedes ver en la foto estn ambos monitores de la aplicacin, el del uso de la CPU y uso de la memoria empleando los contadores de rendimiento incluidos en Windows. Adems hay un cuadro de texto que muestra en tiempo real la informacin del proceso de depuracin que viene desde el firmware del USB (que es extremadamente til para diseo y depuracin de firmware ms complejo) Montaje de la LCD Junto con el diseo de la baquelita y el esquemtico hay una plantilla para cortar la cubierta en el espacio estndar de 5,25 pulgadas de la carcasa de la PC y puedas instalarlo. Aqu hay una foto de la pantalla montada en mi PC: