ESP32避障小车:从接线到自主巡行的4阶段搭建路径
【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32
当测试台架没有网络、小车需要自己完成一圈巡逻时,一台 ESP32 智能小车就够了:一块 ESP32 DevKitC、两只 N20 减速电机、一块 L298N 驱动板、一个 HC-SR04 超声波模块,加上 arduino-esp32 这个 Arduino 核心,就能搭出无需服务器和配套 App 的自主避障小车。以下是我实际走通一遍的搭建路径:硬件 BOM 大约 150-220 元,第一次让避障逻辑稳定跑起来,动手时间约 1-2 小时。
项目全景:arduino-esp32 核心对小车意味着什么
arduino-esp32 是乐鑫官方的 ESP32 系列 Arduino 兼容核心,覆盖 C2/C3/C5/C6/S2/S3/H2 全家族,仓库当前主线版本 3.3.11(见 cores/esp32/esp_arduino_version.h),根目录 boards.txt 收录了 400 多款开发板定义,libraries/ 内置 WiFi、BLE、USB 等 40 余个项目库。对小车项目而言,这意味着 Arduino 草图里写的 PWM、GPIO、串口背后都有现成的硬件驱动,不需要接触 ESP-IDF 的底层 API。整车成本与学习曲线主要由驱动板和传感器决定,而不是固件层:参考预算是 BOM 150-220 元、首次跑通 1-2 小时、迭代到稳定自主巡逻约 1-2 周。
动手清单:ESP32 避障小车的硬件版本与 IDE 环境
📌 先把 BOM 定下来,每项都标了规格,采购时直接对照。
硬件(7 项)
- ESP32 DevKitC(ESP32-WROVER,4MB Flash / 8MB PSRAM)×1——最通用的板型,引脚与官方引脚图完全对应,教程按图抄引脚号即可
- N20 减速电机(带轮,6-12V,42 速比)×2
- L298N 双 H 桥驱动板 ×1(输入 5-35V)
- HC-SR04 超声波测距模块 ×1(5V 供电,量程 2cm-4m)
- 2S 18650 电池组(7.4V,≥2000mAh)+ 电源开关 ×1
- 两轮亚克力或 3D 打印底盘 + 万向轮,M3 螺丝与立柱若干
- 杜邦线,100µF 电容(并接在电机电源输入端)
软件(3 项)
- Arduino IDE ≥1.8.19(2.x 系列均可)
- 在 IDE 首选项填入官方 stable 版板管理器地址,Boards Manager 中安装 esp32 核心,选择 3.3.x 系列(对应本仓库当前主线 3.3.11)
- 支持数据传输的 USB 线——只充电的数据线是烧录失败的头号来源
搭建路径:接线、烧录、测距、联调 4 个阶段
阶段一:环境与固件安装
完成信号:IDE 中选中 "ESP32 Dev Module" 后,端口列表出现串口,Blink 示例编译通过。 在首选项的"附加开发板管理器网址"中添加官方稳定版地址,打开 Boards Manager 安装 esp32 平台。
ESP32 开发板包在 Boards Manager 中的安装界面:搜索 esp32 后选择 3.3.x 系列版本
阶段二:电源与接线
完成信号:上电后手动置位 IN 引脚,两轮转向相反,电机声音正常无打齿。 先固定电源链路:电池+ → L298N 的 V+;L298N 的 5V 输出 → ESP32 的 5V 脚;电池、L298N、ESP32、超声波模块的 GND 全部共地。2S 的 7.4V 是 N20 带负载的最低舒适电压,用单节 3.7V 车会明显没劲。
信号接线如下(引脚号以 ESP32 DevKitC 引脚图为准,全部避开 STRAP 引脚):
| 信号 | ESP32 GPIO | L298N 引脚 |
|---|---|---|
| 左轮速度 PWM | GPIO25 | ENA |
| 左轮方向 | GPIO26 / GPIO27 | IN1 / IN2 |
| 右轮速度 PWM | GPIO32 | ENB |
| 右轮方向 | GPIO33 / GPIO17 | IN3 / IN4 |
| 超声波 Trig | GPIO5 | — |
| 超声波 Echo | GPIO18 | — |
⚠️ 这里我踩过坑:网上不少示例把电机分到 GPIO12/13/15,但 DevKitC 上这三个引脚与外部 Flash 共享,复位后不能当普通 GPIO 用,上车直接不转。
ESP32 DevKitC 引脚图:GPIO12/13/15 标有 "!"(STRAP 引脚),因此电机信号改走 GPIO25/26/27/32/33/17
阶段三:测距验证
完成信号:串口 115200 输出随你手部移动实时变化的距离值,30cm 处误差不超过 1cm。 这一步只烧一个跑pulseIn的最小草图,先不接电机,把传感器链路单独验证掉。
阶段四:避障联调
完成信号:小车在 20cm 处停住,倒转方向后直行,转弯过渡不来回摆动。 阈值先定 20cm/10cm 两档(减速/刹停转向),起步速度给小一点(占空比 400 左右);出现摆动的第一个动作是降速,而不是反复微调阈值。
核心机制拆解:PWM 差速与 HC-SR04 超声波测距链路
差速驱动:占空比 → PWM → H 桥 → 轮速。输入是 0-1023 的整数(LEDC 定时器 10 位分辨率),ESP32 的硬件 PWM 模块产生波形,GPIO 矩阵(IO_MUX)把它路由到物理引脚,L298N 的 H 桥再把 PWM(速度)与 IN1/IN2 电平(方向)合成电机驱动。arduino-esp32 3.x 已移除 2.x 的ledcSetup/ledcAttachPin,现在直接按引脚调用ledcAttach:
ledcAttach(25, 25000, 10); // GPIO25 输出 25kHz PWM,10 位分辨率(0~1023) ledcAttach(32, 25000, 10); // GPIO32 右轮,同参数 ledcWrite(25, 800); // 占空比 → 左轮转速,1023 为满速频率给到 25kHz 可避开可听频段,电机不会伴随尖啸。
GPIO 矩阵与 IO_MUX 路由图:LEDC 的 PWM 信号经 GPIO 矩阵分配到物理引脚
超声波测距:触发 → 回波高电平 → 距离 → 阈值决策。HC-SR04 自己完成回波计时,Echo 的高电平宽度正比于距离:
digitalWrite(5, HIGH); delayMicroseconds(10); digitalWrite(5, LOW); // 10us 触发 long t = pulseIn(18, HIGH, 30000); // Echo 高电平宽度(us),超时 30ms float cm = t * 0.017; // 距离 = t × 340m/s ÷ 2,化简为 cm/us决策层就是个三档状态机:cm > 20 全速直行;10 < cm < 20 减速;cm ≤ 10 刹停倒转。
void avoid(float cm) { if (cm < 10) stopAndTurn(); // 危险区:刹停 + 倒转 else if (cm < 20) setSpeed(300, 300); // 警告区:减速 else setSpeed(800, 800); // 正常区 }一个硬约束:回波高电平宽度与距离成正比,长距离下单次测量要 20ms 以上,循环刷新率被它卡住,决策逻辑不要依赖比这更快的更新。
避坑对照表:ESP32 电机驱动接线的 5 个高频问题
⚠️ 按出现概率排序,排查动作都是实际做过的。
| 现象 | 大概率原因 + 排查动作 |
|---|---|
| 电机不转或明显没劲 | 电池电压不足(N20 带载低于约 5V 会堵转),或 L298N 的 5V 输出被 MCU 负载拉低。用万用表量 V+ 端实际电压,换 2S 7.4V 电池组;不要用单节 3.7V 带电机 |
| 一只轮转一只不转,或方向反 | 电机两根相位线接反,或 IN1/IN2 逻辑接反。对调电机线,或在软件里反转 IN 输出;先手动上电确认两轮方向 |
| 超声波读数恒为 0 或 589cm | 589 是超 4m 的溢出值;近距离恒 0 多为无触发脉冲或 Echo 线断路。先用万用表确认 TRIG 引脚有 10us 脉冲;注意 Echo 是 5V 逻辑,ESP32 GPIO 为 3.3V,长期直连有风险,加 1kΩ/2kΩ 分压 |
| 烧录卡在 "Connecting..." | 开发板状态不对:按住 BOOT 点上传,进入 "Connecting" 后再松开;确认是数据线;DevKitC 的 USB 转串口是外置 CP2102/CH340,先装驱动 |
| 电机啸叫或草图编译报错 | 3.x 已移除ledcSetup/ledcAttachPin,照抄 2.x 示例会编译失败或通道错乱。改用ledcAttach,并把频率设为 ≥20kHz 移出可听段 |
能力边界与下一步:HC-SR04 精度与遥控升级路径
当前方案能做什么、不能做什么,实测口径:
- HC-SR04 有效量程 2cm-4m,近程(30cm 内)精度约 ±3mm,波束角约 30°——细障碍物(桌腿、线缆)和低反射率深色布料都容易漏检
- L298N 是双极驱动,H 桥压降 1-2V,持续大负载时发热明显,车速上限被它而不是固件卡住
- 电机换向噪声会干扰 WiFi 天线:后续加无线功能后若经常掉线,把电机走线挪离天线区,或先在驱动板输入端加大电容
两条有具体路径的升级方向:
- 循墙跟随:车身左右各加一只 HC-SR04(接法相同,只改 GPIO 号),再加一路红外循迹,把"前方避障"扩展为"前 + 侧 + 线",小车即可沿墙边完成循墙巡航
- 遥控与数据回传:用仓库自带的 libraries/WiFi/ 把小车配成 station 模式接入家里网络,把循环里的距离值每秒经 UDP 发到手机或电脑,拓扑见下图;若要做平滑遥控,可在开发板菜单的 LoopCore 选项里把 Arduino 循环和 WiFi 任务分到两个核心
ESP32 以站点(STA)模式连接 AP:遥控与数据回传升级的基础网络拓扑
资源入口
- 安装指南(板管理器地址与 IDE 版本要求):docs/en/installing.rst
- LEDC PWM API 参考:docs/en/api/ledc.rst
- GPIO 矩阵 / IO_MUX 路由原理:docs/en/tutorials/io_mux.rst
- Blink 示例(烧录验证第一步):libraries/ESP32/examples/GPIO/BlinkRGB/
- 故障排查 FAQ:docs/en/faq.rst
开环版本稳定跑起来之后,下一步建议把 N20 换成带编码器的版本,用pulseIn读速度反馈做闭环——那是这辆车值得做的第一件升级。
【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考