嵌入式单片机ESP32Arduino 遥控小车(蓝牙版)
ESP32主板1个、步进器1个(电机驱动)、3.7V电池1个(18000mAh)、车身架1个、2个轮胎和2个小马达、跳线若干。
拓展板
由于ESP32引脚数量有限,使用拓展板来引出更多引脚
esp32 wroom
-
打开Arduino IDE。
-
在菜单栏中,选择Sketch -> Include Library -> Manage Libraries...。
-
在弹出的库管理器窗口中,输入ESP32库到搜索框中。
-
在搜索结果中找到ESP32,点击Install按钮进行安装。
-
打开Arduino IDE。
-
安装开发板
- 在菜单栏中,选择工具 -> 开发板 -> 选择 ESP32 Dev Module 或者ESP32-WROOM-DAModule
L298N电机驱动板通常需要四个控制引脚来驱动一个双电机:
- 两个用于控制电机A的方向,另外两个用于控制电机B的方向。
- 还有两个使能引脚(一个用于电机A,一个用于电机B),可以用来控制电机的速度,通常通过PWM信号实现。
- OUT1和OUT2 电池1、OUT3和OUT4 电池2
- 12V电源正极(暂不用)、GND电源负极接到esp32电源负极 、+5V接到esp32电源正极极
- ENA:电机1PWM调速引脚
注意:不使用调速引脚,那两个塑料不要拔起来,拔起来后需要用“母对母”跳线连接
- ENB:电机2PWM调速引脚
- IN1和IN2:电机1 正反转/停止控制
- IN3和IN4:电机2 正反转/停止控制
8.左右电机控制
9.引脚对接
(1)esp32
L298N引脚 | ESP32引脚 |
---|---|
IN1 | 23 |
IN2 | 22 |
IN3 | 19 |
IN4 | 18 |
ENA | 21 |
ENB | 5 |
(2)esp8266
1.程序烧入ESP32主板后,生成wifi热点:“遥控小车”; 2.使用手机或平板连接热点密码:12345678 3.浏览器地址:http://192.168.4.1
要实现一个ESP32作为遥控器端(esp32_wroom_car_client.ino),需要连接4个按钮到ESP32的GPIO引脚,并且当按钮被按下时,发送HTTP POST请求到另一个作为服务器端的ESP32(esp32_wroom_car_server.ino)。
- 连接每个按钮的一个引脚到ESP32的GPIO引脚,另一个引脚连接到GND。
- 在客户端代码中配置WiFi连接,以便它可以连接到服务器端ESP32创建的热点。
- 为每个按钮设置GPIO引脚模式为输入,并启用内部上拉电阻。
- 在主循环中检测按钮是否被按下,并发送相应的HTTP POST请求到服务器端。
一、如果你已经将引脚设置为高电平,但是马达没有运动,可能有以下几个原因:
解决办法:
-
电流不足:ESP32的GPIO引脚只能提供很小的电流(大约12mA),这可能不足以驱动马达。可能需要一个马达驱动器或者一个适当的晶体管来放大电流。
-
连接问题:检查你的马达是否正确连接到ESP32和电源。
-
马达问题:你的马达可能有问题。试着用另一个马达,或者直接用电源给马达供电,看看马达是否能运动。使用专门的马达控制板(如L293D或者L298N)来驱动你的马达。
-
代码问题:检查你的代码是否正确设置了GPIO引脚为输出模式,并且设置了高电平。
二、引脚不够
解决办法:使用esp32 wroom 30pin 拓展板
三、不想使用USB type-c 数据线烧入
解决办法:使用usb to tll 引脚连接esp32
在连接ESP32-WROOM模块到USB to TTL转换器时,你需要按照以下方式连接引脚:
- 3V3 (或标记为VCC的USB to TTL转换器上的3.3V输出) 连接到ESP32的3V3引脚。
- GND (地线) 连接到ESP32的GND引脚。
- RXD (接收数据) 连接到ESP32的TXD引脚(通常是GPIO3)。
- TXD (发送数据) 连接到ESP32的RXD引脚(通常是GPIO1)。
确保连接时不要接错RXD和TXD,因为RXD接收数据,应该连接到ESP32的发送引脚(TXD),反之亦然。此外,不要将5V连接到ESP32,因为这可能会损坏模块。
四、调小旋转的幅度
要调整旋转的幅度,可以通过修改controlCarWithJoystick函数中判断摇杆位置的阈值来实现。
代码中,摇杆的X轴值小于1700时判断为左转,大于2400时判断为右转。你可以将这些阈值调整得更接近中心值(通常为2048),以减小识别为旋转的幅度。
例如,可以将阈值调整为:
- 左转的阈值从1700调整为1900
- 右转的阈值从2400调整为2200
这样,只有当摇杆更接近极端位置时,才会触发旋转命令,从而减小旋转的幅度。
修改后的controlCarWithJoystick函数如下:
void controlCarWithJoystick() {
int xValue = analogRead(joystickXPin); // 读取X轴值
int yValue = analogRead(joystickYPin); // 读取Y轴值
bool buttonPressed = digitalRead(joystickButtonPin) == LOW; // 读取按钮状态
// 根据摇杆位置决定动作
if (yValue < 1700) { // 前进
Serial.println("前进");
sendCommand(3);
} else if (yValue > 2400) { // 后退
Serial.println("后退");
sendCommand(5);
} else if (xValue < 1900) { // 左转
Serial.println("左");
sendCommand(1);
} else if (xValue > 2200) { // 右转
Serial.println("右");
sendCommand(2);
}
else if (buttonPressed) { // 按钮被按下
sendStopCommand();
}
else {
sendStopCommand(); // 摇杆在中间位置时停止
}
}