試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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つのコントローラの同時使用についてはテストしていない。

PSX-CV02上のSCPH-10010のボタンと番号の対応
ボタンコントローラIコントローラII
△(さんかく/triangle)012
○(まる/circle)113
×(ばつ/cross)214
□(しかく/square)315
L2416
R2517
L1618
R1719
SELECT820
START921
L31022
R31123

アナログスティックについて

PlayStation 2上と同様、「ANALOG」ボタンを押してランプが点いている状態でアナログスティックが使用できる。
コントローラIの左スティックはX(軸0)とY(軸1)として使用できるが、右スティックでは5と2のように番号が飛んでいるところがある。これは割り当て変更で修正できるが、その方法/手順は(ボタン番号の再割り当てについてと一緒に)別記事にて扱う。

振動機能(未対応)について

PLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02Windows上で専用のドライバをインストールすることで振動機能が使用できるが、GNU/Linux上では、Linux 2.6.27.24(Mandriva Linux 2009.0)の時点ではfftestffcfstressなどのテストプログラムは正しく動作しない(振動しないかエラーになるかのどちらか)。

$ 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)

追記:PS3コントローラについて

(2011/11/3)PS3のコントローラはLinux 3.0時点では標準でサポートされており、有線接続時にはそのまま利用可で、無線ではSixA Daemon(Sixad)と必要に応じてGUIQtSixAを用いる(Bluetoothアダプタとカーネル側のBluetoothサポートが必要)。

関連記事:

使用したバージョン:

  • Linux 2.6.27.24
  • input-utils(jstestやfftestなどのパッケージ) 20061008

*1:360でないほうのXbox向けのコントローラに対するドライバも存在はするようだが、コネクタ形状の関係で直接USBポートに入れることはできず、所有もしていない

*2:将来のバージョンのLinuxカーネルで動作するようになる可能性はある