超声波传感器使用声音脉冲和简单的计算来确定其自身与前方物体之间的距离。它们通常用于机器人中,以确保机器人不会行走或滚入障碍物。树莓派 Pico 基于 RP2040 芯片的多功能微控制器板,当与超声波传感器(例如 HC-SR04)等传感器结合使用时,Pico 成为测量距离、检测物体和创建智能自动化应用的理想平台。下面我们将了解如何在树莓派 Pico 上使用超声波传感器。
材料清单
– 树莓派 Pico
– HC-SR04 超声波传感器
– 跳线若干
– 面包板或 Pico 扩展板
超声波传感器的引脚排列如下:
– VCC 引脚用于为传感器供电。它通常需要 5V 直流电源。
– Trig 引脚用于向传感器发送触发信号。当高电平信号(通常为 5V)施加到该引脚时,传感器开始发射超声波。
– Echo 引脚用于接收来自传感器的回波信号。当传感器发出的超声波击中物体并反弹回来时,传感器会在该引脚上产生脉冲。
– VCC 引脚是传感器的接地连接,应连接到电路的接地 (0V)。
HC-SR04 的测距过程
1. 树莓派向 Trig 脚发送一个持续 10us 的脉冲信号。
2. HC-SR04 接收到树莓派发送的脉冲信号,开始发送超声波 (start sending ultrasoun),并把 Echo置为高电平。 然后准备接收返回的超声波。
3. 当 HC-SR04 接收到返回的超声波 (receive returned ultrasound) 时,把 Echo 置为低电平。
从上述过程可以看出,Echo 高电平持续的时间就是超声波从发射到返回所经过的时间间隔~
请对照下图接线。
Pico 的 3V3 引脚连接到超声传感器的 VCC 引脚。
Pico 的 GND 引脚连接到超声传感器的 GND 引脚。
Pico 的 GPIO 引脚 3 连接到超声传感器的 Trig 引脚。
Pico 的 GPIO 引脚 2 连接到超声传感器的 Echo 引脚。
编程
电路连接好之后,将树莓派 Pico 连上 PC 并打开 Thonny。
1、从计算机库导入 Pin 类,然后导入 utime 库。前者用于控制 GPIO 引脚,后者是基于时间的函数库。
from machine import Pin import utime
2、创建两个新对象,触发器和回声。这些对象配置要与超声传感器一起使用的 Pico 的 GPIO 引脚。例如,我们的触发引脚用于发送电流脉冲,因此它是输出引脚。回波引脚接收反射的脉冲,因此回波是输入。
trigger = Pin(3, Pin.OUT) echo = Pin(2, Pin.IN)
3、创建一个函数 ultra(),其中将包含读取所需的代码。
def ultra():
4、将触发引脚拉低,以确保其未激活,然后暂停两微秒。
trigger.low() utime.sleep_us(2)
5、在将触发器引脚拉低之前,将触发器引脚拉高五秒钟。这将从超声波传感器发送一个短脉冲,然后关闭该脉冲。
trigger.high() utime.sleep_us(5) trigger.low()
6、创建一个 while 循环以检查回波引脚。如果没有收到回波脉冲,则更新变量 signaloff,使其包含以微秒为单位的时间戳。
while echo.value() == 0: signaloff = utime.ticks_us()
7、创建另一个 while 循环,这次检查是否已收到回声。这会将当前时间戳(以微秒为单位)存储到 signalon 变量中。
while echo.value() == 1: signalon = utime.ticks_us()
8、创建一个新的 timepass 变量,该变量将存储脉冲离开传感器,撞击物体并作为回波返回传感器所花费的总时间值。
timepassed = signalon - signaloff
9、创建一个新变量,距离。此变量将存储方程式的答案。我们将行进时间(经过的时间)乘以声速(343.2m/s,即每微秒 0.0343cm),该方程的乘积除以 2,因为我们不需要总行进距离,而只需从反对传感器。
distance = (timepassed * 0.0343) / 2
10、打印一条消息到 Python Shell,显示距离。
print("The distance from object is ",distance,"cm")
11.现在,我们移出该函数,创建一个循环,该循环将每秒运行一次该函数。
while True: ultra() utime.sleep(1)
下面是完整的代码:
from machine import Pin import utime trigger = Pin(3, Pin.OUT) echo = Pin(2, Pin.IN) def ultra(): trigger.low() utime.sleep_us(2) trigger.high() utime.sleep_us(5) trigger.low() while echo.value() == 0: signaloff = utime.ticks_us() while echo.value() == 1: signalon = utime.ticks_us() timepassed = signalon - signaloff distance = (timepassed * 0.0343) / 2 print("The distance from object is ",distance,"cm") while True: ultra() utime.sleep(1)
将代码作为 code.py 保存到树莓派 Pico 上,然后单击 Run 按钮以运行代码。在 Python Shell 中,您将看到每秒打印的距离。
报错:MPY: soft reboot
Traceback (most recent call last):
File “”, line 17
SyntaxError: invalid syntax
第17行是:signaloff = utime.ticks_us()
这个是用文心一言后得出的问题解析和代码,成功运行。
看起来你正在尝试使用一个激光测距传感器进行物体距离的测量。这段代码应该是在使用一个类似MicroPython的环境运行的,因为使用了machine模块和utime模块,这些都是在MicroPython环境下可用的模块。
这段代码的大致逻辑是这样的:
通过引脚3发送一个脉冲信号,这个信号是用来触发传感器的。
等待2微秒后,再通过引脚3发送一个持续5微秒的高电平信号。
之后,通过引脚2(这个应该是回声信号的引脚)来检测传感器是否成功发送了回声信号。
如果回声信号返回了(即echo.value()为1),那么就记录下这个时间,然后等待回声信号结束(即echo.value()为0)。
记录下回声信号开始和结束的时间,然后计算出这两个时间之间的差值,这个差值就是传感器发送和接收到回声信号的总时间。
最后,根据公式(timepassed * 0.0343) / 2来计算出物体到传感器的距离。这个公式看起来是用来将时间转换为距离的,其中0.0343是一个常数,代表的是声速(在空气中约为343米/秒)。
然而,你的代码中存在一些问题:
while echo.value() == 0: 和 while echo.value() == 1: 这两个循环没有设置等待时间,这可能会导致程序卡死。你应该在这两个循环中添加一个等待时间,比如utime.sleep_us(10)。
计算距离的公式中除以2是因为超声波在去程和返程的时间是相等的,所以要除以2来得到单程的时间。但是你的代码中并没有明确地表示去程和返程的时间,所以这个公式可能不会正确地工作。你可能需要更详细地记录去程和返程的时间,然后使用总时间的一半来计算距离。
这是修复后的代码:
python
复制代码
from machine import Pin
import utime
trigger = Pin(3, Pin.OUT)
echo = Pin(2, Pin.IN)
def ultra():
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(5)
trigger.low()
while echo.value() == 0:
signaloff = utime.ticks_us()
utime.sleep_us(10) # Wait for the end of the echo signal
while echo.value() == 1:
signalon = utime.ticks_us()
utime.sleep_us(10) # Wait for the start of the echo signal
timepassed = signalon – signaloff
distance = (timepassed * 0.0343) / 2 # This is a rough estimate, might need adjustments
print(“The distance from object is “,distance,”cm”)
while True:
ultra()
utime.sleep(1)