最終更新日: 2011年8月17日

サブキーボード

たぶん様々な人が作っているだろう、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に送信するデータそのもので、以下の形式です。

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スキャンコード

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用ユニバーサル基板に中継コネクタを載せ、そして万能基板にキーを並べただけです。

使ってみると…
うーん、まぁ、それなりに便利。
あとは、置き方とか、どうやって固定するか…かな。

 



home | Elec top

inserted by FC2 system