byte | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
0 | 右GUI | 右Alt | 右Shift | 右Ctrl | 左GUI | 左Alt | 左Shift | 左Ctrl |
1 | 予約(0) | |||||||
2 | Key1スキャンコード | |||||||
3 | Key2スキャンコード | |||||||
4 | Key3スキャンコード | |||||||
5 | Key4スキャンコード | |||||||
6 | Key5スキャンコード | |||||||
7 | Key6スキャンコード |
サブキーボード
たぶん様々な人が作っているだろう、USB接続のキーボード。
Arduino UNOはUSB-Serial変換がATMega8U2に変更されましたが、これのプログラムを書き換えることにより様々なUSBデバイスとして認識させることができるようになります。ということで簡単だけど実用的な、サブキーボードを。
MacOSがLionになり、Launchpadという機能が追加されました。それまでにあったExposeに変わるMission Controlなどと合わせ、トラックパッドのゼスチャーで簡単にアクセスできる機能ですが、マウスを使っている場合にキーひとつで(OptionとかControlとか同時押し無しに)アクセスできればいいかな…と。
同様に、Photoshop等の各アプリケーションでよく使う機能を割り当てても便利に使えるかと思います。
ATMega8U2部のプログラム
肝心なATMega8U2部のプログラムですが、darran氏のblogに掲載されているArduino UNO Keyboard HID version 0.3を使用しました。
これを書き込むにはDFUモードにすれば可能なようですが、それも面倒なので、AVRISP mk2を使用し、AVR Studioにて書き込みました。
このようにして書き込んだ瞬間にArduinoはキーボードとして動作します。PCの誤動作を防ぐため、ArduinoとPCとはUSBで接続しない状態にして書き込んだほうがいいでしょう。
ATMega328のプログラム
ATMega8U2部を書き換えると、USB経由でATMega328部へのプログラミングができなくなります。ということで、本来ならばまずATMega328部のプログラムを書き込み、次にATMega8U2部のプログラムを書き込むという手順になります。しかしこれではATMega328部のプログラムの修正が非常に面倒です。ということで、別途用意してあるUSB-Serial変換を使い、ATMega8U2を経由せずに直接ATMega328に書き込んでみました。
これなら通常のArduinoのプログラム開発と同様に、ちょっと修正して書き込み…という事を手軽に行えるので便利です。
データの形式
darran氏のblogに掲載されているサンプル(kbd_usb_demo.pde)を見ると、Serial.writeを使って8バイトのデータを送信していることがわかります。このデータはUSBキーボードがPCに送信するデータそのもので、以下の形式です。
0byte目は各Shiftキー等が押されていれば1です。各キーのスキャンコードはUSB規格のHID Usage Tablesに書かれてます。各キーが押されていればそのスキャンコードが入ります。例えば、aキーが押され、右シフトを押しながらbキーが押され、aキーが離され、右シフトとbキーが離された…という順に操作された場合には以下のようなコードが順に送信されます(aキー、bキーのスキャンコードはそれぞれ04,05です)。
操作 | byte0 | byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 |
---|---|---|---|---|---|---|---|---|
aキーが押された | 00 | 00 | 04 | 00 | 00 | 00 | 00 | 00 |
右シフトとbキーが押された | 01 | 00 | 04 | 05 | 00 | 00 | 00 | 00 |
aキーが離された | 01 | 00 | 05 | 00 | 00 | 00 | 00 | 00 |
右シフトとbキーが離された | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
このようにして6個までのキーが同時に押された事を正確に認識することが可能です。今回はそこまで考えないにして、特定のキーが押されたら単にキーのデータを送信するだけであれば、Byte0とByte2に必要な情報をセットして送信、その後すべて0の8バイト送信すればOKという事でしょう。
組み立ててみる。
特別な回路というものは無く、サンハヤトのArduino用ユニバーサル基板に中継コネクタを載せ、そして万能基板にキーを並べただけです。
使ってみると…
うーん、まぁ、それなりに便利。
あとは、置き方とか、どうやって固定するか…かな。