その② からの続きです。
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指定の方法は こちらの記事 をご確認下さい。
以前の記事も併せてご覧ください。



コメント