需要用到的硬件
此项目需要用到的硬件设备有Esp32芯片、3-5V电源模块、电机驱动模块、孔面包板、电机马达、3.7V锂离子充电电池、杜邦线、红外模块、舵机
小车固件各位可以去某宝搜索智能小车,各式各样的小车供以选择。
软件开发环境
开发软件:Arduion IDE 搭建有esp32开发环境
实现功能
此次项目要实现的主要功能就是:用PWM驱动四个电机,并能调速,实现转向功能;安装红外对管模块,实现红外循迹功能,能走8字;
主要代码
代码需要根据大家的连线更改端口号,在不同硬件也需要更改不同的参数。(大家在烧写代码的时候一定要关闭小车电源,不然很容易烧坏芯片)
#include <ESP32Servo.h>
int La, Lb, Ra,Med, Rb;
int val = 0;
Servo servo;
int SERVO_PIN = 13;
int IN1=25,IN2=33,IN3=27,IN4=26,R1=2,R2=4,R3=16,R4=5,R5=17;//定义端口
//int IN1=25,IN2=33,IN3=27,IN4=26,ENA=18,ENB=19,R1=2,R2=4,R3=16,R4=5,R5=17;//定义端口
void turnleft();
void turnright();
void straight();
void straightturnright();
void straightturnleft();
void setup() {
pinMode(IN1, OUTPUT);//右
pinMode(IN2, OUTPUT);//右
pinMode(IN3, OUTPUT);//左
pinMode(IN4, OUTPUT);//左
//pinMode(ENA, OUTPUT);
//pinMode(ENB, OUTPUT);
pinMode(R1, INPUT);
pinMode(R2, INPUT);
pinMode(R3, INPUT);
pinMode(R4, INPUT);
pinMode(R5, INPUT);
ledcSetup(5, 12000, 8);
ledcSetup(6, 12000, 8);
servo.attach(SERVO_PIN);
}
void straight() {
digitalWrite(IN1, HIGH);//控制右轮滚动
digitalWrite(IN2, LOW);//右边轮胎前进后退,H后退,L前进
digitalWrite(IN3, LOW);//控制左轮前进后退
digitalWrite(IN4, HIGH);//控制左轮滚动
}
void straightturnleft() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void straightturnright() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void turnleft() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void turnright() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
//逻辑函数
void loop() {
La = digitalRead(R1);
Lb = digitalRead(R2);
Med = digitalRead(R3);
Ra = digitalRead(R4);
Rb = digitalRead(R5);
if (La == 1 && Lb == 1 && Med == 0 && Ra == 1 && Rb == 1) {
straight();
servo.write(90);
}
if (La == 1 && Lb == 0 && Med == 1 && Ra == 1 && Rb == 1) {
straightturnright();
servo.write(70);
}
if (La == 0 && Lb == 1 && Med == 1 && Ra == 1 && Rb == 1) {//左一
turnleft();
servo.write(60);
analogWrite(IN4,100);
analogWrite(IN1,160);
}
if (La == 1 && Lb == 1 && Med == 1 && Ra == 0 && Rb == 1) {
straightturnleft();
servo.write(110);
}
if (La == 1 && Lb == 1 && Med == 1 && Ra == 1 && Rb == 0) {//左二
turnright();
servo.write(130);
analogWrite(IN4,160);
analogWrite(IN1,100);
}
}