01 · 整体认识
小车由四个部分组成
把小车想成一个小型机器人:ESP32 是大脑,传感器是眼睛,DRV8833 和电机是腿,按键和 LED 是它和人交流的方式。
大脑:ESP32
读取 6 路传感器和 3 个按键,运行状态机,再给 DRV8833 输出 PWM。
眼睛:避障与循迹
三路红外避障看前方有没有障碍,三路 TCRT5000 看地面有没有黑线。
腿:DRV8833 + TT 电机
ESP32 不直接带动电机,而是输出 PWM 给驱动板;左右轮速度差让小车转向。
提示:按键 + LED
三个按键切换模式,LED 用每周期的闪烁次数表示当前在哪个模式。
02 · 信号流与供电
一张图看懂小车怎么连
左边的传感器和按键把“看到的世界”送进 ESP32;ESP32 判断后把 PWM 送给 DRV8833,再由驱动板带动左右电机。红线是电机供电,灰线是公共地。
03 · 接线总表
每个引脚接到哪里
DRV8833 与电机
| ESP32 / 模块 | 连接 | 说明 |
|---|---|---|
| GPIO25 | AIN1 | 左轮 PWM 1 |
| GPIO26 | AIN2 | 左轮 PWM 2 |
| GPIO27 | BIN1 | 右轮 PWM 1 |
| GPIO14 | BIN2 | 右轮 PWM 2 |
| AO1 / AO2 | 左侧 TT 电机 | 方向反了就交换两线 |
| BO1 / BO2 | 右侧 TT 电机 | 方向反了就交换两线 |
| VM | 电机电源正极 | 建议 5V~6V |
传感器、按键与 LED
| 元件 | GPIO | 逻辑 |
|---|---|---|
| 左/中/右 红外避障 | 36 / 39 / 34 | 有障碍 = 低 |
| 左/中/右 循迹 | 35 / 32 / 33 | 黑线 = 高 |
| 避障/循迹/手动 按键 | 21 / 22 / 23 | 按下接 GND |
| 状态 LED | 2 | 闪烁次数表示模式 |
04 · 状态机
三个按键切换三个“大脑模式”
状态机就是:小车当前处于一个状态,收到一个事件(按键)后切换到另一个状态。按某个模式键就切到对应模式,已经在这个模式时再按一次就停车。
一次按键如何触发切换
三个模式键都用 INPUT_PULLUP:平时是高电平,按下被接到 GND 变成低电平。程序每轮都读按键,但不会一看到变化就切换,而是先消抖约 40ms 确认是真实按下,再决定切到新模式还是切回停车。
05 · 决策逻辑
避障和循迹各自怎么做决定
避障:看左中右,决定怎么绕
| 左 | 中 | 右 | 小车动作 | 怎么理解 |
|---|---|---|---|---|
| 无 | 无 | 无 | 低速前进 | 前方安全,继续走 |
| 有 | 无 | 无 | 向右偏 | 左边挡住,就往右绕 |
| 无 | 无 | 有 | 向左偏 | 右边挡住,就往左绕 |
| 无 | 有 | 无 | 原地转向找路 | 正前方挡住,左右试探 |
| 有 | 有 | 无 | 右转 | 左和中挡住,右边能走 |
| 无 | 有 | 有 | 左转 | 中和右挡住,左边能走 |
| 有 | 有 | 有 | 后退再转向 | 三边都挡住,先退出危险区 |
一句话记忆:前面没挡就走,左挡往右,右挡往左,三边都挡先后退。
循迹:黑线在哪边,就往哪边修正
| 左 | 中 | 右 | 小车动作 | 怎么理解 |
|---|---|---|---|---|
| 白 | 黑 | 白 | 沿线直行 | 小车正对着黑线 |
| 黑 | 黑 | 白 | 小幅左转 | 黑线偏左一点,轻轻修正 |
| 黑 | 白 | 白 | 大幅左转 | 黑线明显在左边,赶紧找回 |
| 白 | 黑 | 黑 | 小幅右转 | 黑线偏右一点,轻轻修正 |
| 白 | 白 | 黑 | 大幅右转 | 黑线明显在右边,赶紧找回 |
| 黑 | 黑 | 黑 | 慢速直行 | 可能是宽线或交叉口 |
| 白 | 白 | 白 | 按最近方向搜索 | 黑线丢了,先按上次方向找 |
传感器装在车头下方,正常是中间压线。左传感器看到黑线,说明线跑到了车的左边,要向左修正才能让中间重新回到线上——看到线在哪,就往哪修正。
06 · 平滑控制
为什么新版控制更顺、不猛冲
程序分成“决策层”和“电机层”。决策层只说目标速度是多少;电机层每隔 30ms 把当前速度向目标速度靠近一点点,而不是一步跳到位。
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
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 如何变化,把这页讲的原理一步步“跑”出来。
育才物理创新实验室 · 智能小车 car01 v3.2 · 本页面向物理实验与学生作品展示,落地上车前仍需完成供电、共地、使能与串口日志检查。
