読者です 読者をやめる 読者になる 読者になる

Happy Hacking KeyboardをBluetooth化する(無改造版)

前回Happy Hacking Keyboard(HHKB)のコントローラから自作してBluetoothキーボードに改造しました。
今回はHHKBには一切手を入れずに、HHKBをBluetooth化してみたいと思います。

f:id:furuyamayuuki:20130817185550j:plain

※当方電子工作は初心者なため、以下の内容の正しさは保証出来ません。
また、改造に伴う機器の故障等も自己責任でお願いします。

必要なもの

ArduinoをUSBキーボードのホストにする

Bluetooth化の大まかな流れとしては、HHKBのUSBケーブルをArduinoに接続し、HHKBから送られてくる信号をArduinoBluetoothに変換して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に転送し、ArduinoBluetoothモジュールをシリアルで接続するだけでBluetooth化の完了です。

f:id:furuyamayuuki:20130817185745j:plain

これでHHKBに限らずUSBキーボード(HID)ならどんなものでも一瞬でBluetoothキーボードにすることが出来ます。 あとはPICやAVRマイコンなどを使用して小型化すれば実用的になりそうです。

*1:秋月で売っているRN-42-EKも同じRN-42が載っているので代わりに使えるかもしれません。HIDプロファイルも設定により切り替えれるみたいですので。