前回の続き。
 Arduino LeonardoではHID USB Keyboardとしてkey.press()でキーボードのように振る舞うことが出来る。これはArduino IDE1.0.1ソース中の
hardware/arduino/cores/arduino 以下にある
HID.cpp
USBAPI.h
で定義されている。

 USBAPI.hで定義されていないキーを、以下にまとめた。

参考:Universal Serial Bus(USB) HID Usage Tables
USBキーボードのコード 


#define KEY_PRINTSCREEN		0xCE
#define KEY_SCROLL_LOCK		0xCF
#define KEY_PAUSE			0xD0

#define KEYPAD_NUM_LOCK		0xDB
#define KEYPAD_SLASH		0xDC
#define KEYPAD_ASTERISK		0xDD
#define KEYPAD_MINUS		0xDE
#define KEYPAD_PLUS			0xDF
#define KEYPAD_ENTER		0xE0
#define KEYPAD_1			0xE1
#define KEYPAD_2			0xE2
#define KEYPAD_3			0xE3
#define KEYPAD_4			0xE4
#define KEYPAD_5			0xE5
#define KEYPAD_6			0xE6
#define KEYPAD_7			0xE7
#define KEYPAD_8			0xE8
#define KEYPAD_9			0xE9
#define KEYPAD_0			0xEA
#define KEYPAD_DOT			0xEB
#define KEYPAD_NONUS_BACKSLASH	0xEC
#define KEYPAD_APPRICATION	0xED
#define KEYPAD_POWER		0xEE
#define KEYPAD_EQUAL		0xEF
#define KEY_F13				0xF0
#define KEY_F14				0xF1
#define KEY_F15				0xF2
#define KEY_F16				0xF3
#define KEY_F17				0xF4
#define KEY_F18				0xF5
#define KEY_F19				0xF6
#define KEY_F20				0xF7
#define KEY_F21				0xF8
#define KEY_F22				0xF9
#define KEY_F23				0xFA
#define KEY_F24				0xFB
#define KEY_EXECUTE			0xFC
#define KEY_HELP			0xFD
#define KEY_MENU			0xFE
#define KEY_SELECT			0xFF
#define KEY_STOP			0x100
#define KEY_AGAIN			0x101
#define KEY_UNDO			0x102
#define KEY_CUT				0x103
#define KEY_COPY			0x104
#define KEY_PASTE			0x105
#define KEY_FIND			0x106
#define KEY_MUTE			0x107
#define KEY_VOLUP			0x108
#define KEY_VOLDOWN			0x109
#define KEY_LOCKING_CAPS_LOCK	0x10A
#define KEY_LOCKING_NUM_LOCK		0x10B
#define KEY_LOCKING_SCROLL_LOCK		0x10C
#define KEYPAD_COMMA		0x10D
#define KEYPAD_EQUALSIGN	0x10E
#define KEY_INTERNATIONAL1	0x10F
#define KEY_BACKSLASH	0x10F
#define KEY_INTERNATIONAL2	0x110
#define KEY_KANA	0x110
#define KEY_INTERNATIONAL3	0x111
#define KEY_YEN		0x111
#define KEY_INTERNATIONAL4	0x112
#define KEY_XFER	0x112
#define KEY_INTERNATIONAL5	0x113
#define KEY_NFER	0x113
#define KEY_INTERNATIONAL6	0x114
#define KEY_PC98_COMMA	0x114
#define KEY_INTERNATIONAL7	0x115
#define KEY_INTERNATIONAL8	0x116
#define KEY_INTERNATIONAL9	0x117
#define KEY_LANG1			0x118
#define KEY_LANG2			0x119
#define KEY_LANG3			0x11A
#define KEY_KATAKANA		0x11A
#define KEY_LANG4			0x11B
#define KEY_HIRAGANA		0x11B
#define KEY_LANG5			0x11C
#define KEY_ZENHAN			0x11C
#define KEY_LANG6			0x11D
#define KEY_LANG7			0x11E
#define KEY_LANG8			0x11F
#define KEY_LANG9			0x120
#define KEY_ALT_ERASE		0x121
#define KEY_SYSREQ			0x122
#define KEY_CANCEL			0x123
#define KEY_CLEAR			0x124
#define KEY_PRIOR			0x125
#define KEY_RETURN2			0x126
#define KEY_SEPARATOR		0x127
#define KEY_OUT				0x128
#define KEY_OPER			0x129
#define KEY_CLEAR_AGAIN		0x12A
#define KEY_CLRSEL			0x12B
#define KEY_EXSEL			0x12C

#define KEYPAD_00			0x138
#define KEYPAD_000			0x139
#define KEYPAD_THOUSANDS_SEPARATOR	0x13A
#define KEYPAD_DECIMAL_SEPARATOR	0x13B
#define KEYPAD_CURRENCY_UNIT	0x13C
#define KEYPAD_CURRENCY_SUBUNIT	0x13D
#define KEYPAD_LEFT_PAREN	0x13E
#define KEYPAD_RIGHT_PAREN	0x13F
#define KEYPAD_LEFT_BRACE	0x140
#define KEYPAD_RIGHT_BRACE	0x141
#define KEYPAD_TAB			0x142
#define KEYPAD_BACKSPACE	0x143
#define KEYPAD_A			0x144
#define KEYPAD_B			0x145
#define KEYPAD_C			0x146
#define KEYPAD_D			0x147
#define KEYPAD_E			0x148
#define KEYPAD_F			0x149
#define KEYPAD_XOR			0x14A
#define KEYPAD_CARET		0x14B
#define KEYPAD_PERCENT		0x14C
#define KEYPAD_LESSTHAN		0x14D
#define KEYPAD_GREATERTHAN	0x14E
#define KEYPAD_AND			0x14F
#define KEYPAD_LOGICAL_AND	0x150
#define KEYPAD_OR			0x151
#define KEYPAD_LOGICAL_OR	0x152
#define KEYPAD_COLON		0x153
#define KEYPAD_HASH			0x154
#define KEYPAD_SPACE		0x155
#define KEYPAD_ATMARK		0x156
#define KEYPAD_EXCLAMATION	0x157
#define KEYPAD_MS			0x158
#define KEYPAD_MR			0x159
#define KEYPAD_MC			0x15A
#define KEYPAD_MADD			0x15B
#define KEYPAD_MSUB			0x15C
#define KEYPAD_MMUL			0x15D
#define KEYPAD_MDIV			0x15E
#define KEYPAD_SIGN			0x15F
#define KEYPAD_CLEAR		0x160
#define KEYPAD_CLEARENTRY	0x161
#define KEYPAD_BIN			0x162
#define KEYPAD_OCT			0x163
#define KEYPAD_DEC			0x164
#define KEYPAD_HEX			0x165


問題点:0x100以上のコードは正しく扱われない。HID.cpp中のKeyboard_::press()が8bitの範囲内でしか扱っていないためと思われる。コードの修正も必要になる。

 MacOSXに接続して、Arduino Leonardoに繋いだボタンを押すとシャットダウン画面が出るものを作ってみた。また、pinmode(buttonPin,INPUT_PULLUP); で明示的なプルアップ指示をしてみた。これはArduino IDE 1.0.1からの機能。

/*
 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to 
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int keymacroPin = 3;
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

#define KEY_PRINTSCREEN         0xCE
#define KEY_SCROLLLOCK          0xCF
#define KEY_PAUSE               0xD0
#define KEYPAD_POWER		0xEE
#define KEY_VOLUP			0x108
#define KEY_VOLDOWN			0x109

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(keymacroPin, INPUT_PULLUP);

  Keyboard.begin();
}

void loop(){
  if (digitalRead(keymacroPin)==LOW) {
    // not implemented
  }

  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == LOW) {     
    // turn LED on:    
    digitalWrite(ledPin, HIGH); 
    delay(30);
    while(buttonState == LOW){
      buttonState = digitalRead(buttonPin);
      // Keyboard.press(ctrlKey);
      Keyboard.press(KEYPAD_POWER);
    }
  } 
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW); 
    Keyboard.release(KEYPAD_POWER);
  }
  delay(100);
}


Arduino Leonardo