跳过主要内容

如何使用超声波传感器与树莓皮皮

超声波传感器与树莓皮皮
(图片来源:Tom’s Hardware)

用你的电子设备有很多方法来检测运动和距离。在另一个教程中,我们展示了如何使用PIR运动传感器与树莓皮皮.PIRs用于报警系统,它利用红外光探测房间里移动的物体,在一些项目中很有用,例如,你希望用户在设备前挥手来激活它。我们的教程如何构建树莓派洗手定时器使用pir。

另一方面,超声波传感器利用声波脉冲和简单的计算来确定它们与前面物体之间的距离。它们通常用于机器人,以确保机器人不会行走或撞到障碍物。我们也在树莓派厕纸提醒来判断我们什么时候没面包了。在本教程中,我们将使用一个超声波距离传感器,HC-SR04+,来快速确定物体与树莓派Pico的距离。

对于这个项目,您将需要

图1 / 2

超声波传感器与树莓皮皮

(图片来源:Tom’s Hardware)
图2中的图2

超声波传感器与树莓皮皮

(图片来源:Tom’s Hardware)

树莓皮皮超声传感器的硬件设置

这款专用超声波传感器与Raspberry Pi Pico GPIO上使用的3V逻辑兼容。HC-SR04P和HC-SR04+兼容3V和5V逻辑,是Raspberry Pi Pico、Pi和Arduino项目的理想选择。

(图片来源:Tom’s Hardware)

2.将HC-SR04P超声传感器插入接线板。

(图片来源:Tom’s Hardware)

3.连接3V3引脚树莓派皮科的到VCC引脚o超声波传感器采用公对公跳线。

(图片来源:Tom’s Hardware)

4.连接GND引脚在树莓派皮科上到GND脚使用跳线的超声波传感器。

(图片来源:Tom’s Hardware)

5.连接触发销超声波传感器的到GPIO引脚3树莓派皮科的。

(图片来源:Tom’s Hardware)

6.连接Echo引脚从超声波传感器到GPIO引脚2树莓派皮科的。

(图片来源:Tom’s Hardware)

树莓皮皮超声传感器的软件设置

电路建立后,连接你的树莓皮皮和打开桑尼应用程序。

1.从机器库导入Pin类,然后导入utime库。前者用于控制GPIO管脚,后者是一个基于时间的函数库。

从机器进口引脚进口utime

2.创建两个新对象,trigger和echo。这些对象配置了用于超声波传感器的Pico的GPIO管脚。例如,我们的触发器引脚用于发送电流脉冲,因此它是一个输出引脚。回波管脚接收反射的脉冲,因此回波是一个输入。

trigger = Pin(3, Pin. out) echo = Pin(2, Pin. in)

3.创建一个函数ultra()其中将包含读取所需的代码。

def超():

4.把扳机销拉低,为了确保它不是活动的,请暂停两微秒。

utime.sleep_us trigger.low () (2)

5.在将触发器引脚拉低之前,将触发器引脚高拉五个微发送。这将从超声波传感器发送一个短脉冲,然后关闭脉冲。

trigger.high () utime.sleep_us (5) trigger.low ()

6.创建一个while循环来检查echo引脚。如果没有接收到回波脉冲,则更新一个变量signaloff,使其包含一个以微秒为单位的时间戳。

While echo.value() == 0: signaloff = utime.ticks_us()

7.创建另一个while循环,这次检查是否收到了回调。这将以微秒为单位将当前时间戳存储到signalon变量中。

echo.value() == 1: signalon = utime.ticks_us()

8.创建一个新变量,timepassed,它将存储脉冲离开传感器,击中物体并作为回声返回到传感器的总时间值。

Timepassed = signalon - signaloff

9.创建一个新变量distance。这个变量将存储这个方程的答案。我们将旅行时间(经过的时间)乘以声速(343.2米/秒,即0.0343厘米/微秒),这个等式的乘积除以2,因为我们不需要总旅行距离,只需要物体到传感器的距离。

距离= (timepassed * 0.0343) / 2

10。打印一条消息到Python Shell显示的距离。

打印("The distance from object is ",distance,"cm")

11.我们现在离开函数创建一个循环每秒钟运行一次函数。

while True: ultra() utime.sleep(1)

以下是完整的代码:

完整的代码清单

utime.sleep_us(5) trigger.low() while echo.value() == 0: signaloff = utime.ticks_us() while echo.value() == 1:/ 2 print("The distance from object is ",distance,"cm") while True: ultra() utime.sleep(1)

将代码以code.py的形式保存到Raspberry Pi Pico中,并单击绿色箭头运行代码。在Python Shell中,您将看到每秒打印的距离。

超声波传感器与树莓皮皮

(图片来源:Tom’s Hardware)
  • Sel199
    我有一个问题,我认为是代码,但它似乎是一个布线问题,连接似乎是间歇性的,所以它只有在我拨弄电线时才工作。
    奇怪的是,我把所有的电线都换了,甚至换了板,它还是不能运行。

    更新,原来我有5v版本的传感器HC-SR04,但我也有US-015传感器也5v工作完美。
    回复
  • kopjasa
    你可以使用5V版本,例如:HY-SRF05。只是你需要改变3V3品脱到VBUS引脚,你必须通过USB端口馈电。(请注意,在这种情况下,你必须为ECHO线使用分压器。)
    回复
  • dathai
    如果您将Trigger与引脚16对齐并echo与17对齐,您可以节省3线,这将把GND与GND放在一起。
    如果需要5V并通过micro-USB供电,则需要从3V3或VSYS/VBUS连接一根电线。
    回复
  • ZukaBlue
    我很好奇这些代码是如何工作的。

    我一直在看这个部分:

    echo.value() == 0:
    signaloff = utime.ticks_us ()
    echo.value() == 1:
    signalon = utime.ticks_us ()
    Timepassed = signalon - signaloff
    Dist = (timepassed * 0.0343) / 2

    我一直在想这到底是怎么回事。对我的大脑来说,这似乎只是测量传入脉冲的长度。如果我错了,有人纠正我,或者让我知道这是怎么回事,但这是我的逻辑-
    发出脉冲
    当我们没有检测到一个接收到的脉冲时,保持更新一个数字。例:
    1001 1002 1003 10041005当我们收到一个脉冲时,更新一个不同的数字。例:
    1006、1007、1008从第二项减去第一项:
    1008 - 1005 = 3这只是测量了我们实际检测到的脉冲返回的微秒数,而不是脉冲反弹所花的时间。我怎么会想错了呢?我是否误解了utime.ticks_us()的作用?这只是从它被调用的时间开始计数,然后当它开始检测到一个高信号时开始再次计数吗?我的想法是,在从触发器发送一个高脉冲之后,立即对utime.ticks_us()进行一次测量。它会找到一些微秒值并将其存储为一个值,然后我们等待,直到我们得到一个高脉冲,在那之前什么都不做。当我们得到一个高脉冲时我们用微秒来标记这个高脉冲的开始,然后我们可以找到初始输出脉冲和返回脉冲的差值,乘以声速,以厘米/秒为单位,然后除以2。


    编辑:显然,我知道它是有效的,我只是试图拼凑它是如何工作的。同样,在while循环中定义了signaloff和signalon,但是之后它们会在这些缩进之外再次使用。为什么它允许这样做?
    回复
  • Jpico
    dathai说过:
    如果您将Trigger与引脚16对齐并echo与17对齐,您可以节省3线,这将把GND与GND放在一起。
    如果需要5V并通过micro-USB供电,则需要从3V3或VSYS/VBUS连接一根电线。

    你说得太对了!

    你把我们从意大利面条电缆中救了出来!:)
    回复