Arduino IDE1.0.1とDavinciのLeonardo化の続き。
HID USBキーボードでどのキーが押されたかは、UsageIDというので与えられる。
→http://www.usb.org/developers/devclass_docs/Hut1_11.pdf[pdf] のp.53〜 10 Keyboard/Keypad Page (0x07)
表示不能な特殊キーとモディファイア(SHIFT,CTRL,ALT等)の番号を見ると、どうも違うのでソースを追ってみた。
特殊キーとモディファイアの定義は以下。
hardware/arduino/cores/arduino/USBAPI.h
keyboard.press()は以下。
hardware/arduino/cores/arduino/HID.cpp
keyboard.press()では、与えられた数値が0x00〜0x7fを印字可能なキー、0x80〜0x87をモディファイアキー、0x88〜を表示不能な特殊キーとみなしている。
0x00〜0x7fは const uint8_t _asciimap[128] で定義されてあるテーブルで変換される。これはUSキー配列相当となっているので、日本語キーボード相当にしたければここをいじればよい。
0x88以上は、その値から0x88を引いた数値がUsageIDとしてUSB経由で送信される。つまり、ファンクションキーF7は #define KEY_F7 0xC8 と定義されているが、実際は0xC8ー0x88=0x40が送信される。
ということで未定義のPrintScreenキーなどを追加してみた。
といってもいきなりソースを修正するのは恐れ多いので、スケッチで実験してみる。
HID USBキーボードでどのキーが押されたかは、UsageIDというので与えられる。
→http://www.usb.org/developers/devclass_docs/Hut1_11.pdf[pdf] のp.53〜 10 Keyboard/Keypad Page (0x07)
表示不能な特殊キーとモディファイア(SHIFT,CTRL,ALT等)の番号を見ると、どうも違うのでソースを追ってみた。
特殊キーとモディファイアの定義は以下。
hardware/arduino/cores/arduino/USBAPI.h
keyboard.press()は以下。
hardware/arduino/cores/arduino/HID.cpp
keyboard.press()では、与えられた数値が0x00〜0x7fを印字可能なキー、0x80〜0x87をモディファイアキー、0x88〜を表示不能な特殊キーとみなしている。
0x00〜0x7fは const uint8_t _asciimap[128] で定義されてあるテーブルで変換される。これはUSキー配列相当となっているので、日本語キーボード相当にしたければここをいじればよい。
0x88以上は、その値から0x88を引いた数値がUsageIDとしてUSB経由で送信される。つまり、ファンクションキーF7は #define KEY_F7 0xC8 と定義されているが、実際は0xC8ー0x88=0x40が送信される。
ということで未定義のPrintScreenキーなどを追加してみた。
#define KEY_PRINTSCREEN 0xCE
#define KEY_SCROLLLOCK 0xCF
#define KEY_PAUSE 0xD0
といってもいきなりソースを修正するのは恐れ多いので、スケッチで実験してみる。
/* Button for Keyboard (Arduino Leonardo only) */
/*
Button
Turns on and off a light emitting diode(LED) connected to digital
pin 13, when pressing a pushbutton attached to pin 2.
The circuit:
* LED attached from pin 13 to ground
* pushbutton attached to pin 2 from +5V
* 10K resistor attached to pin 2 from ground
* Note: on most Arduinos there is already an LED on the board
attached to pin 13.
created 2005
by DojoDave
modified 30 Aug 2011
by Tom Igoe
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
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
pinMode(keymacroPin, INPUT);
digitalWrite(buttonPin, HIGH);
digitalWrite(keymacroPin, HIGH);
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(KEY_PRINTSCREEN);
}
}
else {
// turn LED off:
digitalWrite(ledPin, LOW);
Keyboard.release(KEY_PRINTSCREEN);
}
delay(100);
}
これは、Windowsマシンに接続してボタンを押すと画面のスナップショットをクリップボードにコピーする。定義されていないキーもこれで使用できた。