PS3_BlueUSBを使用して、mbedとPS3コントローラをBluetoothで接続する実験に成功しましたので、その手順をまとめてみました。
ある程度mbedを使ったことがある方を対象にしていますので、mbedの細かい使い方の説明は省略しています。
1.必要なもの
(1)mbed NXP LPC1768
(2)StarBoard Orange または、USBコネクタ(Aタイプ メス )
StarBoard Orangeではなく、USBコネクタ(Aタイプ メス )だけでも良いです。こちらで詳細に解説されていますので参考にしてください。
(3)PS3_BlueUSB
(5)USB Bluetoothドングル
私が動作確認したのは、次の3つです。
PLANEX Bluetooth ver2.1+EDR BTMICROEDR1XZ
PLANEX Bluetooth Ver3.0+EDR BT-Micro3E1XZ
iBUFFALO Bluetooth4.0+EDR/LE対応 USBアダプタ ブラック BSHSBD08BK (2012.12.20追記)
(6)PS3コントローラ DUALSHOCK3
注意:コントローラの裏に書いてある”MODEL NO. CECHZC2J”の後ろに"A1"と付いている最近のタイプは、うまくBluetooth接続できないという情報を頂きました。(2011.09.07追記)
2.準備
(1)Windows serial port driverをインストールし、シリアル端末が使えるようにしておきます。
(2)PS3_BlueUSBをインポート&ビルドし、実行ファイルをmbedにダウンロードします。
もし、PS3_BlueUSBをインポートしたとき”FatFileSystem”ライブラリが含まれていなかったら、それもインポートしてください。(2012.09.13追記)
(3)USB BluetoothドングルをStarBoard Orangeに挿し、mbedをリセットします。そうするとシリアル端末にいろいろメッセージが出力されますので、USB BluetoothドングルのMACアドレスをメモしておきます。
こういう表示があるはずです。
Local Address: XX:XX:XX:XX:XX:XX
”XX:XX:XX:XX:XX:XX”が、使用しているUSB BluetoothドングルのMACアドレスです。
3.USB BluetoothドングルのMACアドレスをPS3コントローラに登録する。
(1)"AutoEvents.cpp"で接続相手のMACアドレスを変数に格納していますので、これをさっきメモした自分のUSB BluetoothドングルのMACアドレスに書き換えます。
"AutoEvents.cpp"の261行目付近
u8 my_mac[6] = {0x00, 0x02, 0x72, 0xAD, 0xF3, 0x5B}; // mac address of my Bluetooth device
(2)修正したPS3_BlueUSBをコンパイルして、実行ファイルをmbedにダウンロードします。
(3)StarBoard OrangeとPS3コントローラをUSBケーブルで接続し、mbedをリセットします。
mbedとPS3コントローラの接続がうまくいくと、シリアル端末上にPS3コントローラのデータが表示されるはずです。
このときPS3コントローラに、相手となるUSB BluetoothドングルのMACアドレスが書き込まれます。
4.PS3_BlueUSBのソースを修正する。
現在公開されているPS3_BlueUSBは、そのままでは動かないのでソースを修正します。
修正個所は"hci.cpp"のHCI::WriteScanEnable()関数とHCI::AcceptConnection()関数で、下図のように修正します。
5.PS3コントローラを接続する。
(1)修正したPS3_BlueUSBをコンパイルして、実行ファイルをmbedにダウンロードします。
(2)StarBoard OrangeにUSB Bluetoothドングルを挿し、mbedをリセットします。
(3)PS3コントローラの真ん中のポタンを押してしばらくすると、下図のようにPS3コントローラのデータが表示されるはずです。
6.使用例
RCサーボモータを動かしてみた。
移動ロボットを動かしてみた。
7.RCサーボモータを動かすときの例(2013.02.03追記)
RCサーボモータのつなぎ方はここを参考にしてください。この記事では回路の解説は省略します。
Servoライブラリをインポートして、”testshell.cpp”を次のように修正します。
8.おまけ
PS3_BlueUSBを使うときに、ここに載っているPS3コントローラの入出力データのフォーマットが参考になります。
・DUALSHOCK3 入力レポート 解析情報
・DUALSHOCK3 出力リポート 解析情報
補足: ボタンのON/OFFを見たいときは (2013.04.02追記)
PS3コントローラのボタン情報”ButtonState”は、ビット割り付けになっているので次のように使います。
【L3、R3ボタンの例】
u16 ButtonState = ((ps3report*)(data + 1))->ButtonState;
if(ButtonState & 0x0002) { //L3
//L3が押された時の処理
} else {
//L3が離された時の処理
}
if(ButtonState & 0x0004) { //R3
//R3が押された時の処理
} else {
//R3が離された時の処理
}
その他のボタンのビット割り付けは、”8.おまけ”の”DUALSHOCK3 入力レポート 解析情報”を参照してください。
”Button 1”が”ButtonState”の下位8ビット、”Button 2”が上位8ビットになります。
― 以上 -
こちらを参考にさせていただきました、ありがとうございました。
・ベースボードStarBoard Orangeの最近のブログ記事
関連するリンク
すみません。
すみません。
よろしくお願いいたします。
おかげで無事つながりました。