robo8080のブログ

ロボット製作や電子工作など。

PS3_BlueUSBを使用して、mbedとPS3コントローラをBluetoothで接続する実験。

2011年06月08日 | mbed LPC1768

 

 

PS3_BlueUSBを使用して、mbedとPS3コントローラをBluetoothで接続する実験に成功しましたので、その手順をまとめてみました。

ある程度mbedを使ったことがある方を対象にしていますので、mbedの細かい使い方の説明は省略しています。

1.必要なもの

(1)mbed NXP LPC1768

 

(2)StarBoard Orange または、USBコネクタ(Aタイプ メス )

   StarBoard Orangeではなく、USBコネクタ(Aタイプ メス )だけでも良いです。こちらで詳細に解説されていますので参考にしてください。

 

  

(3)PS3_BlueUSB

(4)Windows serial port driver

(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の最近のブログ記事

関連するリンク

 ・うおーるぼっとをPS3コントローラで動かしてみた。

 


最新の画像もっと見る

8 コメント

コメント日が  古い順  |   新しい順
おかげでつながりました (kenbumono)
2011-06-09 23:20:36
ありがとうございます。
おかげで無事つながりました。
返信する
Unknown (robo8080)
2011-07-20 17:33:57
お役に立ててよかったです。
返信する
質問です (utsunomiya)
2013-04-01 19:07:47
このプログラムにはR3とL3の定義文がありませんでした。それぞれのボタンを利用できるようにする場合はどの部分のプログラムを変えればいいのでしょうか?
よろしくお願いいたします。
返信する
re : 質問です (robo8080)
2013-04-02 13:03:44
補足を追記しましたので、そちらをご覧ください。
返信する
教えてください (Unknown)
2015-06-21 21:13:42
ps3の裏の型番にA2かA1があるとなぜできないのでしょうか?または解決方法がありますか?
返信する
Re:教えてください (roboz80)
2015-06-22 10:16:17
残念ながら、原因も解決方法も不明です。
すみません。
返信する
教えて頂きたいことがあります。 (Unknown)
2016-11-21 20:18:39
ps3の裏の型番にA1やA2と書いてあっても、ペアリングはできるのでしょうか?
返信する
Re:教えて頂きたいことがあります。 (roboz80)
2016-11-26 07:12:10
型番にA1やA2が付いているPS3コントローラを持っていないので分かりません。
すみません。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。