USB HIDジョイスティックでPS3をコントロールする
.
USBマウス&キーボードのサンプル USBMouse を改良して作ったジョイスティックでPS3をコントロールするプログラムです。
概要
PS3ではUSB HID (Human Interface Device) のキーボードやマウス、ジョイスティックを使うことができます。
mbedにはUSB通信用のポートが専用に用意されているため、USBコネクタorケーブルをそのままつなげれば、PS3で使えるUSBジョイスティックを簡単に作ることができます。
mbedの高い外部接続性を活かせば、PS3用のオリジナルコントローラやコマンド自動入力装置の作成、ネットワークからのコントロールなどが可能になります。もちろんPCでも使えますよ!
HIDリポートディスクリプタ
HIDの入出力フォーマットを定義するHIDリポートディスクリプタをジョイスティック用に作らないといけないのですが、一から作るのは大変だったため、JC-PS101USVというPS2用のコントローラーをUSB接続に変換するアダプタのものから、下記のように必要な部分だけ拝借しました。これをバイナリ表現したデータをプログラム中で作成します。
Usage Page (Generic Desktop) Usage (Joystick) Collection (Application) Usage (Pointer) Collection (Physical) Usage Page (Button) Usage Minimum........... (1) Usage Maximum........... (12) Logical Minimum......... (0) Logical Maximum......... (1) Physical Minimum........ (0) Physical Maximum........ (1) Report Size............. (1) Report Count............ (12) Input................... (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bitfield) Usage Page (Generic Desktop) Usage (Hat Switch) Logical Minimum......... (0) Logical Maximum......... (7) Physical Minimum........ (0) Physical Maximum........ (315) Unit.................... (20) Report Size............. (4) Report Count............ (1) Input................... (Data, Variable, Absolute, No Wrap, Linear, Preferred State, Null State, Bitfield) Usage Page (Generic Desktop) Usage (X) Usage (Y) Usage (Z) Usage (Rz) Logical Minimum......... (0) Logical Maximum......... (255) Physical Minimum........ (0) Physical Maximum........ (255) Unit.................... (0) Report Size............. (8) Report Count............ (4) Input................... (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bitfield) End Collection End Collection
送信データのフォーマット
このHIDリポートディスクリプタによって定義される送信データのフォーマットは以下になります。B番号
はボタン番号を表します。
プログラム内で、この6バイト分のデータを入力状況に応じて作成し、定期的にUSBホストに転送しています。
| |bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0| |byte0|B08 |B07 |B06 |B05 |B04 |B03 |B02 |B01 | |byte1|Hatswitch(0-7,0xf) |B12 |B11 |B10 |B09 | |byte2|X (-128:0x00 ... 0:0x80 ... +127:0xff) | |byte3|Y (-128:0x00 ... 0:0x80 ... +127:0xff) | |byte4|Z (-128:0x00 ... 0:0x80 ... +127:0xff) | |byte5|Rz(-128:0x00 ... 0:0x80 ... +127:0xff) |
接続
mbed | USBコネクタ | ジョイスティック |
---|---|---|
VIN | 1: Vbus | |
USB D- | 2: D- | |
USB D+ | 3: D+ | |
GND | 4: GND | 可変抵抗のGND |
VOUT | スイッチや可変抵抗のVCC | |
P5-P16 | ボタン用スイッチ | |
P17-P20 | アナログスティック用可変抵抗 | |
P21-P24 | 十字キー用スイッチ |
アサイン
mbed | PC | PS3 |
---|---|---|
P5 | ボタン1 | □ |
P6 | ボタン2 | △ |
P7 | ボタン3 | × |
P8 | ボタン4 | ○ |
P9 | ボタン5 | L1 |
P10 | ボタン6 | R1 |
P11 | ボタン7 | L2 |
P12 | ボタン8 | R2 |
P13 | ボタン9 | SELECT |
P14 | ボタン10 | START |
P15 | ボタン11 | L3 |
P16 | ボタン12 | R3 |
P17 | X軸 | 左アナログスティックX軸 |
P18 | Y軸 | 左アナログスティックY軸 |
P19 | Z軸 | 右アナログスティックX軸 |
P20 | Z回転軸 | 右アナログスティックY軸 |
P21 | ハットスイッチ上 | 十字キー上 |
P22 | ハットスイッチ下 | 十字キー下 |
P23 | ハットスイッチ左 | 十字キー左 |
P24 | ハットスイッチ右 | 十字キー右 |
プログラム
[Not found]
#include "mbed.h" #include "usbhid.h" DigitalOut led(LED1); BusIn buttons( p5, p6, p7, p8, // PS3: Square, x, o, Triangle p9, p10, p11, p12, // PS3: L1, R1, L2, R2 p13, p14, p15, p16 // PS3: SELECT, START, L3, R3 ); AnalogIn analog_x(p17); // PS3: Left Analog Stick X-axis AnalogIn analog_y(p18); // PS3: Left Analog Stick Y-axis AnalogIn analog_z(p19); // PS3: Right Analog Stick X-axis AnalogIn analog_rz(p20); // PS3: Right Analog Stick Y-axis BusIn stick( p21, p22, p23, p24 // PS3: Up, Down, Left, Right ); USBJoystick joystick; int main() { while(1) { signed char x = (analog_x.read_u16() >> 8) - 0x80; signed char y = (analog_y.read_u16() >> 8) - 0x80; signed char z = (analog_z.read_u16() >> 8) - 0x80; signed char rz = (analog_rz.read_u16() >> 8) - 0x80; joystick.joystick(stick.read(), buttons.read(), x, y, z, rz); led = (buttons > 0 || stick > 0) ? 1 : 0; wait(0.01); } }
USBMouse に含まれる usbhid
クラスは今回の目的には継承しづらい形で実装されているため、やっつけで usbhid.h
と usbhid.cpp
に追記する形で実装しました…。どなたかもう少しきれいに実装しなおしてもらえるとうれしいです。
課題
このジョイスティックを使ってPS3でPS2のゲームを遊ぼうとすると、PSボタンがないために操作不能になります。PS3でPSボタンを押したときと同じ動作をするにはどうすればよいか調査中です。ボタンの数を増やしてもだめでした。どなたかご存知でしたら教えて下さい。
4 comments on USB HIDジョイスティックでPS3をコントロールする:
Please log in to post comments.
Lerche wrote:
So the mbed's USB port connect directly to PS3?
No. Please use mbed's USB D+/- pins (p31/p32), GND pin, and VIN pin with another USB cable or connecter.