以前の記事も併せてご覧ください。
配線図と注意点
L298の5Vと書いてある端子はどこにも結線されていないので注意してください。12Vと書いてある端子から電源を入力します。
ESP32にはモバイルバッテリーでusb端子から電源を供給しました。



コード
コードは以下のとおり。こちらのサイト様 のものにほんの少し改変(主にモータードライバ L298N を使うための設定部分)を加えました。
// https://newstubby.net/diy-rc6/
#include<ESP32Servo.h>
#include <Ps3Controller.h>
#define SERVO_OUT 5 //5PINをサーボ用PWM
//#define DAC1 25 //25PINをDAC
#define ENA 13 //TH追加 13PINをL298NのENA
#define IN1 17 //16PINをTA7291のIN1
#define IN2 16 //17PINをTA7291のIN2
#define VREF_MAX_CW 232 // 正転方向の速度制限 3.3V * 232 /255 = 3.0V
#define VREF_MAX_CCW 127 // 逆転方向の速度制限 3.3V * 127 /255 = 1.64V
#define INIT_ANGLE 90 //初期サーボ角
Servo myServo;
int joy_left_y; //左ジョイスティックのy軸
int joy_right_x; //右ジョイスティックのx軸
int servo_angle; //サーボ角
const int freq_servo = 50; //SS追加
int vref; //TA7291のVref 入力電圧 0~255 0~3.3V
const int freq_dc = 50; //500; //SS追加
const int pwm_channel = 13; //0; //SS追加 0だとサーボモータのチャンネルと同じになってしまった
const int resolution = 8; //SS追加
const float joy2servo = 0.1200f; //ジョイスティック読み値 to サーボ角 変換ゲイン SS修正 0.2344f→0.1200f
void setup() {
//myServo.attach(SERVO_OUT);
myServo.attach(SERVO_OUT, 500, 2400); //
myServo.write(INIT_ANGLE); //サーボを初期位置へ
myServo.setPeriodHertz(freq_servo); //SS追加
Ps3.begin("**:**:**:**:**:**"); //PS3コントローラに書き込んだMACアドレス ##自分のMACアドレスを書き込む
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(ENA, OUTPUT); //
//digitalWrite(IN1,HIGH); //トランジスタでレベル変換(3.3V⇒5V)するので、論理を逆にする。
//digitalWrite(IN2,HIGH); //同上
digitalWrite(IN1, LOW); //
digitalWrite(IN2, LOW); //
vref = 0;
//dacWrite(DAC1,vref);
//dacWrite(pwm_channel,vref); //SS追加
ledcWrite(pwm_channel, vref); //SS追加
ledcSetup(pwm_channel, freq_dc, resolution); //
ledcAttachPin(ENA, pwm_channel); //
Serial.begin(115200); //SS追加 Debug用
}
void loop() {
if(!Ps3.isConnected())
return;
//--------------------------------------//
// 左側ジョイスティックのy軸制御 //
//--------------------------------------//
if( Ps3.event.analog_changed.stick.ly ){
joy_left_y = Ps3.data.analog.stick.ly;
//ジョイスティック値をVREF値へ変換
vref = abs(joy_left_y * 2);
//------正転制御-------//
if(joy_left_y < -10){
//vrefの制限
if(vref > VREF_MAX_CW)
vref = VREF_MAX_CW;
//dacWrite(DAC1,vref);
ledcWrite(pwm_channel, vref); //SS追加
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
}
//------逆転制御--------//
else if(joy_left_y > 10){
//vrefの制限
if(vref > VREF_MAX_CCW)
vref = VREF_MAX_CCW;
//dacWrite(DAC1,vref);
ledcWrite(pwm_channel, vref); //SS追加
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
}
//------停止処理--------//
else{
//dacWrite(DAC1,0);
ledcWrite(pwm_channel, 0); //SS追加
//digitalWrite(IN1,HIGH);
//digitalWrite(IN2,HIGH);
digitalWrite(IN1,LOW); //
digitalWrite(IN2,LOW); //
delay(10); //ジョイスティック値が±5に入ったら10ms待つ。急激な正・逆回転の切り替えを防止する
}
Serial.println("vref= "); //SS追加 Debug用
Serial.println(vref); //SS追加 Debug用
Serial.println("pwm_channel= "); //SS追加 Debug用
Serial.println(pwm_channel); //SS追加 Debug用
}
//------------------------------------//
// 右側ジョイスティックの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);
servo_angle = (int)(joy2servo * joy_right_x + INIT_ANGLE); //SS追加 +/-反転
myServo.write(servo_angle);
}
Serial.println("servo_angle="); //SS追加 Debug用
Serial.println(servo_angle); //SS追加 Debug用
}
遊んでみた
完成しました!!やっぱり市販のラジコンを買ってくるのではなく,自分で作って遊ぶのも楽しいものです。
ブレッドボードのままで,配線もむき出しですが,そこはあまり気にならないタチなのでこれにてラジコンバギー作成はクローズです。



コメント