Happy Hacking KeyboardをBluetooth化する(無改造版)
前回はHappy Hacking Keyboard(HHKB)のコントローラから自作してBluetoothキーボードに改造しました。
今回はHHKBには一切手を入れずに、HHKBをBluetooth化してみたいと思います。
※当方電子工作は初心者なため、以下の内容の正しさは保証出来ません。
また、改造に伴う機器の故障等も自己責任でお願いします。
必要なもの
- Arduino UNO
- Arduino USBホストシールド
- RN-42 HID(Bluetoothモジュール)*1
- felis/USB Host Library Rev.2.0
- addsict/USBKeyboard2BT
- 10kΩ, 5.1kΩの抵抗
- その他基板, ケーブルなど
ArduinoをUSBキーボードのホストにする
Bluetooth化の大まかな流れとしては、HHKBのUSBケーブルをArduinoに接続し、HHKBから送られてくる信号をArduinoがBluetoothに変換してPCに送ります。 Arduinoが一旦PC代わりとなり、本来ならPCが受け取る信号をArduinoを通して送るイメージです。 USBデバイスを操作する側をホストと呼びますが、つまりArduinoがUSBキーボードのホストになればいいわけです。
ArduinoのUSBホスト化はUSBホストシールドとそれに対応したライブラリ USB Host Shield 2.0を使います。 このライブラリにはUSBのHIDデバイスに対応したクラスが用意されており(hidboot.(cpp|h))、その中のKeyboardReportParserクラスをサブクラス化して使います。
HHKB側からUSB経由でHIDレポートが送られてくるとKeyboardReportParser::Parseメソッドが呼び出されます。そのParseメソッドをオーバーライドすれば、送られてきたHIDレポートを自由に扱えます。
今回はそのHIDレポートをBluetoothモジュールに素通りさせればokです。
HIDレポートについては前回のものを参考にしてくだい。
class HIDKeyboardParser : public KeyboardReportParser { virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf); }; void HIDKeyboardParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) { // bufにはHHKBから送られてきたHIDレポートが入っているので、 // そのレポートをそのままBluetoothモジュールに対してシリアルで送信 sendKeyCodesBySerial(buf[0], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); } void sendKeyCodesBySerial(uint8_t modifiers, uint8_t keycode0, uint8_t keycode1, uint8_t keycode2, uint8_t keycode3, uint8_t keycode4, uint8_t keycode5) { Serial.write(0xFD); // Raw Report Mode Serial.write(0x09); // Length Serial.write(0x01); // Descriptor 0x01=Keyboard /* send key codes(8 bytes all) */ Serial.write(modifiers); // modifier keys Serial.write(0x00, 1); // reserved Serial.write(keycode0); // keycode0 Serial.write(keycode1); // keycode1 Serial.write(keycode2); // keycode2 Serial.write(keycode3); // keycode3 Serial.write(keycode4); // keycode4 Serial.write(keycode5); // keycode5 delay(5); }
全体のスケッチはaddsict/USBKeyboard2BTにあります。 このスケッチをArduinoに転送し、ArduinoとBluetoothモジュールをシリアルで接続するだけでBluetooth化の完了です。
これでHHKBに限らずUSBキーボード(HID)ならどんなものでも一瞬でBluetoothキーボードにすることが出来ます。 あとはPICやAVRマイコンなどを使用して小型化すれば実用的になりそうです。