做一台通过蓝牙或 Wi-Fi 用手机控制的机器人小车
一台用手机通过蓝牙或 Wi-Fi 驾驶的机器人小车,链路一断就会自己停下,而不是失控乱跑。
做的是什么
手机开的车——HC-05 蓝牙,或 ESP32 Wi-Fi 自己开控制页。
本站最容易上手的机器人:不需要控制理论,没有算法要对,失效模式是看得见的,而不是藏在数学里的。它还教给每一台其它机器人都需要的一课——失去控制时该怎么办。
两种无线电
| HC-05(蓝牙) | ESP32(Wi-Fi) | |
|---|---|---|
| 额外硬件 | 模块,RX 加分压 | 无——射频控制器上 |
| 手机上 | 蓝牙串口 App | 任一浏览器 |
| 距离 | 约 10 m | 户外 30 m 起 |
| 手机不断网 | 不断 | 热点模式断 |
| 适合 | 第一台无线 | 递给别人的所有 |
两者都没错。HC-05 是让机器人动起来更短的一条路;ESP32 在跑通之后体验更好,因为“连上这个 Wi-Fi 然后打开浏览器”这句话完全不需要解释。
物料单
两条路,只要一条。手里有 Arduino 走蓝牙;今天买零件走 Wi-Fi。
| 零件 | 蓝牙路 | Wi-Fi 路 | 约价 |
|---|---|---|---|
| 控制器 | Arduino Uno | ESP32 | $5–8 |
| 无线电 | HC-05 模块 | 内置 | $4 / $0 |
| 电平转换 | 模块 RX 1 kΩ + 2 kΩ | 5 V 传感器输入都要 | $0.10 |
| 电机驱动 | 1 | 1 | $2–4 |
| TT 减速电机 | 2 | 2 | $4 |
| 两轮底盘 | 1 | 1 | $6–10 |
| 电池包 | 1 | 1 | $6 |
| 手机 App 要吗 | 要——蓝牙串口终端 | 不要——任一浏览器 | — |
合计两条路约 $25–35。
决定差不是钱,是控制界面。HC-05 给字节流,手机要发字节的 App。ESP32 自己开网页,手机要浏览器——开 URL 谁都开,不装东西。递给别人开的车,不加钱大不同。
手里有 Arduino,或要不碰网络概念最素链路,蓝牙路值。进一字节出一字节。
制作顺序
**1——先在台架上让它转起来。**接上电机、驱动板和电池,轮子悬空,完全不碰无线部分。按用 PWM 控制直流电机那一篇做,用硬编码的指令确认前进、后退和两个转向方向都正确。无线和电机驱动同时调试,一个下午就这么没了。
2——无线电加回声。HC-05 接好或 ESP32 热点起来,接转的东西前双向通文字。
**3——协议连起。**一字母加值,换行结尾。读到终止符再动不逐字节动,“到几个字节”不是“消息到了”。
**4——让它具备失效安全。**这是大多数人跳过的步骤,也正是最要紧的一步。
失联自动停车超时
无线机器人会一直执行你最后下达的那条指令。如果那是“全速前进”,而你刚刚走出了通信范围,机器人并不会停下——它会把这件事执行到底。
解两半都要:
- **控制端要重复发送。**手机在按键按住期间每 100 ms 发送一次当前指令,而不是按下时只发一次。
- **机器人要等它。**如果大约 400 ms 都没有收到指令,就停车。
if (millis() - lastCommandAt > 400) stop();
松按键、关 App、手机没电、走出范围同结果。绝不靠可能不发的停车消息。
这里要用 millis() 而不是 delay()。循环里任何一处 delay(200),都会让机器人在那 200 ms 里既不读输入也不做检查。
硬件注意事项
**给无线模块一路干净的电源。**两种模块在发射时都以尖锐的突发电流取电。和电机共用一条会下垂的电源轨,会引发看起来与软件崩溃一模一样的复位——机器人开到一半没反应,一秒后又回来。电机从电池包经驱动板供电,逻辑电源单独走一路。
**当心 3.3 V 引脚。**HC-05 的 RX 以及 ESP32 的每个 GPIO 都是 3.3 V 器件。一块 5 V 的 Arduino 向它们发送信号时需要分压。这种损坏是渐进且不彻底的,所以特别难诊断。
**这里用 L298N 完全可以。**它的压降在一台高速循迹车上是要紧的;在一台手动驾驶的车上,你只要用油门把它补偿掉就行,所以更便宜、更常见的驱动是合理的选择。
做好长什么样
| 测量 | 蓝牙(HC-05) | Wi-Fi(ESP32) |
|---|---|---|
| 指令延迟 | 20–60 ms | 局域网 30–100 ms |
| 空旷距离 | 约 10 m | 约 50 m,网内哪都行 |
| 穿一堵墙 | 3–5 m | 15–25 m |
| 上电到可控 | 配对后约 2 s | 连 Wi-Fi 约 5 s |
| 掉线重连 | 手动,一般 | 自动 |
| 手感合适的失联超时 | 300–500 ms | 300–500 ms |
失联自动停车超时是最值得仔细调的参数,两种无线方式都需要它。太长,链路一断机器人还会明显地多开一截——在 0.3 m/s、1 s 超时的设定下,那就是 30 cm 无人驾驶的距离。太短,正常的包抖动就会让机器人不停停车,用起来像是坏了。
**两种方式可用的范围都是 300–500 ms。**低于大约 250 ms,普通的 Wi-Fi 抖动就会开始触发它;高于大约 700 ms,链路一断就会明显失控。
下一步去哪
你搭出来的指令层与任何行为层都是独立的,这正是它作为基础的好处。加一个超声波传感器,机器人就能在你按住前进时也拒绝撞墙——这就是避障机器人的开端。
这种既能被你驾驶、又能反过来否决你的组合,也是开发自主功能最省事的路径:出问题的地方,你只要用手把机器人摆过去就行,不必一路走过去把它捡回来。
项目路线图
搭建路径
沿着技术树,从零件一路走到一台能正常工作的机器人。每个节点在其前置条件完成后解锁,你的进度会保存在这台设备上。
已完成 0 / 14
元器件
- 控制器Arduino Uno对新手失误很宽容的 8 位开发板,大多数人正是通过它认识机器人的。
- 通信HC-05 蓝牙模块基于蓝牙的无线串口——只用两个引脚,就能用手机遥控机器人。
- 控制器ESP32带 Wi-Fi 和蓝牙的双核单片机——从 Uno 迈向无线的那一步升级。
- 驱动器L298N 电机驱动板双 H 桥驱动,把单片机微弱的逻辑引脚信号变成带动电机的动力。
- 执行器直流减速电机(TT 电机)黄色减速箱电机,能把一个光秃秃的底盘变成会跑的机器人小车。
- 底盘两轮驱动机器人底盘一块甲板:两个电机、一个自由万向轮和你的全部电子元件都固定在它上面。
- 电源机器人电池与电源包能正常运行的机器人和不停复位的机器人,差别就在它身上。
本路径中的教程
常见问题解答
机器人小车该用蓝牙还是 Wi-Fi?
用 HC-05 走蓝牙更容易调通,而且只需配对一次,但你需要一个串口终端 App,距离也只有大约十米。ESP32 走 Wi-Fi 则完全不需要 App——它会向任何浏览器提供自己的控制页面——而且距离更远,但手机连入机器人的网络时会断开互联网连接。第一次制作的话,蓝牙是更短的路;而对于任何你打算拿去演示的作品,ESP32 那个免 App 的控制页面值得多花一个小时。
为什么我松开按键之后,蓝牙机器人还在继续开?
因为它根本没收到松开的信息。有线机器人在你松手时会停下;无线机器人则会一直执行它收到的最后一条指令。解决办法要两头做:让手机在按键按住期间每 100 ms 重复发送当前指令,并让机器人在几百毫秒内没有收到任何指令时自动停车。这样,松开按键和信号丢失会产生同样安全的结果,你也永远不必依赖一条可能永远到不了的停车消息。
把 HC-05 直接接到 Arduino 上会损坏它吗?
会,损坏的是其中一个引脚。这个模块的逻辑电平是 3.3 V,它的 RX 引脚不耐 5 V,所以 Arduino 直接向它发送信号会让这个输入端承受过压。让人抓狂的是,这种损坏通常是不彻底的——模块仍然能配对、仍然能发送,却会悄悄地损坏或忽略你发给它的内容。在这一根线上用两个电阻做分压就能避免。
用手机控制机器人需要安装 App 吗?
只有蓝牙需要。HC-05 需要手机上装一个蓝牙串口终端来打开端口。ESP32 什么都不需要:它会创建自己的 Wi-Fi 网络并提供一个 HTML 页面,所以你连上网络、打开浏览器就行。对于一台你希望别人也能驾驶的机器人来说,这是选择 ESP32 最有力的实际理由。
手机控制的机器人也能自己行驶吗?
能,而且这是很自然的下一步。你在这里搭建的指令层与行为层是分开的,所以加上传感器之后,机器人就能否决你的指令——即使你按住前进,它也会拒绝撞墙。先把手动层做好:当你能从房间另一头用手动操作把机器人摆到位时,调试传感器要容易得多。