gooブログはじめました!

写真付きで日記や趣味を書くならgooブログ

esp32とps3とスパイカメラを使ってラジコン戦車をつくる。(4)

2024-09-26 16:05:15 | esp32
左右のレバーで独立して左右のクローラを動かしていたが、動き始めで直進させるのが難しかったので左レバーが直進、右レバーが旋回に操作方法を変えた。



こちらの方が操作しやすい。
ラジコンと本物の建機では違うようだ。
ユンボなどは左右のクローラを動かす。

ただ、ピボットターンをできなくした。

カメラ映像を見ながらの運転はむずかしい。
なんとかできたが慣れの問題だろうか。

次は自動走行。
方式がいろいろあるみたいだ。

一応プログラムをのせておく。

#include <Ps3Controller.h>

int STR,RXX,LYY,BR1,BL1,BBL1;
int MIN=10;
int MAX=128;
int MAX1=200;//400
int C_MAX=410; //=1/((1/50*1000)/2^12)
int C_NE=307; //=1.5/((1/50*1000)/2^12)
int C_MIN=200; //=2/((1/50*1000)/2^12)
uint8_t RY1=14;
uint8_t RY2=27;
uint8_t LY1=26;
uint8_t LY2=25;
uint8_t C_PIN=12;
long R_SPEED,L_SPEED,SPEED;
int CAMERA,CAMERA1;
uint32_t freq=12800;
uint8_t res=8;

void setup()
{
pinMode(LY1,OUTPUT);
pinMode(LY2,OUTPUT);
pinMode(RY1,OUTPUT);
pinMode(RY2,OUTPUT);
pinMode(C_PIN,OUTPUT);

Serial.begin(9600);
Ps3.begin("7C:9E:BD:E9:A2:72"); //1.でメモしたmac adresに修正
Serial.println("Ready");

ledcAttach(LY1, freq, res);//pwm信号 ledcSetup(ピン番号, 周波数, 分解能)
ledcAttach(LY2, freq, res);//pwm信号
ledcAttach(RY1, freq, res);//pwm信号
ledcAttach(RY2, freq, res);//pwm信号
ledcAttach(C_PIN, 50, 12);//pwm信号 =1/((1/50*1000)/2^12)
ledcWrite(LY2,0);
ledcWrite(LY1,0);
ledcWrite(RY1,0);
ledcWrite(RY2,0);
ledcWrite(C_PIN,C_NE);
}
void loop(){
if (Ps3.isConnected()){
LYY= Ps3.data.analog.stick.ly;
RXX= Ps3.data.analog.stick.rx;
SPEED=map(LYY,-MAX,MAX,-MAX1,MAX1);
STR=map(RXX,-MAX,MAX,-MAX1,MAX1);
BL1=Ps3.data.button.l1;
BR1=Ps3.data.button.r1;
BBL1=Ps3.data.button.l2;
CAMERA=-BL1+BR1+CAMERA;
if (BBL1==1) {CAMERA=0;}

if (abs(SPEED)<=MIN){SPEED=0;}
if (abs(STR)<=MIN) {STR=0;}

if (STR>MIN){ //left turn
L_SPEED=SPEED*(200-STR)/200;
if (abs(L_SPEED)<MIN){L_SPEED=0;}
R_SPEED=SPEED;
}

else{ //right turn
R_SPEED=SPEED*(STR+200)/200;
if (abs(R_SPEED)<MIN){R_SPEED=0;}
L_SPEED=SPEED;
}

if(SPEED>0){ //forward
ledcWrite(LY2,0);
ledcWrite(LY1,abs(R_SPEED));
ledcWrite(RY2,0);
ledcWrite(RY1,abs(L_SPEED));
}

else { //reverse
ledcWrite(LY1,0);
ledcWrite(LY2,abs(R_SPEED));
ledcWrite(RY1,0);
ledcWrite(RY2,abs(L_SPEED));
}

//CAMERA
CAMERA1=CAMERA/400+C_NE;
if (CAMERA1<C_MIN){CAMERA1=C_MIN;}
if (CAMERA1>C_MAX){CAMERA1=C_MAX;}
ledcWrite(C_PIN,CAMERA1);
}
}