使用無線手把遙控小車範例
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");
}
}
}