深色模式
第 6 章:利用超声波传感器做一个磁吸小车
6.1 任务描述
本章实现自动跟随功能:目标靠近时小车后退,目标远离时小车前进,目标处于合适距离时小车停止。全程小车与目标保持固定距离,如同被磁力吸附,故称"磁吸小车"。
6.2 模块原理
超声波模块(⑦)的工作原理与基础教具包教程第 10 章相同:Trig 引脚触发测距,Echo 引脚返回回波信号,距离 = 回波高电平时间 × 声速 ÷ 2。D3 上的接线为:Trig 接 GP21,Echo 接 GP20,供电 3.3V。模块安装在舵机(⑥,GP15 角度控制)上,可通过舵机改变探测方向。
在 Mind+ 中,超声波测距积木已完成上述换算,无需手动编写。点击 Mind+ 左下角的"扩展"按钮,找到超声波测距传感器模块并加载,返回主界面即可使用(操作与基础教具包教程第 10 章一致)。

6.3 代码实现前的关键一步:舵机回正90°
单独设置一个舵机回中至 90°程序,上传到小车中运行,若超声波未正对前方,拔起卡扣式底座调整角度后复位,即完成默认指向校准。

python
# 把舵机停在 90°,让超声波正对前方
# 之后所有测距都是"正前方距离",不需要再转舵机
servo_angle(90)
time.sleep(1) # 等 1 秒,确保舵机确实转到位置再开始主程序cpp
// 把舵机停在 90°,让超声波正对前方
// 之后所有测距都是"正前方距离",不需要再转舵机
void setup() {
servo15.attach(15);
servo15.write(90);
delay(1000); // 等 1 秒,确保舵机确实转到位置再开始主程序
}6.4 代码实现第二步:磁吸跟随逻辑的实现
跟随的控制逻辑为:**距离过大则前进,距离过小则后退,距离在设定区间内则停止。**将距离区间与动作的对应关系整理如下:
| 测得距离 | 判定 | 小车动作 |
|---|---|---|
| 大于 30 cm | 目标过远 | 前进(调用"4.3.3 四向移动封装函数") |
| 15 ~ 30 cm | 距离合适 | 停止 |
| 小于 15 cm | 目标过近 | 后退(调用"4.3.3 四向移动封装函数") |
程序结构:循环执行「读取距离 → 若大于 30 则前进 → 否则若小于 15 则后退 → 否则停止」。30 与 15 两个阈值为经验值,可自行调整:区间越宽,小车响应越迟缓;区间越窄,跟随越灵敏。

python
# 磁吸跟随:像被磁铁吸住一样,与前方目标始终保持 15~30 厘米
while True:
s = distance() # 测与前方目标的距离
if s >= 30:
go_sp(150, 1) # 太远了(≥30cm):前进跟上
elif s <= 15:
go_sp(-150, 1) # 太近了(≤15cm):后退拉开
else:
stop_all() # 15~30cm 之间:距离刚刚好,停车
# 三个分支合起来就是一个"死区"控制:
# 15~30cm 是死区,在死区内不动,出了死区就往死区里开
time.sleep(0.05) # 每 0.05 秒测一次,跟得平顺不抽搐cpp
// 磁吸跟随:像被磁铁吸住一样,与前方目标始终保持 15~30 厘米
void loop() {
float s = distance(); // 测与前方目标的距离
if (s >= 30) {
go_sp(150, 1); // 太远了(≥30cm):前进跟上
} else if (s <= 15) {
go_sp(-150, 1); // 太近了(≤15cm):后退拉开
} else {
stop_all(); // 15~30cm 之间:距离刚刚好,停车
}
// 三个分支合起来就是一个"死区"控制:
// 15~30cm 是死区,在死区内不动,出了死区就往死区里开
delay(50); // 每 0.05 秒测一次,跟得平顺不抽搐
}注意:柔软物体(毛衣、窗帘、海绵等)会吸收超声波,导致测距不准。跟随实验应使用手掌或硬质挡板作为目标。
