USBジョイスティック自作ネタ

そもそも3DプリンタとCNCを活用した工作という事でジョイスティックを作ろうと思ったはずだったが、コントローラを汎用化しようなどと考えて回り道をしてしまった。でもやっと本題に戻る事にする。
ところがここでまた、ひねくれ根性が出た。普通に可変抵抗で制御するのがつまらなく思えてきたのだ(なら無理にジョイスティック作らんでもええやんか・・・まあまあ)。
そこで以前、秋月電子で買っておいた3軸加速度センサーを試す事にした。

加速度センさで実験の図

加速度センサーで実験

モジュールの仕様書によると、5V電源で動作させた場合、2.5Vを中心として1Gあたり1Vの変化が現れる事になっている。少し出力が小さい気がするが全く変化が見られない程ではなさそうなので、まずは直接PIC18F2550のアナログ入力に繋いでみた。PIC18F2550自体はOpenStickでジョイスティックとして構成済み。そしてWindowsの設定画面で動作を確認したところ、右や左に傾けてやると弱々しくではあるが確かに変化している。 センサーの出力抵抗が32KΩと結構高い事も振れ幅が小さい原因かもしれない(PIC18F2550の資料によるとアナログ入力には5KΩ以下のインピーダンスの信号を入れる様に書いてあるし)。
もう少し触れ幅が欲しいのでオペアンプで増幅してやる事にした。これも手持ちのNJU7032Dを使用。ゲインを5.1倍にすると大きく傾ける前に振り切れてしまう。2.3倍だと若干足らないが、ほぼいい感じで動いている。3.3倍ぐらいが最適かも。
早くこれでフライトミュレータをしてみたくなった。

 

USBジョイスティック自作 関連実験

Unix上で動作するUSB関係の解析ツールにusbhid-dumphidrd-convertというのがある。
これを使うとUSB HID機器からの生のデータが読み取れるのだ。そこで手持ちの機器の動作を調べてみた。

我が家にあるUSBのジョイステック類は自作を除くと写真の2種類。

USB機器

我が家のUSB機器

右はマイクロソフトのSideWinder(フォースフィードバックなし)で、リサイクルショップで500円で購入。左はラジコンシミュレータ用でE-Skyの製品。
実はフォースフィードバック機能つきのSidWinderもあるのだが、これはゲームポート仕様(懐かしー)なので除外。そもそも最近はOSもハードウェアもゲームポートをサポートしなくなった為にフライトヨークの自作などを始めてしまったのだ。

こららの機器を、基板切削CNCRepRapのコントローラ用として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おきに)問合せがきた際、必ずデータを準備しておかなければならないと考えていたのだが、実は変化があったときだけ値を返せばよいのかもしれない。
どちらが正しいのかは判らないが、変更があったときだけ更新する方が省エネな気がする(マイクロソフトの機器がそうなっているという事実も説得力がある)。

 

 

カホパーツセンターのジャンク市

先日、福岡に買い物に行った。ここ熊本から福岡へは車で1時間ちょっとである。
そして我が家では福岡に行くと、まずパーツ屋を巡る事になっている。
今回、カホパーツセンターに行くとジャンク市実施中とのアナウンスが流れていた。それほど規模は大きくないがジャンクが並んでいる。そして購入したのがこれ・・・・

ジャンク市 購入品

カホパーツで購入した品

液晶ディスプレイ450円はお買い得。
タクトスイッチはリード式なのが少し変則的だが100円で25個入り。
ビニール線1000m巻きが1000円(耐熱線でともっと良かったが)。

息子はアクリルでできたソーラーパワーのロボット、一体200円を三体も購入した。そんなに要るかという疑問もあるが、太陽電池、モーター、ギヤボックスが付いているのでこれもお買い得なのだ。

 

 

USBジョイスティック製作ツールキット

設定ツールOpenStickConfigを更新した。変更点は・・・

  • アナログ軸にRx,Ry,Rz軸を追加。
  • これまでX,Y,Zは-127~128の範囲だったのを、全アナログ軸0~255に変更した。
  • LOAD,SAVEボタンが動作する様になった。
  • DIRECTION→POVに表示を変更。

SAVEするファイルの拡張子は「.osc」にした。

また、先日ブートローダ一つきファームウェアをバイナリだけアップしたが、これのソースもアップした。

USBジョイスティック製作ツールキット

WindowsPCにジョイスティック接続した場合、デバイス名や軸構成を変更してもVID(ベンダーID)とPID(プロダクトID)がそのままだと変更が反映されない場合がある。これはどうやらレジストリの中に覚えている模様。 regedit.exeを起動して検索すると下図の箇所にそれらしい記述があったので、DirectInput以下とOEM以下の2箇所にあるVID,PIDの記述を削除した後、ジョイスティックを挿しなおすと新しい設定が反映された。

HKEY_CURRENT_USER
└System
 └CurrentControlSet
  └Control
   └MediaProperties
    └PrivateProperties
     ├DirectInput
     │├VID_FFFF&PID_001
     │├VID_FFFF&PID_002
     │└VID_FFFF&PID_003
     │     
     └Joystick
      └OEM
       ├VID_FFFF&PID_001
       ├VID_FFFF&PID_002
       └VID_FFFF&PID_003

いうまでもないと思うが、これを試した結果、不都合が生じても責任持てません。

USBジョイスティック自作ツールキット

最近店で見かけるゲームパッドはアナログスティックが2本付いていたりする。これがリポートディスクリプタ的にどんなUSAGEで書かれているのか気になっていた(実は私は昔ながらのジョィスティックしか持っていないのだ)。調べていくと、どうやらRx,Ry,Rzを使っている模様。
そこでOpenStickConfigでRx,Ry,Rzを指定する実験をした。

OSConfigRxRyRz

OpenStickConfig Rx,Ry,Rz追加実験

ここで問題が発生。Windowsのプロパティで動作を見ると、Rzだけ棒グラフの半分までしか上がらない。 XYZ軸およびRxRyRz軸は-128~+127を値とする様に作ったが、PC側はRzだけ0~255として受取っている様に見える。
そこでRzを0~255に変更して試そうとすると、次の問題が発生。VID(ベンダーID),PID(プロダクトID)を変更せずに軸構成をいじると、所々変更が反映されない模様。Revだけ値を変えても変化なく、PIDを一つ上げると反映される。 別のUSBポートに差し替えても反映される模様。でもこれって何かクリアーする方法がありそうな気がするが・・・みつからない。

とりあえずPIDを一つ上げ、全部の軸を0~255にしてみた結果がこれ。

XYZRxRyRzSDHB6

X,Y,Z,Rx,Ry,RzにSlider、Dial、ハットスイッチ、ボタン6個

18本の入力全てを使用してゴージャスな感じになった。
で、最終的にはどうしよう・・・・OpenStickConfigが返すアナログ値、全てを0~255に変更しようかな?

ジョイスティック製作ツールキット

OpenStieckをいじっていると何点か不思議なことがある。
下の図は8つのアナログ軸(X,Y,Z,Slider,Dial,Wheel,Throttle,Rudder)で構成したOpenSteickをWindoes7の「デバイスとプリンター」で確認したところあるが、WheelとThrottleが表示されていない。

Analog8

そこでLinux上のツール「usbhid-dump」をつかって動作を見ると次の様になった。

002:008:000:STREAM             1360761233.312661
01 03 80 60 43 60 A6 7F

HEXの数が8つ並んでいるところがOpenStickの出力をLinuxが受取ったデータで、WheelやThrottleに相当する箇所もボリュームの操作に合わせて正しく増減する。
そこでもう一度Windowsに戻り、WheelやThrottleだけの2軸で構成してみると正常に機能している。
どうやら組合わせによって認識しない軸がある模様。今のところ分かったのは次の通り。

  • Z軸とWheelを両方使う構成にするとWheelが消える。
  • Z軸とSliderとDialとThrottleをすべて使うとThrottleが消える。

usbhid-dumpで正常っぽく見えるのでWindows内で扱いがそうなっているんではないかと睨んでいる。
なおここでいうWhileだのThrottleだのというのはリポートディスクリプタ内のUSAGEという文で指定する。これはusb.orgにあるHID Usage Tablesという資料にどんなUSAGEを使用できるかが書いてあるのだが、Windowsで全てが使えるわけではないのかもしれない。というか全てをサポートする必要性は薄い様に思える。

で、OpenStickでの扱いであるが、よく使うUSAGEは認識されるのでこのまま使えるやつだけ使う事にしようと思う。

USBジョイスティック製作ツールキット ~OpenStick~

OpenStickの公開ページに載せた回路はKi-Cadで書いている。ここからプリントパターンを出力してCNCで切削してみた。

OpenStickBASE_schematic1

基本回路のプリントパターン

切削途中で切屑を掃ってみたところ。

OpenStickBASE_milling

切削中の様子

出来上がった基板。レモン汁とクレンザーで磨いた跡。

OpenStickBASE_boad

削り終えた基板

部品取付け後。

OpenStickBase

部品取り付け後

もっと部品間を詰めて小型化できそうだが・・・。
とりあえずボリュームを仮付けして動作確認OK。

USBジョイスティック製作ツールキット

前に書いたUSBジョイスティックのツールキットを公開した。→ここに公開
まだまだ未完成な部分もあるが、とりあえず当初目標とした用途には使えると思う。

設定ツールも作ってみた。C#初挑戦。

OpenStickConfig

設定ツール「OpenStickConfig」

どなたか、ためしにUSBジョイスティックを自作してみて下さい。