2013年3月19日火曜日

Raspberry Pi で Dualshock3 (Bluetooth接続ゲームコントローラ)

 さて、前回、手元にあった Microsoftの Xbox 360 Wireless Controller for Windows を使って ROBO XERO のサーボを動かしてみましたが、XboxのコントローラはPC側送受信機(PCのUSBにつながる方)が大きい(1.5mくらいのUSBケーブルの先に40mm×50mmくらいの箱)ので、もう少し何とかならないかな?というところで、Bluetoothで接続できるようなゲームコントローラはどうかと思い、試して見ることにしました。世の中でBluetoothで接続できるゲームコントローラというと、やっぱり、WiiのコントローラとPlaystaiotn の Dualshock3あたりが有名ドコロではないでしょうか。
 そこで、今回は Dualshock3の利用に挑戦してみようと思います。まずは、Bluetoothを使えるようにしないといけません。そこで、Raspberry PiでBluetoothを使うために Planex の BT-Micro3H2X を使うことにしました。このアダプタは無線LANとBluetoothのコンボになっているため、1つのUSBポートで無線LANとBluetoothを利用できるようになります。無線LANとBluetoothが1つ(近く)にあって大丈夫なのか?っていうのはありますが、特に飛距離・感度や通信速度を気にするわけではないので、USBポートを節約できるっていう点をとることにして、既存のUSB無線LANアダプタを交換することにしました。
 で、今回も、Google先生にご教示頂くと、既にRaspberry PiでDualShock3を動かしている方がいらっしゃいましたので、そちらを丸々参考とさせて頂きました。

 まずは、Bluetoothを使えるようにするために、

   sudo apt-get update
   sudo apt-get install bluetooth bluez-utils bluez-compat bluez-hcidump
   sudo apt-get install libusb-dev libbluetooth-dev

で、Bluetooth 周りのインストールを行います。
 これで、lsusb でドングルが認識されていることと、

   /etc/init.d/bluetooth status

として、bluetooth in running. のメッセージが返ってくることを確認します。

 この先は、さきのこちらのページ を見て頂ければ、手順が親切に解説されていますが、一応、写しを掲載させて頂きます。
 まず、ペアリング用のツールを準備します。

   wget "http://www.pabr.org/sixlinux/sixpair.c" -O sixpair.c

として、ここからペアリングツールをおとしてきて、コンパイルします。

   gcc -o sixpair sixpair.c -lusb

コンパイルが通ったら、一旦、USBケーブルでDualShock3とRaspberry Piを接続して、




PSボタンを押して、DualShock3のスイッチを入れて、

   sudo ./sixpair

とすると、

   Current Bluetooth master: xx:xx:xx:xx:xx:xx
   Setting master bd_addr to: xx:xx:xx:xx:xx:xx

のような表示が出てペアリングが行われます。DualShock3とRaspberry Pi のUSBケーブルを外します。

 次に QtSixA のソースコードをダウンロードして、そのうちの、sixadの部分をコンパイルします。

   wget "https://sourceforge.net/projects/qtsixa/files/QtSixA%201.5.1/QtSixA-1.5.1-src.tar.gz/download” -O QtSixA-src.tar.gz

展開します。

   tar zxvf QtSixA-src.tar.gz

sixad のディレクトリに移動して、コンパイルしてインストールします。

   cd QtSixA-1.5.1/sixad
   make
   sudo make install

sixadを起動します。

   sudo sixad -start

DualShock3のPSボタンを押して接続します。Connected Sony Entertainment Wireless Controllerと表示されて、接続されます。とりあえず、

   cat /dev/input/js0

して、コントローラを傾けたり、ボタンやアナログスティックを操作すると何かしらのバイナリっぽいデータが画面に出力されるのが確認できるはずです。Ctrl+Cで中断します。



 これで、Xboxのレシーバをぶら下げた状態に比べると随分スッキリしました。USBポートも片方空いた状態にできました。