Unix上で動作するUSB関係の解析ツールにusbhid-dumpやhidrd-convertというのがある。
これを使うとUSB HID機器からの生のデータが読み取れるのだ。そこで手持ちの機器の動作を調べてみた。
我が家にあるUSBのジョイステック類は自作を除くと写真の2種類。
右はマイクロソフトのSideWinder(フォースフィードバックなし)で、リサイクルショップで500円で購入。左はラジコンシミュレータ用でE-Skyの製品。
実はフォースフィードバック機能つきのSidWinderもあるのだが、これはゲームポート仕様(懐かしー)なので除外。そもそも最近はOSもハードウェアもゲームポートをサポートしなくなった為にフライトヨークの自作などを始めてしまったのだ。
こららの機器を、基板切削CNCやRepRapのコントローラ用としてUbuntuをインストールしたPCに接続してみた。
まずコマンドラインから% lsusbコマンドを実行し、接続しているバスとデバイス番号を調べる。次に% sudo usbhid-dump -aバス番号:デバイス番号 -i0 | grep -v : | tr -d ‘ \n’ | xxd -r -p | hidrd-convert -o spec コマンドで、リポートディスクリプタを見る事ができる。
SideWinderはX軸、Y軸、スライダー、そしてボタン8つの構成。これは実物通りの内容である。
次にE-Skyは(リポートディスクリプタの上では)ボタン3つとX軸、Y軸、Z軸、Rx軸、Ry軸となっているが、実物はアナログスティック2本のみであるため、ボタンと軸一つは使用していない事になる。
そこで% sudo usbhid-dump –entity=all –address=バス番号:デバイス番号コマンドで軸やボタンの入力値を表示させ、どのスティックを動かすとどの軸が反応するかを調べた結果が次の通りで、Rx軸とボタンは割当てられていなかった。
- 左スティックの左右:Ry軸
- 左スティックの上下:Y軸
- 右スティックの左右:X軸
- 右スティックの上下:Z軸
また、もう一つ興味深い点を発見。SideWinderは軸やボタンを操作した時だけ、値を示す行が追加印字されていくが、E-Skyは全く操作していなくても、ひたすら印字され画面がスクロールしていく。 OpenSteickはというとE-Sky同様にひたすら印字してスクロールする派だ。
確かにOpenStickのファームウェアでは値が変化したか否かにかかわらずUSBライブラリに渡す値を更新している。PCから(1mSおきに)問合せがきた際、必ずデータを準備しておかなければならないと考えていたのだが、実は変化があったときだけ値を返せばよいのかもしれない。
どちらが正しいのかは判らないが、変更があったときだけ更新する方が省エネな気がする(マイクロソフトの機器がそうなっているという事実も説得力がある)。