ESP32とPS3コントローラの接続
PS3コントローラにESP32のMACアドレスを書き込む
まずは、ESP32とPS3コントローラをBluetoothで接続するために、ESP32のMACアドレスを取得して、PS3コントローラへ書き込む必要があります。
ESP32のMACアドレスを取得する方法は、ネットを探せばいくらでも出てくるので割愛しますが、今回は簡単なコードを書き込んで、シリアルモニタから取得しました。
一番下の “Mac Address = ******* ” というのがそれですね。
取得したMACアドレスをPS3コントローラに書き込む
PS3へのMACアドレス書き込みは、”SixaxisPairTool”というソフトを使用します。
まずはダウンロードしてインストールして起動という一連の作業をこなしたら、PS3コントローラをUSBケーブルでPCと接続します。
すると下のような画面となります。
上段の”Current Master”が現在PS3コントローラに書き込まれているMACアドレス。
“Change Master”という欄に、先ほど取得したESP32のMACアドレスを入力してUpdate。
これで、PS3コントローラにESP32のMACアドレスが書き込まれました。
Arduino IDE側の準備
これで、PS3コントローラ側の準備完了。あとはArduino IDEでESP32に書き込むソフトを作るだけです。
その前にまずは、ESP32でPS3をコントロールするライブラリをインストールします。
Arduino IDEで、”ツール” ⇒ ” ライブラリを管理 ” ⇒ ライブラリマネージャで”ps3″と検索。
検索結果から、”PS3 Controller Host“をインストール。
これで、必要なライブラリがインストールされました。
あとは、”ファイル” ⇒ “スケッチ例” ⇒ “PS3 Controller Host” から、”Ps3 Demo“を選択。
このソフトを参考に、自分用のアプリに改造していきます。
アプリの作成
まずは、サンプルプログラムで、いろいろ弄ってみましょう。
Ps3Demoをコンパイルして、ESP32に書き込みます。
書き込みが終わったら、PS3コンローラの”PS”ボタンを押してESP32とペアリング。
あとは、いろいろなボタンを押しまくって、シリアルモニタの反応を見て遊んでみます。
今回は、ステアリングを右側のジョイスティックのx軸でコントロールしようと思います。
シリアルモニタとサンプルプログラムをにらめっこした結果、スティックと連動して、以下のようにデジタル値が変化することがわかりました。
これさえわかれば、後はジョイスティックの読み値を、サーボ角度に変換するだけですね。
サーボ角は、自分の環境では、90°を中心に±30°ぐらいと勝手に決めましたので、
ジョイスティックの入力を左へ全開に倒した時(-128)、サーボ角を120°。
右に全開(128)でサーボ角を60°。
なにも入力していないときに90°となるように設定します。
グラフで表すとこんな感じ。ついでに近似式も取得。
これより、ジョイスティックの入力値に、-0.2344を掛けて、90°(初期位置)を足せば、角度に換算できます。
早速、サンプルを参考にしながら、簡単なコードを書いてみました。
#include<esp32servo.h>
#include<ps3controller.h>
#define SERVO_OUT 5 //サーボ用PWM出力を5PINに設定
#define INIT_ANGLE 90 //初期サーボ角
Servo myServo;
int joy_left_y; //左ジョイスティックのy軸読み値
int joy_right_x; //右ジョイスティックのx軸読み値
const float joy2servo = 0.2344f; //ジョイスティック読み値 to サーボ角 変換ゲイン
int servo_angle;
void setup() {
myServo.attach(SERVO_OUT);
myServo.write(INIT_ANGLE); //サーボを初期位置へ
Ps3.begin("##:##:##:##:##:##"); //PS3コントローラに書き込んだMACアドレス ##は環境に合わせて入力
}
void loop() {
if(!Ps3.isConnected())
return;
//左側ジョイスティックのy軸制御 後ほど モータ制御を書く予定...
if( Ps3.event.analog_changed.stick.ly ){
joy_left_y = Ps3.data.analog.stick.ly;
}
//右側ジョイスティックのx軸制御
if( Ps3.event.analog_changed.stick.rx ){
joy_right_x = Ps3.data.analog.stick.rx;
//なくても大丈夫だけど、±5を不感帯とする。
if(abs(joy_right_x) < 5){
joy_right_x = 0;
}
//ジョイスティックの読み値をサーボ角に変換
servo_angle = (int)(-joy2servo * joy_right_x + INIT_ANGLE); //エクセルで求めた計算式
myServo.write(servo_angle);
}
}
動作確認
プログラムを書きこみ動作確認です。
まずは、ジョイスティックを左へ。
おおっ!!画像ではわからないが、ジョイスティックの微妙な動きにサーボがきれいに追従してくる。
予想外にいい動き。手を離せば、直進位置にちゃんと戻る。
次は、ジョイスティックを右へ。こちらもほぼ同じような動きですね。
とりあえず、満足な動きです。
まとめ
以前、ラズパイ4とPS3コントローラのBluetooth接続を試みた時は結構大変でしたが、今回のESP32はそれに比べるとめちゃくちゃ簡単でした。
また、ラズパイとの接続を試みた際に、安価な互換コントローラを使ったのですが接続できず、結局純正コントローラをメルカリで買って何とか接続できた苦い思い出があります。
ESP32ならどうかなと思い互換品で試しましたが、やっぱり純正じゃないと接続できませんでした。。
純正のPS3コントローラならハードオフで1000円ぐらいで買えますので、試す場合は必ず純正品が良いかと。(ただしバッテリは死んでるのがほとんど。純正バッテリはもう入手できないが、互換バッテリなら1000円ぐらいで売ってます)
コメント