コメを噛め

コメを噛め

rerofumi の電子工作メモ

hatena bookmark

Mouse が八の字を描くサンプルコードは PIC USB 界(?)ではメジャーなので、あちこちで見受けられる。HID の入門としては手頃だけれども、ここから HID Joystick へと改造するにはどうしたら良いのだろうか?
調べてみたけれども、そのものズバリな解を WEB 上で発見することはできなかった。

USB デバイスは接続時の enumulation で自分はどういった機器でどういった事ができますよというのをホストに宣言する。この宣言の内容をデスクリプタと呼ぶ。
つまりコレまでは「HIDのマウスですよ」と宣言していたものを「HIDのジョイスティックですよ」と宣言するように描き直せば、まずはジョイスティックとして認識してくれるに違いない。
結局色々探して usb.org の HID document まで眺めるはめになってしまった。
結果 HID であればクラスディスクリプタとかは同じで、マウスかキーボードかジョイスティックか(もしくはその他か複合か)は “Report descriptor” が違うだけということがわかった。Report descriptor というのは、その機器がどのような入出力を持っているかをホストへと伝えるリポート。マウスだったら「座標が 2つ X と Y にボタンが 5つですよ」と伝えるし、ジョイスティックだったら「座標が 3つ X と Y と Z にボタンが 8つですよ」とかになる。

Report descriptor の書式は複雑なので、これを記述する補助ツールが “HID Descriptor Tool” として usb.org から提供されているけれどもコレがまたわかりづらい。
色んなリポートサンプルを読みながら理解していくしか無い。

取り敢えず最初はスティック無しでボタンが 8個あるだけのジョイスティック(それをジョイスティックと呼ぶのか?)を作成してみた。

char ReportDescriptor[25] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};

ジョイスティックで、ボタンが Button1〜8 の 8個あります、ボタンが取りうる値は 0〜1 の二値で、ボタン 1つあたり 1ビット、それを 8個分通知します、という宣言。
合計で 8bit = 1Byte のデータがホスト宛に送信される事になり、この 1Byte は EndPoint1(最大8Byteくらい) の先頭 1Byte に書き込んでおいて送信(正確にはホストが読み取り)される事となる。

先の HID Mouse サンプルの Report descriptor を上記の物に差し替えると無事ボタン 8個のジョイスティックとして認識された。
ただ、ベンダーIDとデバイスIDが同じままだと、前の(Mouseの時の)デバイス情報が残っているため上手くいかない。デバイス情報を削除するか、デバイスIDを変更する必要がある。

これまでなんとなく避けてきたがディスクリプタの中にはベンダーIDというものがあって「誰が作った物か」という情報を示さないとならない。
このIDは USB.org から貰うのだけれども、個人では取得できないしできたとしても年数十万円の費用がかかる。
なので個人工作の範囲ではここは適当に設定して、できたデバイスは個人の責任において個人利用の範囲でとどめる必要がある。注意。


Windows のコンソールパネルからジョイスティックとして確認できている所。

8button_joystick.zip
8ボタンジョイスティックのテストコード。
起動してジョイスティックと認識された後はボタン1〜4 をぱたぱたと叩く。先のコンソールパネルではその様が確認できる。
—–

Leave a Reply