告别Wi-Fi!用ESP32经典蓝牙做个无线遥控小车,成本不到50块(Arduino项目实战)

张开发
2026/4/21 13:47:34 15 分钟阅读

分享文章

告别Wi-Fi!用ESP32经典蓝牙做个无线遥控小车,成本不到50块(Arduino项目实战)
50元打造蓝牙遥控小车ESP32与经典蓝牙的极简实战在创客圈里遥控小车一直是入门硬件开发的经典项目。但传统方案要么依赖昂贵的专用控制器要么需要复杂的无线模块配置。今天我们要用一块不到30元的ESP32开发板配合随处可见的电机驱动模块打造一个完全由手机蓝牙控制的智能小车。这个项目最迷人的地方在于——整套系统成本可以控制在50元以内却能实现媲美商业产品的控制体验。ESP32的经典蓝牙Classic Bluetooth模式相比低功耗蓝牙BLE更适合实时控制场景。它建立的串口通信通道延迟更低数据传输更稳定完全满足小车操控的需求。下面我们就从硬件选型到代码编写一步步拆解这个高性价比的遥控方案。1. 硬件准备与电路搭建1.1 核心部件清单这个小车的硬件架构极其精简主要包含以下几个部分ESP32开发板约25元推荐选用带有板载天线的版本如ESP32-WROOM-32L298N电机驱动模块约8元最常用的双路直流电机驱动方案TT马达车轮套件约10元130电机配合塑料轮毂18650电池盒约5元建议使用两节并联供电车体框架可以用亚克力板或3D打印件甚至饼干盒改造提示所有部件都可以在主流电子商城一站式购齐总成本严格控制在50元预算内。1.2 电路连接示意图电机驱动模块与ESP32的连接方式如下表所示L298N引脚ESP32 GPIO功能说明IN1GPIO16控制电机A转向IN2GPIO17控制电机A转向IN3GPIO18控制电机B转向IN4GPIO19控制电机B转向ENAGPIO21电机A使能/PWM调速ENBGPIO22电机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 TerminaliOS: LightBlue这些APP都支持自定义按钮可以配置为发送我们定义的F/B/S等控制字符。以Serial Bluetooth Terminal为例连接ESP32-Car设备进入Keyboard模式添加四个按钮分别绑定前进按钮 → 发送字符F后退按钮 → 发送字符B左转按钮 → 发送字符L右转按钮 → 发送字符R停止按钮 → 发送字符S3.2 自定义APP开发MIT App Inventor如果想获得更好的控制体验可以用MIT App Inventor拖拽式开发专属APP添加BluetoothClient组件设计包含方向按钮的UI界面为每个按钮设置点击事件当 前进按钮 被点击 调用 BluetoothClient1.SendText 发送文本 F4. 进阶优化与问题排查4.1 提升控制流畅度原始方案存在两个明显延迟蓝牙串口默认只发送单个字符电机控制没有加减速过程优化后的指令协议// 新协议格式[方向][速度] // 示例F200表示前进速度200PWM值 if(SerialBT.available() 3) { char dir SerialBT.read(); int speed SerialBT.parseInt(); // 平滑调速逻辑 static int currentSpeed 0; int step (speed - currentSpeed) / 5; for(int i0; i5; i) { currentSpeed step; analogWrite(21, currentSpeed); analogWrite(22, currentSpeed); delay(10); } }4.2 常见问题解决方案现象可能原因解决方法蓝牙连接频繁断开天线阻抗不匹配在ESP32天线端并联1pF电容电机启动导致ESP32重启电源电流不足单独给电机供电或增加电容控制响应延迟高手机蓝牙堆栈缓冲过大APP端设置每次发送后flush左右轮转速不一致电机个体差异在代码中为左右轮设置不同PWM5. 项目扩展方向基础版本完成后可以考虑这些增强功能姿态控制利用手机加速度计通过蓝牙发送倾斜角度数据自动避障加装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的电解电容能有效避免电机启动时的电压骤降导致的系统复位。这个小技巧让我在调试阶段少走了不少弯路。

更多文章