GNU/Linux上でPlayStation 2のコントローラを使用する
GNU/Linux上で動作するゲームパッドを探していたが...
これまでPC上で使用するためのゲームパッド(コントローラ)の類は所有しておらず、新しく購入するとしても、それがもしかすると(Windows上では動いても)GNU/Linux上で動作してくれないのではないかという心配もあった。
一方、GNU/Linuxで使用可能な家庭用ゲーム機のコントローラとしてXbox 360の有線コントローラなどがある*1が、USB接続できるコントローラ(を含んだゲーム機)は所有しておらず、持っていないゲーム機のコントローラだけを購入するというのも気が進まなかった(費用もそれなりにかかる)。
そんなわけで、ゲームパッドをどうするのかを数年間悩みつつも、別に無くても困らないということで、何かを購入するということはしなかった。
PlayStation 2のコントローラをUSB接続するコンバータを知り試してみることに
最近、偶然「PlayStation 2のコントローラをUSB接続するコンバータ」というものが存在することを知ったのだが、これを用いると、(手元にある)PlayStation 2のコントローラ(SCPH-10010)をPCのUSBポートに接続し、ゲームパッドとして使用することができる。
値段は新しくコントローラを購入するよりずっと安上がりな上、使い慣れたコントローラがそのまま使えるということもあり、試しに「PLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02」というものを購入し、PlayStation 2のコントローラを接続してみることにした。このコンバータは2つのコントローラが接続でき、1つだけ接続可能な「PLANEX USBゲームパッドコンバータ(PS/PS2対応・1ポート) PSX-CV01」もある。
認識・動作
接続してみると、GNU/Linux上のUSBゲームパッドとして正しく認識された。
jstestコマンドを用いることでゲームパッドの入力テストができるのだが
$ jstest /dev/input/js0 Driver version is 2.1.0. Joystick (HuiJia USB GamePad) has 12 axes (X, Y, Z, Rx, Ry, Rz, Throttle, Rudder, Hat0X, Hat0Y, Hat1X, Hat1Y) and 24 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2, BaseBtn3, BaseBtn4, BaseBtn5, BaseBtn6, BtnDead, BtnA, BtnB, BtnC, BtnX, BtnY, BtnZ, BtnTL, BtnTR, BtnTL2, BtnTR2, BtnSelect). Testing ... (interrupt to exit) (中略) (操作に応じて下の「0」「off」の部分の値が変化する) Axes: 0: 0 1: 0 2: 0 3: 0 4: 0 5: 0 6: 0 7: 0 8: 0 9: 0 10: 0 11: 0 Buttons: 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off 8:off 9:off 10:off 11:off 12:off 13:off 14:off 15:off 16:off 17:off 18:off 19:off 20:off 21:off 22:off 23:off (Ctrl+Cで終了)
のように12の軸、24のボタンがあるものと認識されている。Ctrl+Cを押すまでの間、押したボタンやスティック操作の状態によって値が変化する。
ジョイパッド対応アプリケーションの中でキーや軸の割り当てができるものについては特に問題なく動作する。
ボタン番号について
ボタンの(初期の)割り当てについては下のようになった。ただし、2009年7月現在、コントローラは1つしか所有していないため、コントローラII上のボタン番号に関しては「II」の端子にだけコントローラが接続された状態でテストしている。2つのコントローラの同時使用についてはテストしていない。
ボタン | コントローラI | コントローラII |
---|---|---|
△(さんかく/triangle) | 0 | 12 |
○(まる/circle) | 1 | 13 |
×(ばつ/cross) | 2 | 14 |
□(しかく/square) | 3 | 15 |
L2 | 4 | 16 |
R2 | 5 | 17 |
L1 | 6 | 18 |
R1 | 7 | 19 |
SELECT | 8 | 20 |
START | 9 | 21 |
L3 | 10 | 22 |
R3 | 11 | 23 |
アナログスティックについて
PlayStation 2上と同様、「ANALOG」ボタンを押してランプが点いている状態でアナログスティックが使用できる。
コントローラIの左スティックはX(軸0)とY(軸1)として使用できるが、右スティックでは5と2のように番号が飛んでいるところがある。これは割り当て変更で修正できるが、その方法/手順は(ボタン番号の再割り当てについてと一緒に)別記事にて扱う。
振動機能(未対応)について
PLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02はWindows上で専用のドライバをインストールすることで振動機能が使用できるが、GNU/Linux上では、Linux 2.6.27.24(Mandriva Linux 2009.0)の時点ではfftestやffcfstressなどのテストプログラムは正しく動作しない(振動しないかエラーになるかのどちらか)。
$ fftest /dev/input/by-id/usb-HuiJia_USB_GamePad-event-joystick Force feedback test program. HOLD FIRMLY YOUR WHEEL OR JOYSTICK TO PREVENT DAMAGES Device /dev/input/by-id/usb-HuiJia_USB_GamePad-event-joystick opened Axes query: Effects: Number of simultaneous effects: 0 Upload effects[0]: Function not implemented Upload effects[1]: Function not implemented Upload effects[2]: Function not implemented Upload effects[3]: Function not implemented Upload effects[4]: Function not implemented Upload effects[5]: Function not implemented Enter effect number, -1 to exit (0から5のどれを選択しても動かない) (Ctrl+Cか「-1」入力で終了)
上記のテスト結果は「現在のドライバでは振動機能が利用できない」ということを示している。
しかしフォースフィードバックの仕組み自体はLinuxカーネルにもUSB HIDドライバにも存在し、実際にフォースフィードバック機能が動作するUSBパッドも存在するようだ。*2
(2010/5/27)ffcfstressというコマンドはソースの先頭に「Constant Force Stress Test」とコメントが書かれていることやFF_CONSTANTのサポートをチェックしていることから、フォースフィードバックの中の別の「Constant Force」という種類のテストとなっており、振動をテストするものではないことが分かったため、出力は削除した。
その他情報
下はdmesgの結果より。
input: HuiJia USB GamePad as /class/input/input10 input,hidraw2: USB HID v1.10 Joystick [HuiJia USB GamePad] on usb-0000:00:13.0-3 usb 2-3: New USB device found, idVendor=0e8f, idProduct=1006 usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 2-3: Product: USB GamePad usb 2-3: Manufacturer: HuiJia
下はlsusbの結果より。
Bus 002 Device 009: ID 0e8f:1006 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x0e8f idProduct 0x1006 bcdDevice 1.10 iManufacturer 1 HuiJia iProduct 2 USB GamePad iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 34 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 300mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.10 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 202 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 8 Device Status: 0x0000 (Bus Powered)