← 返回科创天地

创新实验作品 · SMART CAR · ESP32 · DRV8833

三红外三循迹智能小车

这台小车不是“电机自己会跑”,而是 ESP32 一直在重复做四件事:读取传感器和按键 → 判断当前模式 → 算出左右轮速度 → 输出 PWM 控制电机。看懂这条链路,就看懂了整台车。

源码 v3.2 环境 esp32dev 串口 9600 低速平滑控制
主控
ESP32 DevKit
驱动
DRV8833
传感器
3 避障 + 3 循迹
交互
3 按键 + 1 LED

01 · 整体认识

小车由四个部分组成

把小车想成一个小型机器人:ESP32 是大脑,传感器是眼睛,DRV8833 和电机是腿,按键和 LED 是它和人交流的方式。

大脑:ESP32

读取 6 路传感器和 3 个按键,运行状态机,再给 DRV8833 输出 PWM。

眼睛:避障与循迹

三路红外避障看前方有没有障碍,三路 TCRT5000 看地面有没有黑线。

腿:DRV8833 + TT 电机

ESP32 不直接带动电机,而是输出 PWM 给驱动板;左右轮速度差让小车转向。

提示:按键 + LED

三个按键切换模式,LED 用每周期的闪烁次数表示当前在哪个模式。

02 · 信号流与供电

一张图看懂小车怎么连

左边的传感器和按键把“看到的世界”送进 ESP32;ESP32 判断后把 PWM 送给 DRV8833,再由驱动板带动左右电机。红线是电机供电,灰线是公共地。

ESP32 大脑 读取输入 · 判断状态 · 输出 PWM GPIO21/22/23 按键 GPIO36/39/34 避障 GPIO35/32/33 循迹 三路红外避障 左 36 · 中 39 · 右 34 有障碍 = 低电平 三路 TCRT5000 循迹 左 35 · 中 32 · 右 33 黑线 = 高电平 三个模式按键 21 避障 · 22 循迹 · 23 手动 DRV8833 电机驱动 GPIO25/26 控左轮 GPIO27/14 控右轮 左电机 右电机 电机电源 5V~6V → VM 公共地 ESP32 / DRV / 传感器
供电三条铁律:① DRV8833 的 VM 是电机电源,建议 5V~6V,不要把没稳压的高电压接到 ESP32;② ESP32 GND、DRV8833 GND、电机电源负极、所有传感器 GND 必须共地;③ STBY/SLEEP/EN 必须接高电平,否则程序再对电机也不转。

03 · 接线总表

每个引脚接到哪里

DRV8833 与电机

ESP32 / 模块连接说明
GPIO25AIN1左轮 PWM 1
GPIO26AIN2左轮 PWM 2
GPIO27BIN1右轮 PWM 1
GPIO14BIN2右轮 PWM 2
AO1 / AO2左侧 TT 电机方向反了就交换两线
BO1 / BO2右侧 TT 电机方向反了就交换两线
VM电机电源正极建议 5V~6V

传感器、按键与 LED

元件GPIO逻辑
左/中/右 红外避障36 / 39 / 34有障碍 = 低
左/中/右 循迹35 / 32 / 33黑线 = 高
避障/循迹/手动 按键21 / 22 / 23按下接 GND
状态 LED2闪烁次数表示模式
电源分两套:控制电路(ESP32、传感器、使能脚)用 3.3V/稳定 5V,电机电路用 5V~6V。两套电的正极可以分开,但 GND 必须连在一起——否则 DRV8833 不知道控制信号的 0V 参考点在哪里。

04 · 状态机

三个按键切换三个“大脑模式”

状态机就是:小车当前处于一个状态,收到一个事件(按键)后切换到另一个状态。按某个模式键就切到对应模式,已经在这个模式时再按一次就停车。

停车 / 待机
LED 不闪,所有电机停止
避障模式
按 GPIO21,LED 每周期闪 1 下
循迹模式
按 GPIO22,LED 每周期闪 2 下
手动模式
按 GPIO23,LED 每周期闪 3 下
每次切换模式时,程序先停车再进入新模式。因为上一个模式可能还给电机留着速度,若直接切换,车轮会短时间继承旧速度,容易让人误以为新模式的算法错了。

一次按键如何触发切换

三个模式键都用 INPUT_PULLUP:平时是高电平,按下被接到 GND 变成低电平。程序每轮都读按键,但不会一看到变化就切换,而是先消抖约 40ms 确认是真实按下,再决定切到新模式还是切回停车。

读取电平松开=高,按下=低
软件消抖稳定约 40ms 才承认
生成事件只在按下瞬间触发一次
切换模式先停车,再进入新状态

05 · 决策逻辑

避障和循迹各自怎么做决定

避障:看左中右,决定怎么绕

左中右小车动作怎么理解
无无无低速前进前方安全,继续走
有无无向右偏左边挡住,就往右绕
无无有向左偏右边挡住,就往左绕
无有无原地转向找路正前方挡住,左右试探
有有无右转左和中挡住,右边能走
无有有左转中和右挡住,左边能走
有有有后退再转向三边都挡住,先退出危险区

一句话记忆:前面没挡就走,左挡往右,右挡往左,三边都挡先后退。

循迹:黑线在哪边,就往哪边修正

左中右小车动作怎么理解
白黑白沿线直行小车正对着黑线
黑黑白小幅左转黑线偏左一点,轻轻修正
黑白白大幅左转黑线明显在左边,赶紧找回
白黑黑小幅右转黑线偏右一点,轻轻修正
白白黑大幅右转黑线明显在右边,赶紧找回
黑黑黑慢速直行可能是宽线或交叉口
白白白按最近方向搜索黑线丢了,先按上次方向找

传感器装在车头下方,正常是中间压线。左传感器看到黑线,说明线跑到了车的左边,要向左修正才能让中间重新回到线上——看到线在哪,就往哪修正。

06 · 平滑控制

为什么新版控制更顺、不猛冲

程序分成“决策层”和“电机层”。决策层只说目标速度是多少;电机层每隔 30ms 把当前速度向目标速度靠近一点点,而不是一步跳到位。

传感器读数把电平翻译成中文状态:有障碍、黑线、白底。
状态机判断当前是避障、循迹、手动还是停车。
计算目标速度例如左轮 110、右轮 180。
平滑输出 PWM当前速度每次只变 8,减少猛冲和抖动。
const unsigned long MOTOR_RAMP_INTERVAL_MS = 30;
const int MOTOR_RAMP_STEP = 8;

// 传感器看到世界 → 状态机判断模式 → 算法给目标速度 → 平滑 PWM 控制电机
目标速度:160
当前速度:0 → 8 → 16 → 24 → … → 160

07 · 调试

串口监视器怎么看 · 课堂测试顺序

串口波特率设为 9600,程序每秒输出一行中文状态。按“模式对不对 → 传感器对不对 → 动作对不对 → 速度对不对”的顺序排查最快。

[状态] 模式=循迹模式 LED=2闪
| 避障 左=无障碍(高) 中=无障碍(高) 右=无障碍(高)
| 循迹 左=白底(低) 中=黑线(高) 右=白底(低)
| 动作=循迹/沿线直行
| 当前速度 L=145 R=145 | 目标速度 L=145 R=145
架空车轮第一次测试垫高小车,不要直接放地上跑。
测试避障按 GPIO21,依次用手挡左、中、右红外。
测试循迹按 GPIO22,把黑线放到左、中、右循迹模块下。
低速落地确认方向正确后,再放到地面调高度和阈值。

08 · 排查

常见问题速查

现象优先检查
电机完全不转VM 是否有电、GND 是否共地、STBY/SLEEP/EN 是否接高电平
低速只响不转TT 电机启动扭矩不足,保留起步冲量,必要时略提高低速参数
串口状态和实际相反检查 OBSTACLE_ACTIVE_LOW(避障)或 LINE_ACTIVE_LOW(循迹)
循迹左右反了检查左右传感器是否插反,或左右电机输出是否接反
小车一动就重启电源电流不足或电机噪声过大,供电要稳且必须共地

09 · 自检

学完后你应该能回答

1 为什么按键按下时 ESP32 读到的是低电平?

按键一端接 GPIO,另一端接 GND,程序又开启了上拉输入。松开时 GPIO 被上拉到高电平,按下时被直接拉到 GND,所以读到 LOW。

2 为什么红外避障是“低电平触发”,循迹模块却是“高电平触发”?

不同模块内部比较器和输出电路设计不同,输出逻辑不一定一样。关键不是死记“红外一定高或低”,而是用串口先确认每个模块在当前接法下的有效电平,再让程序常量和真实电平一致。

3 为什么切换模式前要先停车?

上一个模式可能还保留着左右轮 PWM。如果不先清零,新模式开始的瞬间会继承旧速度,车会突然冲一下,也会让调试者误判为新模式算法错误。

4 为什么左循迹看到黑线时,小车要向左转?

左侧传感器看到黑线,说明车身相对轨迹偏到右边,黑线在车的左侧。让左轮慢一点、右轮快一点,小车就会向左修正,重新把中间传感器压回黑线。

5 为什么电机完全不转时,不能只怀疑程序?

电机需要独立电源、驱动板使能和公共地。程序输出 PWM 只是控制信号,如果 VM 没电、GND 没共地、STBY/SLEEP/EN 没拉高,或者电机线接错,串口正常也不会转。

6 为什么调车时要先架空车轮?

第一次上电时方向、速度和传感器逻辑都可能反。架空车轮可以先观察左右轮是否按预期转动,避免小车突然冲出去、撞到人或损坏线路。

一句话总结:这台车的核心不是某一行代码,而是一条完整的控制链——传感器电平 → 程序判断状态 → 状态机选择动作 → 左右轮 PWM → 小车运动。先把每个传感器电平读对,再把状态机理解清楚,最后再调速度。

想亲手试试?打开教学控制台

教学控制台是网页演示版,可以在浏览器里模拟传感器电平、观察状态机如何切换、看左右轮 PWM 如何变化,把这页讲的原理一步步“跑”出来。

育才物理创新实验室 · 智能小车 car01 v3.2 · 本页面向物理实验与学生作品展示,落地上车前仍需完成供电、共地、使能与串口日志检查。