想让小车“自己会躲障碍”,得先让它“看得见”前面的东西——最常见、最实惠的做法就是装一个超声波传感器(像 HC-SR04 这类)。它测出前方距离,程序一判断“太近了就停/倒车”,小车就“会避障”了。这篇把超声波测距和避障小车的做法讲明白。
超声波传感器怎么测距离
原理很像蝙蝠:传感器发出超声波,碰到障碍反弹回来,传感器收到回声,记下从发出到收到的时间,再根据声速就能算出距离。公式就一句:
距离 = 声速 × 时间 ÷ 2
(除以 2 是因为声波走了“去 + 回”两趟)。HC-SR04 这类模块有 4 个脚:VCC 电源、GND 地、Trig 触发、Echo 回声。树莓派给 Trig 一个触发信号,模块发波,Echo 返回高电平的时间就对应距离。GPIO Zero 把这些全封装好了,你只管读距离。
读距离:GPIO Zero 的 DistanceSensor
接好线,用 DistanceSensor 就能一直读出前方障碍的距离(单位米):
from gpiozero import DistanceSensor
from time import sleep
sensor = DistanceSensor(23, 24) # 23=echo, 24=trigger
while True:
print('最近障碍距离:', sensor.distance, '米')
sleep(1)
这里 DistanceSensor(23, 24) 里 23 是 Echo 脚、24 是 Trig 脚的 GPIO 号(以实际接线为准)。sensor.distance 就是实时距离,单位是米。
碰到东西触发动作:距离阈值
想让程序“东西靠太近就干点啥”,可以设一个距离阈值,比如 0.2 米(20cm)内就触发,距离一超过阈值就恢复:
from gpiozero import DistanceSensor, LED
from signal import pause
sensor = DistanceSensor(23, 24, max_distance=1, threshold_distance=0.2)
led = LED(16)
sensor.when_in_range = led.on # 障碍进 20cm → 亮灯
sensor.when_out_of_range = led.off # 障碍出 20cm → 灭灯
pause()
when_in_range(进入阈值)和 when_out_of_range(离开阈值)是两个“事件回调”——一旦触发就自动执行对应的动作。这里用 LED 演示,换成电机就是避障了。
终极玩法:超声波 + 电机 = 自动避障小车
把这套跟上一篇文章讲的 Robot 电机控制合起来,就是一辆会自己躲障碍的小车——前方 20cm 内有东西,就自动倒车/躲避:
from gpiozero import Robot, Motor, DistanceSensor
from signal import pause
sensor = DistanceSensor(23, 24, max_distance=1, threshold_distance=0.2)
robot = Robot(left=Motor(4, 14), right=Motor(17, 18))
sensor.when_in_range = robot.backward # 太近 → 倒车
sensor.when_out_of_range = robot.stop # 远了 → 停
pause()
when_in_range = robot.backward 意思是“一有障碍靠近就倒车”,when_out_of_range = robot.stop 是“障碍远了就停”。几行代码,一辆最简单的自动避障小车就跑起来了。想更聪明(比如先看哪边有空再转弯),就在回调里写自己的逻辑。
超声波测距是小车智能化的第一课——从“会动”到“会躲”。跑跑啦的全自动智能小车整机在底盘上预留了接传感器和电池的位置,配合后轮编码器做闭环,能实现更精准的避障和定位走位。想配齐超声波这类传感器模块练手,可以看我们传感器模块和智能小车产品。淘宝店:paopaola.taobao.com。
小提示:超声波「发波-收波-算距离」三步走,配阈值事件回调就能自动避障。想从“会动”到“会躲”,这是入门第一步。
(本文整理自 Raspberry Pi 树莓派官方文档《GPIO Zero》距离传感器/小车示例与 GPIO Zero 官方文档,CC BY-SA 4.0,来源:https://shumeipai.nxez.com/doc-zhcn/docs/program/gpio/gpiozero)


微信联系
淘宝联系