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);
}
}

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

2024-09-24 19:00:20 | esp32
カメラを一晩充電したら、隣の部屋まで往復できた。
電池切れだったたらしい。
外部電源を作ってやればいいのだけど配線の取り回しが面倒。

途中で画像がきれることもあったが使える。

これができたからと言ってなにもしないのだけど。

なんかうれしい。

狭いところに入っていけるし暗くても見えるからなんか役にたつかな

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

2024-09-24 00:48:37 | esp32
動いたのだけど、カメラの調子が悪い。
いいところ
1)つながっていれば画像は鮮明
2)暗闇でも赤外線で使える

悪いところ
1)2mほど離れると切れてしまう。
2)車両振動で画像がぶれる
3)カメラのon/offがわからない

安物のカメラの為なのだろうか?
高いカメラを買うか悩み時。

走行操作
左右独立でジョイスティクを動かしているのでスタートが少しぶれる。
右を直進、左を旋回にすれば楽かもしれないが回転センサを使っているわけではないので、どこまでうまく行くかわからない。
やってみるしかない


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

2024-09-19 14:42:21 | esp32
esp32とps3とスパイカメラを使ってラジコン戦車をつくる。

材料
タミヤの模型
esp32(スイッチサイエンス製)
モータードライバー
ps3コントローラ(中古)
サーボモーター(サンワ sx101z)
マブチモーター
スパイカメラ(バッテリー内蔵)
その他 配線、カプラー、電池

esp32用プログラム

//*****************************************************
#include <Ps3Controller.h>

int RY,LY,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;
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(115200);
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()){

LY= Ps3.data.analog.stick.ly;
RY= Ps3.data.analog.stick.ry;
L_SPEED=map(LY,-MAX,MAX,-MAX1,MAX1);
R_SPEED=map(RY,-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;}

//left speed
if (abs(L_SPEED)<=MIN){//50以下なら 速度は0
ledcWrite(LY2,0);
ledcWrite(LY1,0);
}
else if (L_SPEED>MIN){
ledcWrite(LY2,0);
ledcWrite(LY1,abs(L_SPEED));
}
else {
ledcWrite(LY1,0);
ledcWrite(LY2,abs(L_SPEED));
}

//right speed
if (abs(R_SPEED)<=MIN){
ledcWrite(RY1,0);
ledcWrite(RY2,0);
}
else if (R_SPEED>MIN){
ledcWrite(RY2,0);
ledcWrite(RY1,abs(R_SPEED));
}
else {
ledcWrite(RY1,0);
ledcWrite(RY2,abs(R_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);
}
}

これで動いた。