ESP32 と TAMIYAのバギー工作基本セットでラジコン作成(その③:PS3のコントローラーでサーボモータとDCモーターを制御,トラブルと対応)

ESP32

その② からの続きです。

PS3のコントローラーでサーボモータのみを制御

コードは こちらのサイト様 のものをほぼ流用です。Debugのためシリアル通信表示の行を追加しました。

#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アドレス ##は環境に合わせて入力       
    Serial.begin(115200);           //Debug用
}

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);
    Serial.println(servo_angle);           //Debug用
  }
}

以下の問題が発生しました。

  • 問題1:コントローラーとの接続が即座に切れる(ランプが消灯する)
    Debugのためシリアル通信を確認すると,”Brownout detector was triggered” のメッセージが出ていた。
    これはESP32のUSBの電源供給が不足しているために出るメッセージらしい。サーボモータとESP32で別々の電源を準備することで解決しました。
    ”Brownout detector was triggered” のメッセージ。USBの電源供給不足。
  • 問題2:サーボが小刻みに色々な方向を向く(暴れる)
    サーボとESP32のGNDを統一していないことが原因でした。基本的なことですが,うっかり配線を忘れていました。

PS3のコントローラでサーボモータとDCモータの両方を制御

こちらのサイト様 のコードをでサーボモータとDCモータを動かそうとしましたが,私の環境ではうまくいきませんでした。症状は,DCモータは正常に左スティックで動くが、同時にサーボモータも動いてしまい,また右スティックでサーボが少ししか動かない,というものです。
原因はPWM信号のchannelの混線でした。モータードライバ(L298N)に入力されるPWMのchannelを指定しておらず,サーボモータとモータードライバのPWM信号どちらのchannelも0となっていたようです。モータドライバに入るPWMのchannelを 0 から 13 にすることで解決しました。

ESP32で複数のPWM信号を出力する際のchannel指定の方法は こちらの記事 をご確認下さい。

以前の記事も併せてご覧ください。

その①はこちら

その 1.5 はこちら

その②はこちら

その④はこちら

コメント

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