esp32とps3コントローラとスパイカメラでラジコン戦車

記事
IT・テクノロジー
esp32とps3コントローラとスパイカメラでラジコン戦車を作った。
材料
esp32
モータードライバ
ps3コントローラ
スパイカメラ(赤外線付き)
マブチモーター2個
サーボモーター
IMG_20240930_095130.jpg

操作方法 左ジョイスティクで前後進
     右ジョイスティクで左右
1ボタンでカメラが左右に首振り
左2ボタンでカメラは正面を向く

カメラの代わりに戦車の砲塔をつける。
こちらの方が少しは戦車らしくなる。
IMG_20240930_104055.jpg


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

CAMERA1=CAMERA/400+C_NEは、delay関数を使えばもっとましになるらしい。


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら