项目描述:
本项目依托Funpack第二季第三期活动的任务三:遥控小车。使用FireBeetle ESP32-E开发板作为控制单元,制作一台可以遥控的小车,遥控方式可以是蓝牙、红外、espnow,wifi等方式实现车辆前进后退转向等功能。
本项目基于DFRobot公司的FireBeetle ESP32-E开发板,实现了蓝牙遥控小车的制作,本项目通过点灯科技APP实现蓝牙遥控小车前进、后退、转向。并且通过红外模块实现了距离指示灯的亮灭。取得了良好的效果,具有一定的价值。
本项目基于DFRobot公司的FireBeetle ESP32-E模块通过VScode编译器进行代码的编写,使用DFRobot公司的红外模块进行车辆与前方距离的判断来进行指示灯的亮灭,ESP32通过电机驱动模块驱动四颗N20减速电机,来驱动小车前进后退,通过差速进行转向。通过点灯科技APP使用手机蓝牙,对其APP的摇杆组件进行操作,来实现蓝牙遥控小车的前进、后退、转向。
主控介绍:
FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。通过和IFTTT等物联网平台的连接,你可轻松制作出你独有的特色物联网智能家居系统。FireBeetle ESP32-E深度支持ArduinoIDE编程,并且即将支持Scratch图形化编程及MicroPython编程。
引脚说明:
FireBeetle ESP32-E 最多有 22 个物理 GPIO,其中 34-39 号管脚仅作为输入管脚,其他的可以作为输入和输出管脚。所有逻辑电压均为 3.3V。
- Control:Fire Beetle的的使能以及复位引脚
- Touch:具有电容触摸功能的引脚
- Analog:具有模拟功能的引脚
- Port PIN:芯片默认的物理引脚号,可直接使用此数字控制对应引脚
- IDE:在 arduino IDE中,Fire Beetle 将引脚号码进行映射,也可直接使用此符号控制对应引脚
- RTCPIN:Fire Beetle具有低功耗功能,在进入deepsleep模式下仅RTC pin可以被使用
- Power:Fire Beetle将供电电源以及稳压后的3.3V电源通过引脚引出,方便用户使用
- GND:Fire Beetle的公共接地引脚
硬件设计原理:
本项目使用4颗N20减速电机,相同一侧进行并联,电机正负极分别连接至电机驱动模块,电机驱动模块采用单独电源供电与主控电源分离,保证了主控供电电流的稳定性,电池为3.7V锂电池。FireBeetle ESP32-E主控输出PWM控制电机驱动模块。红外传感器进行对小车前方障碍物距离的判断,若小于15cm则LED指示灯亮起。
电机驱动模块:
FireBeetle ESP32-E开发板D2引脚接IN1、D3引脚接IN2、D7引脚接IN3、D9引脚接IN4,进行控制电机的运动。
APP设置:
将代码烧录进去后,浏览器搜索https://diandeng.tech/dev下载点灯科技APP,并注册,按以下步骤操作
图形说明:
文字说明:
1、将APP下载完成后进行注册,点击右上角加号。
2, 点击左侧arduino图标的独立设备。
3,首先要将代码烧录至单片机后将单片机供电,使其蓝牙打开,然后打开手机的蓝牙,点击蓝牙接入选择esp32的蓝牙。
4,点击右上角编辑按钮
5,选择右下角摇杆组件
6,点击刚加入的摇杆组件
7,将原本的组件键名改为大写的A,然后点击右上角的对号。
8,点击右上角的保存,然后点击从右往左数第3个连接按钮
主要代码:
#define A1 0
#define A2 1
#define B1 2
#define B2 3
#define IN1 D2
#define IN2 D3
#define IN3 D7
#define IN4 D9
#define JOY_1 "JOYKey"
const int InfraredSensorPin = 4; // Connect the signal pin to the digital pin 4
const int LED = 12;
BlinkerJoystick JOY1("A");
void joystick1_callback(uint8_t xAxis, uint8_t yAxis)
{
int L, R, X = xAxis, Y = yAxis;
X = map(xAxis, 0, 255, -128, +128);
Y = map(yAxis, 0, 255, -128, +128);
if (Y < 0)
{
if (X > 0)
R = abs(Y) - X;
else
R = abs(Y);
}
if (Y > 0)
{
if (X > 0)
R = abs(Y) - X;
else
R = abs(Y);
}
R = R * 2;
if (Y < 0)
{
if (X < 0)
L = abs(Y) - abs(X);
else
L = abs(Y);
}
if (Y > 0)
{
if (X < 0)
L = abs(Y) - abs(X);
else
L = abs(Y);
}
L = L * 2;
L = map(L, 0, 255, 50, 255); //两轮使用
R = map(R, 0, 255, 50, 255);
if (L < 0)
L = 0;
if (R < 0)
R = 0;
if (xAxis == 128 && yAxis == 128)
{
ledcWrite(A1, 0);
ledcWrite(A2, 0);
ledcWrite(B1, 0);
ledcWrite(B2, 0);
}
else
{
if (Y < 20 && Y > -20)
{
if (X > 0)
{
ledcWrite(A2, map(X, 0, 128, 150, 255));
ledcWrite(B1, map(X, 0, 128, 150, 255));
}
if (X < 0)
{
ledcWrite(A1, map(X, -128, 0, 150, 255));
ledcWrite(B2, map(X, -128, 0, 150, 255));
}
}
else
{
if (Y < 0)
{
ledcWrite(A1, R);
ledcWrite(B1, L);
}
if (Y > 0)
{
ledcWrite(A2, R);
ledcWrite(B2, L);
}
}
Serial.printf("x=");
Serial.println(X);
Serial.printf("y=");
Serial.println(Y);
Serial.printf("L=");
Serial.println(L);
Serial.printf("R=");
Serial.println(R);
}
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
pinMode(InfraredSensorPin, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
Blinker.begin();
JOY1.attach(joystick1_callback);
ledcSetup(A1, 1200, 8);
ledcSetup(A2, 1200, 8);
ledcSetup(B1, 1200, 8);
ledcSetup(B2, 1200, 8);
ledcAttachPin(IN1, A1);
ledcAttachPin(IN2, A2);
ledcAttachPin(IN3, B1);
ledcAttachPin(IN4, B2);
}
void loop()
{
if (digitalRead(InfraredSensorPin) == LOW)
digitalWrite(LED, HIGH);
else
digitalWrite(LED, LOW);
Blinker.run();
}
代码说明:由于所使用的红外传感器返回值为数字量,所以使用digitalRead()函数来检测前方是否有障碍物。当读取引脚为低电平时说明前方15cm内有障碍物,随着指示灯亮起。
功能展示及说明:
心得体会:
通过对本项目的学习,我对ESP32-E模块又有了进一步的了解,对蓝牙传输信息有了更深的理解和感悟,很感谢硬禾学堂举办了Funpack这个活动,通过这次活动我收获了很多,也让我成长了许多。受益匪浅。未来期望再次参加这样的活动,了解并学习更多的知识,掌握更多的技能,开拓电子芯片在生活中运用的视野,改变思维模式,在专业上有既定的发展方向。