50元打造蓝牙遥控小车:ESP32与经典蓝牙的极简实战
在创客圈里,遥控小车一直是入门硬件开发的经典项目。但传统方案要么依赖昂贵的专用控制器,要么需要复杂的无线模块配置。今天我们要用一块不到30元的ESP32开发板,配合随处可见的电机驱动模块,打造一个完全由手机蓝牙控制的智能小车。这个项目最迷人的地方在于——整套系统成本可以控制在50元以内,却能实现媲美商业产品的控制体验。
ESP32的经典蓝牙(Classic Bluetooth)模式相比低功耗蓝牙(BLE)更适合实时控制场景。它建立的串口通信通道延迟更低,数据传输更稳定,完全满足小车操控的需求。下面我们就从硬件选型到代码编写,一步步拆解这个高性价比的遥控方案。
1. 硬件准备与电路搭建
1.1 核心部件清单
这个小车的硬件架构极其精简,主要包含以下几个部分:
- ESP32开发板(约25元):推荐选用带有板载天线的版本,如ESP32-WROOM-32
- L298N电机驱动模块(约8元):最常用的双路直流电机驱动方案
- TT马达+车轮套件(约10元):130电机配合塑料轮毂
- 18650电池盒(约5元):建议使用两节并联供电
- 车体框架:可以用亚克力板或3D打印件,甚至饼干盒改造
提示:所有部件都可以在主流电子商城一站式购齐,总成本严格控制在50元预算内。
1.2 电路连接示意图
电机驱动模块与ESP32的连接方式如下表所示:
| L298N引脚 | ESP32 GPIO | 功能说明 |
|---|---|---|
| IN1 | GPIO16 | 控制电机A转向 |
| IN2 | GPIO17 | 控制电机A转向 |
| IN3 | GPIO18 | 控制电机B转向 |
| IN4 | GPIO19 | 控制电机B转向 |
| ENA | GPIO21 | 电机A使能/PWM调速 |
| ENB | GPIO22 | 电机B使能/PWM调速 |
| 12V输入 | 电池正极 | 电机驱动电源 |
| GND | 共地 | 必须与ESP32共地 |
供电方案建议采用双电源设计:
[电池组] → 5V稳压 → ESP32 USB口 ↘ 直接接入 → L298N 12V输入2. 蓝牙通信核心代码解析
2.1 建立蓝牙串口服务
ESP32的经典蓝牙库已经高度封装,只需几行代码就能创建可被手机识别的蓝牙设备:
#include "BluetoothSerial.h" BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin("ESP32-Car"); // 蓝牙设备显示名称 pinMode(16, OUTPUT); // 初始化所有电机控制引脚 pinMode(17, OUTPUT); pinMode(18, OUTPUT); pinMode(19, OUTPUT); pinMode(21, OUTPUT); pinMode(22, OUTPUT); }2.2 指令解析与电机控制
我们定义简单的单字符协议来控制小车运动:
void loop() { if (SerialBT.available()) { char cmd = SerialBT.read(); switch(cmd) { case 'F': // 前进 digitalWrite(16, HIGH); digitalWrite(17, LOW); digitalWrite(18, HIGH); digitalWrite(19, LOW); analogWrite(21, 200); // PWM调速 analogWrite(22, 200); break; case 'B': // 后退 digitalWrite(16, LOW); digitalWrite(17, HIGH); digitalWrite(18, LOW); digitalWrite(19, HIGH); analogWrite(21, 200); analogWrite(22, 200); break; case 'S': // 停止 analogWrite(21, 0); analogWrite(22, 0); break; } } delay(20); }3. 手机端控制方案
3.1 使用现成蓝牙终端APP
对于快速验证,推荐这些免费应用:
- Android: Serial Bluetooth Terminal
- iOS: LightBlue
这些APP都支持自定义按钮,可以配置为发送我们定义的F/B/S等控制字符。以Serial Bluetooth Terminal为例:
- 连接ESP32-Car设备
- 进入"Keyboard"模式
- 添加四个按钮,分别绑定:
- 前进按钮 → 发送字符'F'
- 后退按钮 → 发送字符'B'
- 左转按钮 → 发送字符'L'
- 右转按钮 → 发送字符'R'
- 停止按钮 → 发送字符'S'
3.2 自定义APP开发(MIT App Inventor)
如果想获得更好的控制体验,可以用MIT App Inventor拖拽式开发专属APP:
- 添加
BluetoothClient组件 - 设计包含方向按钮的UI界面
- 为每个按钮设置点击事件:
当 前进按钮 被点击 调用 BluetoothClient1.SendText 发送文本 "F"4. 进阶优化与问题排查
4.1 提升控制流畅度
原始方案存在两个明显延迟:
- 蓝牙串口默认只发送单个字符
- 电机控制没有加减速过程
优化后的指令协议:
// 新协议格式:"[方向][速度]" // 示例:"F200"表示前进速度200(PWM值) if(SerialBT.available() >= 3) { char dir = SerialBT.read(); int speed = SerialBT.parseInt(); // 平滑调速逻辑 static int currentSpeed = 0; int step = (speed - currentSpeed) / 5; for(int i=0; i<5; i++) { currentSpeed += step; analogWrite(21, currentSpeed); analogWrite(22, currentSpeed); delay(10); } }4.2 常见问题解决方案
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 蓝牙连接频繁断开 | 天线阻抗不匹配 | 在ESP32天线端并联1pF电容 |
| 电机启动导致ESP32重启 | 电源电流不足 | 单独给电机供电或增加电容 |
| 控制响应延迟高 | 手机蓝牙堆栈缓冲过大 | APP端设置每次发送后flush |
| 左右轮转速不一致 | 电机个体差异 | 在代码中为左右轮设置不同PWM |
5. 项目扩展方向
基础版本完成后,可以考虑这些增强功能:
- 姿态控制:利用手机加速度计,通过蓝牙发送倾斜角度数据
- 自动避障:加装HC-SR04超声波模块,遇到障碍自动停止
- 视频图传:配合ESP32-CAM模块实现第一人称视角驾驶
- 语音控制:集成DFPlayer Mini模块响应语音指令
电路改造示例(增加超声波模块):
// 新增引脚定义 #define TRIG_PIN 23 #define ECHO_PIN 25 void setup() { // ...原有代码... pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } void autoStopCheck() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duration = pulseIn(ECHO_PIN, HIGH); int distance = duration * 0.034 / 2; if(distance < 15) { // 15cm内自动刹车 analogWrite(21, 0); analogWrite(22, 0); SerialBT.println("Obstacle detected!"); } }在实际组装过程中,最容易被忽视的是电源系统的稳定性。建议在ESP32的5V输入引脚处并联一个470μF的电解电容,能有效避免电机启动时的电压骤降导致的系统复位。这个小技巧让我在调试阶段少走了不少弯路。