【自作ラジコン】バギー工作基本セットをESP32 + PS3コントローラでラジコン化する その5

自作ラジコン

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円ぐらいで売ってます)

続く。

コメント

タイトルとURLをコピーしました