PlayStation2コントローラをLinuxで

秋葉のLaOXアソビットシティでElecom製のPlayStation2コントローラ2個をUSBで使うアダプタ JC-PS102USV を買ってきた.ついでにhori製のPlayStation2互換コントローラ(連射機能,スティック感度調整機能付き) アナログ振動パッド2 も買ってきた.どちらも税込み2k円弱で,しめて4k円.まぁ高い買いものではないだろう*1.PC用のゲーム用コントローラを買う方が安いといえばそうなんだけど,PlayStationのコントローラならどっかから借りることも容易そうなのでこのような選択に.ケチな性分なので結構悩んだ(笑
Vine Linux Seed(カーネル2.4.27-0vl4)のノートに刺すと楽々認識.テストプログラムをSDLで書いて,ボタンの対応やジョイスティックの軸/値の取得の雰囲気もつかめた.PlayStation2コントローラの写真上に押したボタンに対応してライトを点灯させたり,実際のジョイスティックの傾きに合わせてジョイスティックの画像を動かしたりするもの.1024*768*16色にしたら(その程度の処理量だというのに)約40FPSだった orz さすがに振動機能の利用は無理のようだ.(ドライバを書けばできるのか? やだよ.)
ボタン*2の対応は以下の通りだった.なお2コンを使うときには各々に12を足すこと.

ボタン0
ボタン1
ボタン2
×
ボタン3
ボタン4
L2
ボタン5
R2
ボタン6
L1
ボタン7
R1
ボタン8
START
ボタン9
SELECT
ボタン10
左スティック押下(アナログモードでのみ有効)
ボタン11
右スティック押下(アナログモードでのみ有効)

軸の対応は以下の通り.まずはデジタルモード.

軸0
1コン 十字キー左右(左上から右下に値の増える「ゲーム座標」,値は-32767, 0, +32767の3通り)
軸1
1コン 十字キー上下
軸3
2コン 十字キー左右
軸4
2コン 十字キー上下
軸12
1コン アナログ/デジタル切替えボタン(デジタルで-15878,アナログで0)
軸13
2コン アナログ/デジタル切替えボタン(デジタルで-15878,アナログで0)

次にアナログモード*3

軸0
1コン 左スティック左右(左上から右下に値の増える「ゲーム座標」,値は-32767から+32767のsigned short.)
軸1
1コン 左スティック上下
軸2
1コン 右スティック左右
軸3
2コン 左スティック左右(意味不明な配列だ...)
軸4
2コン 左スティック上下
軸5
1コン 右スティック上下
軸6
2コン 右スティック左右
軸7
2コン 右スティック上下
軸8
1コン 十字キー左右(左上から右下に値の増える「ゲーム座標」,値は-32767, 0, +32767の3通り)
軸9
1コン 十字キー上下
軸10
2コン 十字キー左右
軸11
2コン 十字キー上下
軸12
1コン アナログ/デジタル切替えボタン(デジタルで-15878,アナログで0)
軸13
2コン アナログ/デジタル切替えボタン(デジタルで-15878,アナログで0)

ただし説明の都合上このように分けたが,実際には2つのコントローラ毎独立にA/Dの切替えができる.1コンがDモードで十字キー左右が軸0になっていても2コンがAモードで十字キー左右が軸10になる,という事態は普通にあり得る.
SDLの認識情報によればあと一つ軸があるはずなんだが? まぁ別にいいや.
後はゲームを書くだけだな. ...だけだな ...だけだ ...だけ ...
(2004-11-21追記:デジタルモードの軸の記述を修正,A/Dの独立について追加)

*1:SONY純正PlayStation2コントローラは600円高かった.

*2:PlayStationユーザって△とかを「さんかく」って発音するのかな...? 「Bダッシュ」とかの言葉が成立しない気が...

*3:正確には「サンプリングの細かいデジタル」.