2012-10-01 21 views
6

キーボードエミュレーション用にArduino Leonardoを使用しようとしています。これはその広告機能の1つです。私はLeonardoと遊んでいて、Blinkの例に基づいた非常に単純なスケッチを書いています。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 
} 

この例は、私のWindows XPマシンでうまくいきます。これは一般的なHIDキーボードとして認識され、5秒ごとに「A」と入力されます。

対象の環境でDOSが実行されているので、私の知る限りでは、このマシンのBIOSでArduino Leonardoを認識させる必要があります。これはDOSでは 'A'を入力しません。

私は、LeonardoのUSBデバイス記述子に変更を加えて、可能な限りDell L100にマッチさせようとしています。私が作った変更は役に立たなかったし、Leonardoはシリアル通信、キーボードエミュレーション、マウスエミュレーションを同じUSBポートで公開する複合デバイスだからだと思う。 USBディスクリプタ/構成のためのソースコードを編集するために利用可能であり、次の場所にあります。

  • Arduino_Installationの\ハードウェア\アルドゥイーノ\コア\アルドゥイーノ\ HID.cpp
  • Arduino_Installationの\ハードウェア\アルドゥイーノ\コア\アルドゥイーノ\ USBDesc.h
  • Arduino_Installation \ハードウェア\ arduinoの\コア\ arduinoの\ USBCore.h
  • Arduino_Installation \ハードウェア\ arduinoの\コア\ arduinoの\ USBCore.cpp

次は、USBデバイスからのダンプですレオナルドのためのビューア:

[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 

どのように私は、一般的なキーボードとBIOSが認識し、このレオナルドを得ることができますか?

+0

解決策はありますか?私は同じ問題を抱えています。 – Delta

+0

私はしません。私はdarBisが提供するソリューションを試しましたが、PCに認識させることはできませんでした。 –

答えて

2

Arduinoはブートプロトコルをサポートしていません。私はTeensy(Arduinoと互換性があります)を使い始めました。これはかなりうまく動作します。

+1

ブートプロトコルを調べた後、私はこれが問題だとも考えています。実装方法を説明したドキュメント[USB.ORG](http://www.usb.org/developers/devclass_docs/HID1_11.pdf)が見つかりました。 –

+0

@wirecat:HIDソースコードを修正して動作させることができましたか? – Force

+0

@Force私はそうではありませんでした。私は以来、別のソリューションを使用しており、これに戻る時間はありませんでした。 –

1

私は誤っているかもしれませんが、起動中にdevideを認識させたい場合は、bInterfaceSubClassが0x01(ブートデバイスのサブクラス)である必要があります。 あなたが指摘したソースファイルには、どこでもサブクラスが0x00に設定されています。

D_INTERFACEマクロのすべての用途で、USBCore.hから0x01にサブクラスを設定しようとする場合があります。

私はArduinoのユーザーではなく、AVRのHIDキーボードエミュレーションではV-USBを使用していました。 USBディスクリプタに関する詳細情報は、USB.orgにあるドキュメントを参照してください。しかし、それは読めるページのかなりの山です。

はここに私のキーボードの一部のOD HIDディスクリプタダンプで、インタフェース記述子で予告値:Linuxでrootとして "lsusbが-v" を使用して

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 

ダンプを作りました。

+1

私はあなたの推薦された解決策を試しましたが、残念ながらLeonardoはまだBIOSによって認識されません。USBデバイスビューアから、私の質問にLeonardoの現在のディスクリプタを示すダンプを追加します。 –

関連する問題