使用無線手把遙控小車範例

ESP32CAM 當控制板,使用無線手把來控制的範例程式


接線圖如上,目前採自行 DIY 焊接來驗證

  • 主電源為 5V,供應 ESP32CAM 及馬達驅動所需的電. 採 9V 輸入透過 DC-DC (可用 MP1584 或 Mini360 來降壓)

  • 馬達驅動板可用 DRV8833 或 L9110S 來驅動兩顆 N20 DC 馬達

  • 無線手把為 PS3 遙桿,透過 https://github.com/jvpernis/esp32-ps3 library 來用藍牙對接及遙控.

// Mini Car (Using ESP32CAM + DRV8833 + PS3) by Mason E & D (2022/5/15)

// Author : Mason, masonchen1003@gmail.com

// FB : https://www.facebook.com/mason.chen.1420


#include <Ps3Controller.h> // 包含 ps3控制的 library


// 宣告 DRV8833/L9110 用到的腳位,視車體設計再自行更換腳位

#define MotorA1 12

#define MotorA2 13

#define MotorB1 15

#define MotorB2 14


void Move_Forward() {

digitalWrite(MotorA1, HIGH);

digitalWrite(MotorA2, LOW);

digitalWrite(MotorB1, HIGH);

digitalWrite(MotorB2, LOW);

delay(50);

}


void Move_Backward() {

digitalWrite(MotorA1, LOW);

digitalWrite(MotorA2, HIGH);

digitalWrite(MotorB1, LOW);

digitalWrite(MotorB2, HIGH);

delay(50);

}


void Move_TurnRight() {

digitalWrite(MotorA1, LOW);

digitalWrite(MotorA2, HIGH);

digitalWrite(MotorB1, HIGH);

digitalWrite(MotorB2, LOW);

delay(50);

}


void Move_TurnLeft() {

digitalWrite(MotorA1, HIGH);

digitalWrite(MotorA2, LOW);

digitalWrite(MotorB1, LOW);

digitalWrite(MotorB2, HIGH);

delay(50);

}


void Motor_Stop() {

digitalWrite(MotorA1, LOW);

digitalWrite(MotorA2, LOW);

digitalWrite(MotorB1, LOW);

digitalWrite(MotorB2, LOW);

}


int rX; int rY; int lX; int lY; // PS3 手把遙桿的 X 軸 / Y 軸


void setup() {

Serial.begin(115200);

Ps3.begin("01:02:03:04:05:06"); // 換成你自己手把的 address

pinMode(MotorA1, OUTPUT); //MotorA1

pinMode(MotorA2, OUTPUT); //MotorA2

pinMode(MotorB1, OUTPUT); //MotorB1

pinMode(MotorB2, OUTPUT); //MotorB2

Motor_Stop();


// setting joystick led

Ps3.setPlayer(1);

Serial.println("Ready.");

}


void loop() {

// PS3 control

if ( Ps3.data.button.up ) {

Move_Forward();

}

else if ( Ps3.data.button.down ) {

Move_Backward();

}

else if ( Ps3.data.button.left ) {

Move_TurnLeft();

}

else if ( Ps3.data.button.right ) {

Move_TurnRight();

}

lX =(Ps3.data.analog.stick.lx); // 讀取左遙桿的 X 值

lY =(Ps3.data.analog.stick.ly); // 讀取左遙桿的 Y 值

rX =(Ps3.data.analog.stick.rx); // 讀取右遙桿的 X 值

rY =(Ps3.data.analog.stick.ry); // 讀取右遙桿的 Y 值


// 左遙桿控制車子

if (abs(lX) <30 && abs(lY)<30) {

Motor_Stop() ;

Serial.println("s");

} else if (abs(lX) > abs(lY)) {

if (lX > 20) { // r

Move_TurnRight();

Serial.println("r");

} else { // l

Move_TurnLeft();

Serial.println("l");

}

} else {

if (lY < -20) {

Move_Forward();

Serial.println("f");

} else {

Move_Backward();

Serial.println("b");

}

}

}