2012-10-01 24 views
6

Estoy tratando de usar un Arduino Leonardo para la emulación de teclado ya que esa es una de sus características anunciadas. He estado jugando con Leonardo y escribí un boceto muy simple basado en el ejemplo de Blink.Emulación de teclado genérico usando Arduino Leonardo

// Pin 13 has an LED connected on most Arduino boards. 
int led = 13; 

// The setup routine runs once when you press reset: 
void setup() 
{ 
    // Initialize the digital pin as an output. 
    pinMode(led, OUTPUT); 
} 

// The loop routine runs over and over again forever: 
void loop() 
{ 
    delay(5000);    // Wait for five seconds 
    digitalWrite(led, HIGH); // Turn the LED on (HIGH is the voltage level) 
    delay(100);    // Wait for a secondA 
    digitalWrite(led, LOW); // Turn the LED off by making the voltage LOW 
    Keyboard.write('A');  // Write an A using keyboard emulator 
} 

Ahora, este ejemplo funciona muy bien en mi máquina con Windows XP. Se reconoce como un teclado genérico HID y escribirá una 'A' cada cinco segundos.

El entorno de destino está ejecutando DOS, por lo que yo sé que necesito que el Arduino Leonardo sea reconocido por el BIOS en esta máquina, que no lo es y no escribe la 'A' en DOS.

He estado haciendo modificaciones en el descriptor del dispositivo USB de Leonardo, tratando de hacer que coincida con un Dell L100 tanto como sea posible. Las modificaciones que he hecho no han ayudado, y sospecho que es porque el Leonardo es un dispositivo compuesto que expone la comunicación en serie, la emulación del teclado y la emulación del mouse en el mismo puerto USB. El código fuente de los descriptores USB/configuración está disponible para ser editado y se encuentra en:

  • Arduino_Installation \ hardware \ Arduino \ núcleos \ Arduino \ HID.cpp
  • Arduino_Installation \ hardware \ Arduino \ núcleos \ Arduino \ USBDesc.h
  • Arduino_Installation \ hardware \ Arduino \ núcleos \ Arduino \ USBCore.h
  • Arduino_Installation \ hardware \ Arduino \ núcleos \ Arduino \ USBCore.cpp

El siguiente es un vertedero de dispositivo USB Visor para el Leonardo:

[Port3] : USB Composite Device 

      ---===>Device Information<===--- 
English product name: "Arduino Leonardo" 

ConnectionStatus: 
Current Config Value:    0x01 -> Device Bus Speed: Full 
Device Address:     0x03 
Open Pipes:       4 

      ===>Endpoint Descriptor<=== 
bLength:       0x07 
bDescriptorType:     0x05 
bEndpointAddress:     0x81 -> Direction: IN - EndpointID: 1 
bmAttributes:      0x03 -> Interrupt Transfer Type 
wMaxPacketSize:     0x0010 = 0x10 bytes 
bInterval:       0x40 

      ===>Endpoint Descriptor<=== 
bLength:       0x07 
bDescriptorType:     0x05 
bEndpointAddress:     0x02 -> Direction: OUT - EndpointID: 2 
bmAttributes:      0x02 -> Bulk Transfer Type 
wMaxPacketSize:     0x0040 = 0x40 bytes 
bInterval:       0x00 

      ===>Endpoint Descriptor<=== 
bLength:       0x07 
bDescriptorType:     0x05 
bEndpointAddress:     0x83 -> Direction: IN - EndpointID: 3 
bmAttributes:      0x02 -> Bulk Transfer Type 
wMaxPacketSize:     0x0040 = 0x40 bytes 
bInterval:       0x00 

      ===>Endpoint Descriptor<=== 
bLength:       0x07 
bDescriptorType:     0x05 
bEndpointAddress:     0x84 -> Direction: IN - EndpointID: 4 
bmAttributes:      0x03 -> Interrupt Transfer Type 
wMaxPacketSize:     0x0040 = 0x40 bytes 
bInterval:       0x01 

      ===>Device Descriptor<=== 
bLength:       0x12 
bDescriptorType:     0x01 
bcdUSB:       0x0110 
bDeviceClass:      0x00 
*!*ERROR: device class should be Multi-interface Function 0xEF 
      When IAD descriptor is used 
bDeviceSubClass:     0x00 
*!*ERROR: device SubClass should be USB Common Sub Class 2 
      When IAD descriptor is used 
bDeviceProtocol:     0x00 
*!*ERROR: device Protocol should be USB IAD Protocol 1 
      When IAD descriptor is used 
bMaxPacketSize0:     0x40 = (64) Bytes 
idVendor:      0x2341 = Vendor ID not listed with USB.org as of 03-19-2008 
idProduct:      0x8036 
bcdDevice:      0x0100 
iManufacturer:      0x01 
    English (United States) "Arduino LLC" 
iProduct:       0x02 
    English (United States) "Arduino Leonardo" 
iSerialNumber:      0x00 
bNumConfigurations:    0x01 

      ===>Configuration Descriptor<=== 
bLength:       0x09 
bDescriptorType:     0x02 
wTotalLength:     0x0064 -> Validated 
bNumInterfaces:     0x03 
bConfigurationValue:    0x01 
iConfiguration:     0x00 
bmAttributes:      0x80 -> Bus Powered 
MaxPower:       0xFA = 500 mA 

      ===>IAD Descriptor<=== 
bLength:       0x08 
bDescriptorType:     0x0B 
bFirstInterface:     0x00 
bInterfaceCount:     0x02 
bFunctionClass:     0x02 -> This is Communications (CDC Control) USB Device Interface Class 
bFunctionSubClass:     0x01 
bFunctionProtocol:     0x01 
iFunction:       0x00 

      ===>Interface Descriptor<=== 
bLength:       0x09 
bDescriptorType:     0x04 
bInterfaceNumber:     0x00 
bAlternateSetting:     0x00 
bNumEndpoints:      0x01 
bInterfaceClass:     0x02 -> This is Communications (CDC Control) USB Device Interface Class 
bInterfaceSubClass:    0x01 
bInterfaceProtocol:    0x00 
CAUTION: This may be an invalid bInterfaceProtocol 
iInterface:      0x00 
    -> This is a Communications (CDC Control) USB Device Interface Class 

      ===>Descriptor Hex Dump<=== 
bLength:       0x05 
bDescriptorType:     0x24 
05 24 00 10 01 
    -> This is a Communications (CDC Control) USB Device Interface Class 

      ===>Descriptor Hex Dump<=== 
bLength:       0x05 
bDescriptorType:     0x24 
05 24 01 01 01 
    -> This is a Communications (CDC Control) USB Device Interface Class 

      ===>Descriptor Hex Dump<=== 
bLength:       0x04 
bDescriptorType:     0x24 
04 24 02 06 
    -> This is a Communications (CDC Control) USB Device Interface Class 

      ===>Descriptor Hex Dump<=== 
bLength:       0x05 
bDescriptorType:     0x24 
05 24 06 00 01 

      ===>Endpoint Descriptor<=== 
bLength:       0x07 
bDescriptorType:     0x05 
bEndpointAddress:     0x81 -> Direction: IN - EndpointID: 1 
bmAttributes:      0x03 -> Interrupt Transfer Type 
wMaxPacketSize:     0x0010 = 0x10 bytes 
bInterval:       0x40 

      ===>Interface Descriptor<=== 
bLength:       0x09 
bDescriptorType:     0x04 
bInterfaceNumber:     0x01 
bAlternateSetting:     0x00 
bNumEndpoints:      0x02 
bInterfaceClass:     0x0A -> This is a CDC Data USB Device Interface Class 
bInterfaceSubClass:    0x01 
bInterfaceProtocol:    0x00 
CAUTION: This may be an invalid bInterfaceProtocol 
iInterface:      0x00 

      ===>Endpoint Descriptor<=== 
bLength:       0x07 
bDescriptorType:     0x05 
bEndpointAddress:     0x02 -> Direction: OUT - EndpointID: 2 
bmAttributes:      0x02 -> Bulk Transfer Type 
wMaxPacketSize:     0x0040 = 0x40 bytes 
bInterval:       0x00 

      ===>Endpoint Descriptor<=== 
bLength:       0x07 
bDescriptorType:     0x05 
bEndpointAddress:     0x83 -> Direction: IN - EndpointID: 3 
bmAttributes:      0x02 -> Bulk Transfer Type 
wMaxPacketSize:     0x0040 = 0x40 bytes 
bInterval:       0x00 

      ===>Interface Descriptor<=== 
bLength:       0x09 
bDescriptorType:     0x04 
bInterfaceNumber:     0x02 
bAlternateSetting:     0x00 
bNumEndpoints:      0x01 
bInterfaceClass:     0x03 -> HID Interface Class 
bInterfaceSubClass:    0x01 
bInterfaceProtocol:    0x00 
CAUTION: This may be an invalid bInterfaceProtocol 
iInterface:      0x00 

      ===>HID Descriptor<=== 
bLength:       0x09 
bDescriptorType:     0x21 
bcdHID:       0x0101 
bCountryCode:      0x00 
bNumDescriptors:     0x01 
bDescriptorType:     0x22 
wDescriptorLength:    0x0065 

      ===>Endpoint Descriptor<=== 
bLength:       0x07 
bDescriptorType:     0x05 
bEndpointAddress:     0x84 -> Direction: IN - EndpointID: 4 
bmAttributes:      0x03 -> Interrupt Transfer Type 
wMaxPacketSize:     0x0040 = 0x40 bytes 
bInterval:       0x01 

¿Cómo podría obtener este Leonardo reconocido por un BIOS como un teclado genérico?

+0

¿Tienes una solución ?. Tengo el mismo problema. – Delta

+0

Yo no. Intenté la solución provista por darBis, pero tampoco logró que la PC la reconociera. –

Respuesta

2

Arduino no es compatible con el protocolo de arranque. Empecé a usar Teensy (que es compatible con Arduino), y funciona bastante bien.

+1

Después de examinar el protocolo de arranque, también creo que este es el problema. Encontré documentación aquí [USB.ORG] (http://www.usb.org/developers/devclass_docs/HID1_11.pdf) que explica cómo podría implementarse. –

+0

@wirecat: ¿Pudiste modificar el código fuente de HID para que funcione? – Force

+0

@Force Yo no era. Desde entonces, he usado una solución diferente y no he tenido tiempo de volver a esto. –

1

Podría estar equivocado, pero si quiere que se reconozca su devide durante el arranque, es bInterfaceSubClass que debe ser 0x01 (Subclase de dispositivo de inicio). En los archivos fuente que ha señalado, existe una subclase en todas partes configurada en 0x00.

Puede intentar establecer la subclase en todos los usos de macro D_INTERFACE de USBCore.h a 0x01.

No soy usuario de Arduino, solo estaba jugando una vez con la emulación de teclado HID en AVR usando V-USB. Puede intentar encontrar información detallada sobre las descripciones usb en USB.org en la documentación. Pero es un montón de páginas para leer.

Aquí es parte desde volcado descriptor HID de mi teclado, los valores de anuncios en la interfaz de descriptores:

Bus 005 Device 002: ID 046d:c30e Logitech, Inc. UltraX Keyboard (Y-BL49) 
Device Descriptor: 
    bLength    18 
    bDescriptorType   1 
    bcdUSB    1.10 
    bDeviceClass   0 (Defined at Interface level) 
    bDeviceSubClass   0 
    bDeviceProtocol   0 
    bMaxPacketSize0   8 
    idVendor   0x046d Logitech, Inc. 
    idProduct   0xc30e UltraX Keyboard (Y-BL49) 
    bcdDevice   1.80 
    iManufacturer   1 Logitech 
    iProduct    2 HID compliant keyboard 
    iSerial     0 
    bNumConfigurations  1 
    Configuration Descriptor: 
    bLength     9 
    bDescriptorType   2 
    wTotalLength   59 
    bNumInterfaces   2 
    bConfigurationValue  1 
    iConfiguration   0 
    bmAttributes   0xa0 
     (Bus Powered) 
     Remote Wakeup 
    MaxPower    100mA 
    Interface Descriptor: 
     bLength     9 
     bDescriptorType   4 
     bInterfaceNumber  0 
     bAlternateSetting  0 
     bNumEndpoints   1 
     bInterfaceClass   3 Human Interface Device 
     bInterfaceSubClass  1 Boot Interface Subclass 
     bInterfaceProtocol  1 Keyboard 
     iInterface    0 
     HID Device Descriptor: 
      bLength     9 
      bDescriptorType  33 
      bcdHID    1.10 
      bCountryCode   0 Not supported 
      bNumDescriptors   1 
      bDescriptorType  34 Report 
      wDescriptorLength  62 

volcado fue hecho usando "lsusb -v" como root en Linux.

+1

Intenté su solución recomendada, pero desafortunadamente el BIOS todavía no reconoce el Leonardo.Agregaré un volcado desde USB Device Viewer en mi pregunta que muestra los descriptores actuales para el Leonardo. –