昔のマイクロソフトのゲームポートジョイスティックを復活させるためのメモ

ハードオフマイクロソフトのサイドワインダー・プレシジョン・プロのジャンク品を500円でゲットした。
箱にはゲームポートおよびUSBポート対応と書いてあったが、残念ながらUSBアダプタは欠品。
Arduinoでゲームポートを読みだして何とかできないか調べてみると、Teensyやダビンチといったマイコン(Atmega32U4)による作例はあるがArduinoの例が見あたらない。
http://www003.upp.so-net.ne.jp/BackyWorks/SWFFBP.html

だが、さらに調べてみるとマイコンを使うまでもないことがわかった。
http://www.descentbb.net/viewtopic.php?t=14791
プレシジョンプロは、USBの1〜4番ピンをゲームポートの1, 14, 10, 4につなぎ、ゲームポートの2番と7番をショートさせると、USBジョイスティックとして動作するのだ。
デバイスドライバWindows 7に内蔵されていて、接続即認識である。

USB ゲームポート
1(赤) Vcc 1
2(白) D- 14
3(緑) D+ 10
4(黒) GND 4
2-7

で、これをプレイステーション3に接続したら、PS2アーカイブギャラクシーフォースが動いた! これはすばらしい!
SEGA AGES 2500 シリーズ Vol.30 ギャラクシーフォースII~スペシャルエクステンデッドエディション~

……と思ったのもつかの間、STARTボタンが効かない。
ゲームスタートのたびに純正コントローラに切り替えるのが癪だ。
シフトボタン(9番ボタン)がセレクトボタンとして使えたので、10番ボタンがあればスタートボタンとして働くはずだ。ボタンなんか余ってるんだ!

そこで、Arduinoを使って余ってるボタンにスタートボタンを割り当てることはできないかと考えた。
ArduinoにUSBホストシールド2.0をつないでジョイスティックサンプルプログラムを動かしてみると、プレシジョンプロの出す信号がなかなか風変わりなのがわかった。

プレシジョン USBジョイスティック 備考
X軸 y1軸 0〜255
Y軸 x2軸 0〜255
Z軸(ラダー) y2軸 0〜255
レバー上ボタン x1軸 トリガー(10H), 左ボタン(20H) 右上(40H) 右下(80H)
台座上ボタン Rz軸 A(04H), B(08H), C(10H), D(20H), シフト(40H)
ハットスイッチ x1軸 上から時計回りで0〜7, ニュートラル時8
スロットル ハットスイッチ 0〜15

Windowsはともかく、こんな信号をPS3がしっかり認識するのにびっくりした。ギャラクシーフォースが偉いのか?
変換プログラムはこれから作る。