树莓派如何连接使用超声波传感器 HC-SR04 ?

在本树莓派距离传感器教程中,我们将结合 HC-SR04 超声波传感器和树莓派使用。

本指南将向您展示如何将传感器与树莓派连接起来,以及探索如何利用传感器来读取距离。

我们将向您展示如何将 HC-SR04 传感器连接到树莓派,包括如何将分压器连接为对于树莓派,该电路需要将传感器的 5v 输出降至 3 .3v。

这只是您可以与树莓派一起使用的众多传感器之一,如果您对更多传感器感兴趣,那么请务必查看我们的 [树莓派传感器教程](/categories/raspberry-pi -sensors /) 部分。

包括显示如何将传感器连接到树莓派上,我们还将探索编写 Python 脚本,该脚本将利用 HC -SR04 超声波传感器来计算距离。

我们通过测量超声波脉冲被发送到传感器被接收回来所花费的时间来实现。

设备清单

以下是本指南中用于设置树莓派距离传感器电路的所有细节

推荐的

  • 树莓派 2 或 3

  • Micro SD 卡

  • 电源

  • HC-SR04 超声波传感器

  • 1k OHM 电阻器

  • 2k OHM 电阻器

  • 面包板

  • Breadboard Wire

可选的

  • 树莓派外壳

  • 以太网网络连接或 * Wifi 加密狗 (Pi 3 具有 WiFi 内置的)

树莓派距离传感器硬件设置

在本节中,我们将向您展示如何将 HC -SR04 距离传感器连接到树莓派。布线传感器是一个相对简单的过程,因为距离传感器的大多数引脚直接映射到树莓派上的引脚。

将设备连接到树莓派的唯一稍微复杂的部分是我们为回波引脚设置的分压器。

添加分压器的原因是将进入 GPIO 引脚的电压从 ** 5v 降至 3.3v 。在本指南中,我们将使用 1kΩ 电阻和 2kΩ** 电阻来实现此目的。如果您想了解我们如何计算分压器的值,可以查阅本书结尾处的指南。

请按照以下指南查看如何将 HC -SR04 距离传感器连接到树莓派。

  • VCC 连接到引脚 2 (5v)
  • Trig 连接到引脚 7 (GPIO 4)
  • 回音连接到 R1 (1kΩ)
  • R2 (2kΩ) 从 R1 接地
  • 来自 R1 和 R2 的导线连接到引脚 11
  • GND 连接到引脚 6 (接地)

[](https://pi.lbbcdn.com/wp-content/uploads/2018/03/Distance-sensor-GPIO-pins .png)

要构造电路,请执行以下操作。

别忘了您可以使用上面的图表让自己对需要做的事情有所了解。

1接地引脚 (引脚 6 )** 到面包板上的接地 / 负导轨 ** 布线。

2 从 5v 引脚 (引脚 2 **) 到 HC-SR04 距离传感器的 VCC ** 引脚连接一根导线。

3引脚 7 ** 到距离传感器上 TRIG ** 引脚的导线。

4 从距离传感器的 ** ECHO 引脚到面包板上的一个点运行一个 1kΩ** 电阻。

5 在树莓派上的 ** 1kΩ 电阻和接地 / 负轨之间运行一个 2kΩ** 电阻。

6 将电线从 ** 1kΩ 电阻和 2kΩ 电阻之间连接至树莓派上的引脚 11 **。

利用您的树莓派距离传感器

1 要使用我们的树莓派距离传感器,我们只需要编写一个 python 脚本即可。由于我们仅使用 GPIO 引脚与距离传感器进行交互,因此无需弄乱 raspi -config 工具。

在开始编写脚本之前,首先创建一个文件夹来保存它。在树莓派上运行以下两个命令以创建文件夹并更改目录。

mkdir〜/distance_sensor /
cd〜/距离传感器**2** 现在我们位于新目录中,让我们开始在树莓派上运行以下命令来编写距离传感器 python 脚本。
vim distance _sensor.py

3 在此文件中,编写以下代码行。我们将在编写代码时解释每个代码块的重要部分。请记住,在用 Python 代码编写时,它是空格敏感的,因此请确保您保留我们放入的选项卡。

#!/usr/bin/python
将 RPi .GPIO导入为 GPIO 
导入时间

尝试:

第一行告诉 shell 我们应该利用什么来运行 Python 文件。没有它,就不能保证我们的文件将被 Python 解释。

然后,我们继续导入需要编写脚本并与树莓派中的距离传感器进行交互的两个库。我们导入的两个库如下:

** Rpi.GPIO ** –这是允许我们控制 GPIO 引脚并与之交互的软件包,如果没有此软件包,我们将无法与距离传感器通信。

时间 –该软件包允许我们使用脚本控制与时间相关的功能。我们主要只是使用它来使脚本进入休眠状态,并确定从传感器接收回数据所需的时间。

最后,我们开始我们的 try :语句,我们在其中涵盖了绝大多数代码,以确保我们在退出时清除 GPIO 引脚。

      GPIO.setmode(GPIO.BOARD)

      PIN_TRIGGER = 7
      PIN_ECHO = 11

      GPIO.setup(PIN_TRIGGER,GPIO.OUT)
      GPIO.setup(PIN_ECHO,GPIO.IN)

在第一行,我们将 GPIO 模式设置为 GPIO .BOARD,这意味着我们使用的是物理引脚号,而不是 BCM 号。我们使用它来确保与脚本的兼容性,因为不能保证 BCM 编号保持不变。

接下来的两行我们创建两个变量,以存储触发和回显连接到的物理引脚。我们在这里定义它们是为了轻松更改它们,而不必不断地浏览代码。

接下来,我们将两个引脚都设置为期望输出或输入。我们的触发引脚显然是输出引脚,因为我们需要对该引脚进行 ping 操作以启动传感器。echo 引脚是我们期望数据的来源,因此我们将其设置为接收输入。

      GPIO.output(PIN_TRIGGER,GPIO.LOW)

      打印"等待传感器稳定"

      time.sleep(2)

第一行我们设置了 ** PIN \ _TRIGGER GPIO ** 引脚,因此将其设置为” 低” 不会发出任何东西。我们这样做是为了让我们的 HC -SR04 传感器稳定下来。这确保了我们应该获得更一致的读数。

然后,我们将脚本休眠 2 秒钟,以确保我们给距离传感器足够的时间来稳定并不会立即开始触发它。

      打印"计算距离"

      GPIO.output(PIN_TRIGGER,GPIO.HIGH)

      时间。睡眠(0.00001)

      GPIO.output(PIN_TRIGGER,GPIO.LOW)

最后,我们进入一段代码,该代码将触发”HC-SR04 距离传感器”。为此,我们需要先将 PIN \ _TRIGGER ** 设置为高。

然后,我们需要将脚本休眠 1 纳秒,原因是 HC -SR04 距离传感器需要 1 纳秒的脉冲来触发它。

睡眠完成后,立即将 PIN \ _TRIGGER ** 再次设置为低电平。

      而 GPIO .input(PIN_ECHO)== 0时:
            pulse_start_time = time.time()
      而 GPIO .input(PIN_ECHO)== 1时:
            pulse_end_time = time.time()

      脉冲持续时间=脉冲结束时间-脉冲开始时间

      距离=圆(pulse_duration * 17150,2)

      打印"距离:",距离,"cm"

首先,我们运行一个 while 循环,以连续检查 ** PIN \ _ECHO 是否为低 ( 0 )(如果连续),将 pulse \ _start \ _time ** 设置为当前值达到高 **(** 1 **) 的时间

一旦 PIN \ _ECHO ** 读取为高电平,我们将 pulse \ _end \ _time ** 设置为当前时间。直到 PIN \ _ECHO ** 再次设置为低,我们才这样做。

这两个循环使我们能够计算出超声波脉冲被发送和接收回来所花费的时间。一旦我们拥有了两个时间,我们就减去两个节省的时间来计算持续时间。

计算出脉冲持续时间后,我们便可以算出距离,因为我们知道超声波的粗略速度是 ** 34300 cm/s **,所以它行进了。

由于脉冲的持续时间是超声波击中物体并反弹所需的时间,因此我们将使用一半的速度来计算超声波在返回之前所经过的距离。这样做是一个简单的计算,然后以全速计算距离,然后除以 2 。

因此,最终我们的距离等于脉冲持续时间乘以 ** 17150 cm/s **。

最后:
      GPIO.cleanup()这最后两行代码非常关键,因为它确保了 try :语句的结束,并确保在脚本以任何方式终止时我们都运行 GPIO .cleanup()**。否则,将在重新运行脚本或使用 GPIO 引脚的任何其他脚本时引发警告。

4 输入完所有代码后,您应该得到与下面类似的内容。

#!/usr/bin/python
将 RPi .GPIO导入为 GPIO 
导入时间

尝试:
      GPIO.setmode(GPIO.BOARD)

      PIN_TRIGGER = 7
      PIN_ECHO = 11

      GPIO.setup(PIN_TRIGGER,GPIO.OUT)
      GPIO.setup(PIN_ECHO,GPIO.IN)

      GPIO.output(PIN_TRIGGER,GPIO.LOW)

      打印"等待传感器稳定"

      time.sleep(2)

      打印"计算距离"

      GPIO.output(PIN_TRIGGER,GPIO.HIGH)

      时间。睡眠(0.00001)

      GPIO.output(PIN_TRIGGER,GPIO.LOW)

      而 GPIO .input(PIN_ECHO)== 0时:
            pulse_start_time = time.time()
      而 GPIO .input(PIN_ECHO)== 1时:
            pulse_end_time = time.time()

      脉冲持续时间=脉冲结束时间-脉冲开始时间
      距离=圆(pulse_duration * 17150,2)
      打印"距离:",距离,"cm"

最后:
      GPIO.cleanup()

输入正确的代码后,您可以通过依次按 ** Ctrl + X Y 并按 Enter ** 来保存文件。

5 现在您已经成功编写了脚本,我们可以通过在树莓派上运行以下简单命令来运行它。

python〜/distance_sensor/distance_sensor.py

6 如果一切正常,您应该在终端中获得如下所示的内容。当然,距离将与我们得到的距离不同。

等待传感器稳定
计算距离
距离:29.69厘米

希望到现在为止,您已经成功设置了树莓派距离传感器,并编写了与该传感器交互并成功计算距离的 python 脚本。

如果您想扩展此项目,则可能需要查看 16×2 LCD 教程。这是显示距离而无需将显示器连接到树莓派的理想方法。

如果您喜欢通过树莓派设置 HC -SR04 距离传感器的本教程,或者需要一些帮助来启动和运行它,请与我联系。

分享到