Skip to content

Latest commit

 

History

History
553 lines (353 loc) · 37.3 KB

File metadata and controls

553 lines (353 loc) · 37.3 KB

十四、测量距离和检测运动

欢迎来到我们的最终核心电子基础章节。在上一章中,我们学习了如何以复杂的方式控制三种不同形式的电机。在本章中,我们将使用覆盆子 Pi 和电子设备来检测运动和测量距离。

检测移动对于自动化项目非常有用,例如当您走进房间或建筑物时打开灯、报警系统、建筑物计数器或检测竖井的转数。我们将研究两种运动检测技术,包括一种被动红外PIR)传感器,该传感器使用热检测来检测人(或动物)的存在,以及一种检测磁场存在的数字霍尔效应传感器(或者,更宽泛地说,我们可以说霍尔效应传感器可以检测磁铁何时经过它)。

距离测量也适用于许多项目,从碰撞检测电路到测量水箱液位。我们将研究两种形式的距离测量,包括使用超声波传感器测量 2 厘米到 4 米的距离,以及模拟霍尔效应传感器测量毫米以下的磁场。

以下是我们将在本章中介绍的内容:

  • 用 PIR 传感器检测运动
  • 用超声波传感器测量距离
  • 利用霍尔效应传感器检测运动和距离

技术要求

要执行本章中的练习,您需要以下内容:

  • 树莓皮 4 B 型
  • Raspbian OS Buster(带桌面和推荐软件)
  • 最低 Python 版本 3.5

这些需求是本书中代码示例的基础。只要您的 Python 版本是 3.5 或更高版本,就可以合理地期望代码示例在 Raspberry Pi 3 Model B 或不同版本的 Raspbian OS 上无需修改即可工作。

您可以在 GitHub 存储库的chapter11文件夹中找到本章的源代码,该文件夹位于https://github.com/PacktPublishing/Practical-Python-Programming-for-IoT

您需要在终端中执行以下命令,以设置虚拟环境并安装本章代码所需的 Python 库:

$ cd chapter11              # Change into this chapter's folder
$ python3 -m venv venv      # Create Python Virtual Environment
$ source venv/bin/activate  # Activate Python Virtual Environment
(venv) $ pip install pip --upgrade        # Upgrade pip
(venv) $ pip install -r requirements.txt  # Install dependent packages

以下依赖项是从requirements.txt安装的:

本章练习所需的电子元件如下:

There are two variations of the HC-SR04 available. The more common HC-SR04, which outputs 5-volt logic and the HC-SR04P, which can operate at between 3 volts and 5.5 volts. Either module will be suitable for the exercise in this chapter.

用 PIR 传感器检测运动

PIR 传感器是一种能够检测物体(例如人)发出的红外光(热)的装置。我们在我们周围的应用中看到了这些类型的传感器,比如安全系统和自动门以及对我们的存在作出反应的灯。PIR 中的被动表示传感器仅检测运动。要检测什么移动以及如何,您需要一个主动红外设备,如热照相机。

PIR 传感器有几种不同的形式和种类;然而,它们的基本用途是相同的——它们充当一个简单的数字开关。当检测不到移动时,输出数字LOW,当检测到移动时,输出数字HIGH

下图所示为我们将用于示例的 HC-SR501 PIR 传感器模块。图为模块顶部、底部和 PIR 传感器的通用示意图符号:

Figure 11.1 – HC-SR501 PIR sensor module

一些 PIR 传感器,包括我们的 HC-SR501,具有机载设置和校准调整。这些调整用于改变传感器的灵敏度范围和触发模式。要使用 PIR 设备而不进行板上校准,意味着我们需要自己在代码中处理灵敏度调整。

对于 HC-SR501,其端子如下所示:

  • 接地:接地。
  • Vcc:连接到 5 伏和 20 伏之间的电源。
  • 数据:我们连接到 GPIO 引脚的数字输出。当 PIR 检测到移动时,该销会HIGH;否则,它将在没有移动的情况下保持LOW。HC-SR501 输出 3.3 伏信号,即使它需要 5 至 20 伏电源。下面我们将看到,车载灵敏度调整定时调整微调和触发模式跳线会影响检测到移动时该数据引脚保持HIGH的方式、时间和时间。

HC-SR501 车载设置如下:

  • 灵敏度调整:将有效运动感应范围从约 3 米更改为约 7 米。使用小螺丝刀旋转此设置的刻度盘。
  • 延时调整:检测到移动后,数据终端保持HIGH的时间。调整范围约为 5 秒至 300 秒。使用小螺丝刀旋转此设置的刻度盘。
  • 触发模式跳线:在存在持续运动检测的情况下,此跳线设置意味着延时到期后(由延时调整设置),数据终端将执行以下操作:
    • 保持HIGH。这是通过将跳线置于H位置设置的可重复触发设置。
    • 回复到LOW。这是单发设置,通过将跳线置于L位置进行设置。

PIR 的最佳设置取决于您打算如何使用它以及部署传感器的环境。我的建议是,在完成电路构建后,再进行设置调整,并运行后续章节中的示例代码,以了解更改设置如何影响传感器的操作。请记住查阅 HC-SR501 数据表,了解有关传感器及其车载设置的更多信息。

让我们连接 PIR 传感器,并将其连接到树莓 Pi。

创建 PIR 传感器电路

在本节中,我们将把 PIR 传感器连接到树莓 Pi。下面是我们将要构建的电路的示意图。如您所见,从 PIR 传感器的角度来看,它的接线相对简单:

Figure 11.2 – PIR sensor module circuit

让我们将其连接到 Raspberry Pi,如下图所示:

Figure 11.3 – PIR sensor circuit breadboard layout

以下是创建试验板构建的步骤。步骤编号与图 11.3中黑色圆圈中的编号匹配:

  1. 将 PIR 传感器的每个端子连接到试验板上。您将需要三根外接至外接跳线电缆。
  2. 将覆盆子 Pi 上的 5 伏引脚连接到 PIR Vcc 终端使用的同一排试验板上。PIR 传感器仅使用一点电流,因此可以将 5 伏 Vcc 引脚直接连接到覆盆子 Pi。
  3. 将 Raspberry Pi 上的 GND 引脚连接到 PIR 的 GND 终端使用的同一个试验板行。
  4. 将 Raspberry Pi 上的 GPIO 21 连接到 PIR 数据终端使用的同一个试验板行。

IMPORTANT: Our reference HC-SR501 PIR sensor requires >4.5 volts for its power (Vcc), and outputs 3.3 volts on its Sig output pin. If you are using a different PIR sensor, then consult its datasheet and check the output pin voltage. If it is >3.3 volts, you will need to use a voltage divider or logic level shifter. We will cover this exact scenario in the next section when we couple a voltage divider with an HC-SR04 sensor to convert its 5-volt output into a Raspberry Pi-friendly 3.3 volts.

一旦你创建了你的电路,我们将继续运行我们的 PIR 示例代码,这将让我们检测运动。

运行和探索 PIR 传感器代码

chapter11/hc-sr501.py文件中找到 out PIR 电路的代码。请在继续之前查看源代码,以广泛了解此文件包含的内容。

The HC-SR501 datasheet stipulates that the sensor needs around 1 minute after power-on to initialize and stabilize itself. If you try and use the sensor before it becomes stable, you may receive a few erroneous triggers when you start the program.

在终端中运行hc-sr501.py文件。当 HC-SR501 检测到移动时,程序将在终端上打印Triggered,或在未检测到移动时打印Not Triggered,如下输出:

(venv) $ python hc-sr501.py 

PLEASE NOTE - The HC-SR501 Needs 1 minute after power on to initialize itself.

Monitoring environment...
Press Control + C to Exit
Triggered.
Not Triggered.
... truncated ...

如果您的程序没有按预期响应,请尝试调整一个或多个灵敏度调整延时调整触发模式跳线设置,我们在前面标题为使用 PIR 传感器检测运动的部分中讨论了这些设置。

你可以考虑 HC-SR501 作为一个基本的开关。它要么是开的(HIGH),要么是关的(LOW),就像一个普通的按钮开关。事实上,我们的代码类似于第 2 章开始使用 Python 和 IoT中的响应按钮按下 PiGPIO一节中介绍的 PiGPIO 按钮示例。我们将在这里简单介绍一下核心代码部分;但是,如果您需要更深入的解释或复习,请重新访问第 2 章Python 和 IoT 入门中的 PiGPIO 部分。

让我们讨论一下示例代码。首先,我们从第 1 行开始,将 GPIO 引脚设置为启用下拉功能的输入引脚,而在第 2 行,我们启用了去抖动功能。我们的 HC-SR501 模块实际上不需要在代码中激活下拉,也不需要去抖动;但是,为了完整起见,我添加了它:

# ... truncated ...
GPIO = 21

# Initialize GPIO
pi.set_mode(GPIO, pigpio.INPUT)                               # (1)
pi.set_pull_up_down(GPIO, pigpio.PUD_DOWN)
pi.set_glitch_filter(GPIO, 10000) # microseconds debounce     # (2)

接下来,在第 3 行,我们定义了callback_handler()函数,每当 GPIO 引脚改变其HIGH/LOW状态时,就会调用该函数:

def callback_handler(gpio, level, tick):                       # (3)
    """ Called whenever a level change occurs on GPIO Pin.
      Parameters defined by PiGPIO pi.callback() """
    global triggered

    if level == pigpio.HIGH:
        triggered = True
        print("Triggered")
    elif level == pigpio.LOW:
        triggered = False
        print("Not Triggered")

最后,在第 4 行,我们注册了回调函数。第二个参数pigpio.EITHER_EDGE,当 GPIO 更改为HIGHLOW时,会调用callback_handler()

# Register Callback
callback = pi.callback(GPIO, pigpio.EITHER_EDGE, callback_handler) # (4)

相比之下,在第 2 章Python 入门和 IoT中,对于我们的按钮示例,该参数为pigpio.FALLING_EDGE,这意味着回调仅在按下按钮时调用,而不是在释放按钮时调用。

正如我们所看到的,PIR 传感器只能检测物体的接近程度,例如,有人靠近我们的传感器吗但它不能告诉我们这个物体有多远或多近。

我们现在已经学习了如何创建一个简单的 PIR 传感器电路并将其连接到 Raspberry Pi,以及如何使用它在 Python 中检测运动。有了这些知识,您现在可以开始构建自己的运动检测项目,例如,通过结合第 7 章、*打开和关闭、*中的示例,或者作为您自己的报警和监控系统的重要组成部分,在检测到某人或某个动物时打开和关闭东西。

接下来,我们将研究一种能够估计距离的传感器。

用超声波传感器测量距离

在上一节中,我们学习了如何使用 PIR 传感器检测运动。正如我们所发现的,我们的 PIR 传感器是一种数字设备,通过使其输出为数字HIGH来发出运动检测信号。

是时候学习如何用树莓皮测量距离了。有各种各样的传感器能够执行这项任务,它们通常与声音或光线一起工作。我们的示例将基于流行的 HC-SR04 超声波距离传感器(它在声音上工作),如下图所示:

Figure 11.4 – HC-SR04 ultrasonic distance sensor module

现代汽车保险杠是超声波距离传感器的常见位置(它们通常是小圆,与上图中的 HC-SR04 不同)。这些传感器计算你的汽车与附近物体之间的距离,例如,当你越来越靠近物体时,会使车内的传呼机发出越来越快的蜂鸣声

另一种常见的应用是测量液位,例如水箱中的液位。在这种情况下,(防水)超声波传感器测量从水箱顶部到水位的距离(声音脉冲从水中反弹)。然后,可以将测量的距离转换为油箱装满程度的估计值。

让我们仔细看看我们的 HC-SR04 传感器。参考 HC-SR04 数据表中的核心规范如下:

  • 电源电压 5 伏(HC-SR04)或 3 伏至 5.5 伏(HC-SR04P)
  • 逻辑电压 5 伏(HC-SR04)或 3 伏至 5.5 伏(HC-SR04P)
  • 工作电流 15 mA,静止电流 2 mA
  • 有效测量范围为 2 cm–4 m,精度为+/-0.3 cm
  • 触发脉冲宽度为 10µs(10 微秒)。我们将在标题为HC-SR04 距离测量过程的章节中重新讨论该脉冲宽度,并对其进行更多讨论。

SC-SR04 有两个圆形气缸。详情如下:

  • TTX:产生超声波脉冲的发射机
  • RRX:检测超声波脉冲的接收器

我们将在下一节讨论发射机和接收机对如何测量距离。

HC-SR04 有四个端子,如下所示:

  • Vcc:电源(如果最大电流为 15 mA,树莓皮 5 伏引脚可以正常工作)。
  • 接地:接地。
  • 触发:触发输入端子–当HIGH时,传感器发出超声波脉冲。
  • 回波:回波输出端子–该引脚在TRIG被制作HIGH时进入HIGH,然后在检测到超声波脉冲时过渡到LOW

我们将在标题为HC-SR04 测距过程的章节中讨论TRIGECHO终端的使用。

现在,我们了解了超声波距离传感器的基本用途以及 HC-SR04 的基本特性和布局,让我们讨论一下它是如何工作的。

超声波距离传感器的工作原理

让我们看看发射机(TX)和接收机(RX)如何一起工作来测量距离。超声波传感器的基本工作原理如下图所示:

Figure 11.5 – Ultrasonic distance sensor operation

发生的情况如下:

  1. 首先,传感器从发射器(TX)发出超声波脉冲。
  2. 如果传感器前面有物体,则该脉冲从物体反弹并返回传感器,并由接收器(RX)检测。
  3. 通过测量发射脉冲和接收脉冲之间的时间,我们可以计算传感器和物体之间的距离。

通过对传感器工作原理的深入了解,接下来,我们将更深入地讨论如何在估计距离的过程中同时使用 HC-SR04 上的触发和回波终端。

HC-SR04 距离测量过程

在本节中,我们将介绍使用 HC-SR04 测量距离的过程。如果这没有立即意义,不要担心。我在这里提供了细节作为背景材料,因为这是我们的示例程序实现的逻辑过程,以使传感器工作。您还可以在传感器的数据表中找到记录的过程。

我们通过正确使用和监控 TRIG 和 ECHO 引脚,使用 HC-SR04 测量距离。过程如下所示:

  1. 拉动触发销HIGH10 微秒。拉动扳机HIGH也会产生回音针HIGH
  2. 启动计时器。
  3. 等待以下任一情况发生:
    • 回声去LOW
    • 38 毫秒(根据数据表,这是大于 4 米的时间)
  4. 停止计时。

如果 38 毫秒过去了,我们得出结论,传感器前面没有物体(至少在 2 厘米到 4 米的有效范围内)。否则,我们将经过的时间除以 2(因为我们想要的是传感器和对象之间的时间间隔,而不是传感器到对象和传感器之间的时间间隔),然后使用基本物理,使用以下公式计算传感器和对象之间的距离:

在这里,我们有以下几点:

  • d是以米为单位的距离。
  • v是以米/秒为单位的速度,我们使用声速,在 20°C(68°F)时,声速约为 343 米/秒。
  • t是以秒为单位的时间。

The HC-SR04 will only estimate distance. There are several parameters that influence its accuracy. Firstly, as hinted previously, the speed of sound varies in accordance with temperature. Secondly, the sensor has a resolution of ± 0.3 cm. Furthermore, the size of the object being measured, the angle of the object relative to the sensor, and even the material it is made of can all impact the ECHO timing result and thus the calculated distance.

基于对如何使用 HC-SR04 估算距离的基本理解,让我们构建电路,将 HC-SR04 连接到树莓 Pi。

构建 HC-SR04 电路

是时候建造我们的 HC-SR04 电路了。我们的电路示意图如下图所示。该接线适用于 HC-SR04 或 HC-SR04P 模块:

Figure 11.6 – HC-SR04 (5-volt logic ECHO pin) circuit

作为提醒,HC-SR04 模块(或像这样连接到 5 伏电源的 HC-SR04P)是一个 5 伏逻辑模块,因此,您会注意到由两个电阻器创建的电路中的分压器将 5 伏转换为 3.3 伏。如果您需要更新分压器,我们将在第 6 章电子 101 中为软件工程师详细介绍。

让我们在我们的实验板上构建这个电路:

Figure 11.7 – HC-SR04 circuit breadboard layout (part 1 of 2)

以下是创建试验板构建的第一部分所需遵循的步骤。步骤编号与图 11.7中黑色圆圈中的编号匹配:

  1. 将 1kΩ电阻器(R1)放入试验板。
  2. 将一个 2kΩ电阻器(R2)放入试验板。第二个电阻器的支腿与第一个电阻器的支腿共用同一行。在图中,这可以在右侧气缸组的第 21 行中看到。
  3. 将左侧和右侧负极电源轨连接在一起。
  4. 将 Raspberry Pi 上的 GND 引脚连接到左侧电源导轨的负极导轨上。
  5. 将第二支脚 2kΩ电阻器(R2)连接到右侧电源轨的负极导轨上。
  6. 将 HC-SR04 传感器上的接地端子连接到右侧电源导轨的负极导轨上。
  7. 将 HC-SR04 传感器上的 Vcc 端子连接到右侧电源导轨的正极导轨上。

Make sure the R1 and R2 resistors are connected as shown in the preceding figure – that is, R1 (1kΩ) is connected to the ECHO pin on the HC-SR04. The voltage divider created by R1 and R2 shifts an ECHO pin HIGH of 5 volts into ~3.3 volts. If you installed the resistors back to front, the 5 volts get shifted to ~1.67 volts, which is not enough to register a logic HIGH on your Raspberry Pi.

现在,我们已经布置了基本组件并进行了一些初步的接线连接,让我们完成构建:

Figure 11.8 – HC-SR04 circuit breadboard layout (part 2 of 2)

以下是要遵循的步骤。步骤编号与图 11.8中黑色圆圈中的编号匹配:

  1. 将 Raspberry Pi 上的 GPIO 20 连接到 HC-SR04 传感器上的 Trig 端子。

  2. 将 Raspberry Pi 上的 GPIO 21 连接到 1kΩ(R1)和 2kΩ(R2)电阻器的接头上。该连接如图中孔 F21 所示。

  3. 将 HC-SR04 传感器的回波端子连接至 1kΩ电阻器(R1)。该连接如孔 J17 所示。

  4. 将 5 伏电源的正极端子连接到右侧电源导轨的正极导轨上。

  5. 将 5 伏电源的负极端子连接到右侧电源导轨的负极导轨上。

如上所述,我们的电路构建将与 HC-SR04 和 HC-SR04P 模块一起工作。如果您确实有 HC-SR04P 模块,则有一个更简单的接线选项供您选择,您可以自己尝试。由于 HC-SR04P 将在 3.3 伏电压下工作,因此您可以执行以下操作:

  • 将 Vcc 连接到 Raspberry Pi 上的 3.3 伏电源或 3.3 伏引脚。
  • 将回波终端直接连接到 GPIO 21。
  • GND 仍然连接到 GND,TRIG 仍然直接连接到 GPIO 20。

由于此配置的供电电压为 3.3 伏,因此回波端子上的逻辑输出也为 3.3 伏,因此直接连接到 Raspberry Pi GPIO 引脚是安全的。

伟大的现在我们的电路已经完成,接下来我们将运行示例程序,并使用 HC-SR04 测量距离,并了解实现这一点的代码。

运行和探索 HC-SR04 示例代码

HC-SR04 的示例代码可在chapter11/hc-sr04.py文件中找到。请在继续之前查看源代码,以广泛了解此文件包含的内容。

在 HC-SR04 前面放置一个实心物体(约 10 厘米),并在终端中运行代码。当您将物体移动到离传感器更近或更远的位置时,终端上打印的距离将发生变化,如下所示:

(venv) python hc-sr04.py
Press Control + C to Exit
9.6898cm, 3.8149"
9.7755cm, 3.8486"
10.3342cm, 4.0686"
11.5532cm, 4.5485"
12.3422cm, 4.8591"
...

让我们回顾一下代码。

首先,我们定义了第 1 行的TRIG_GPIOECHO_GPIO引脚,以及第 2 行的声速的VELOCITY常数。我们每秒使用 343 米。

Our code is using 343 m/s for the speed of sound, while the datasheet suggests the value 340 m/s. You will also find other HC-SR04 examples and libraries that use slightly different values. These differences are one reason why different code samples and libraries may produce slightly different readings for the same sensor-to-object distance.

在第 3 行,我们定义了TIMEOUT_SECS = 0.10.1的值是一个大于 38 毫秒的数字(来自数据表)。任何大于此值的时间,我们得出结论,HC-SR04 传感器前面没有物体,并返回SENSOR_TIMEOUT值,而不是get_distance_cms()函数中的距离,我们将很快得出:

TRIG_GPIO = 20                                       # (1)
ECHO_GPIO = 21

# Speed of Sound in meters per second
# at 20 degrees C (68 degrees F)
VELOCITY = 343                                       # (2)

# Sensor timeout and return value
TIMEOUT_SECS = 0.1 # based on max distance of 4m     # (3)
SENSOR_TIMEOUT  = -1

接下来,从第 4 行开始,我们找到几个变量,用于帮助测量传感器超声波脉冲的时间,以及如果我们成功读取:

# For timing our ultrasonic pulse
echo_callback = None                             # (4)
tick_start = -1
tick_end = -1
reading_success = False

echo_callback将包含一个 GPIO 回调参考,以供以后清理之用,而tick_starttick_end保留用于计算超声波脉冲回波经过时间的开始和结束计时。术语tick用于与 PiGPIO 定时功能一致,我们将在稍后介绍。reading_successTrue只有在TIMEOUT_SECS过去之前我们有一个距离读数时。

我们使用第 5 行显示的trigger()功能开始我们的距离测量。我们只需采用第 6 行数据表中规定的流程,即我们制作的触发销HIGH为 10μs:

def trigger():                                   # (5)
    global reading_success
    reading_success = False

    # Start ultrasonic pulses
    pi.write(TRIG_GPIO, pigpio.HIGH)             # (6)
    sleep(1 / 1000000) # Pause 10 microseconds
    pi.write(TRIG_GPIO, pigpio.LOW)

第 7 行显示的get_distance_cms()功能是我们的主要功能,它通过调用trigger()启动测距过程,然后从第 8 行开始等待,直到我们成功读取(即reading_success = TrueTIMEOUT_SECS过去,在这种情况下,我们返回SENSOR_TIMEOUT . 当我们等待时,一个名为echo_handler()的回调处理程序正在后台监控ECHO_GPIOpin,以确保读取成功。我们将在本节后面讨论echo_handler()

def get_distance_cms()                           # (7)
    trigger()

    timeout = time() + TIMEOUT_SECS              # (8)
    while not reading_success:
      if time() > timeout:
          return SENSOR_TIMEOUT
      sleep(0.01)

当我们成功阅读时,我们的功能就会继续。在第 9 行,我们获取tick_starttick_end变量(现在将由 echo 回调处理程序设置值)并计算经过的时间。记住,我们在第 9 行将经过的时间除以 2,因为我们想要从传感器到物体的时间,而不是从传感器到物体,再回到传感器的完整超声波脉冲往返:

# ... get_distance_cms() continued

    # Elapsed time in microseconds.
    #Divide by 2 to get time from sensor to object.
    elapsed_microseconds = 
                pigpio.tickDiff(tick_start, tick_end) / 2   # (9)

    # Convert to seconds
    elapsed_seconds = elapsed_microseconds / 1000000

    # Calculate distance in meters (d = v * t)
    distance_in_meters = elapsed_seconds * VELOCITY         # (10)

    distance_in_centimeters = distance_in_meters * 100
    return distance_in_centimeters

在第 10 行,我们应用前面讨论过的公式d=v×t,计算出传感器与物体之间的距离。

接下来,我们在第 11 行遇到echo_handler()功能,该功能监视ECHO_GPIO引脚的状态变化:

def echo_handler(gpio, level, tick):            # (11)
    global tick_start, tick_end, reading_success

    if level == pigpio.HIGH:
        tick_start = tick                       # (12)
    elif level == pigpio.LOW:
        tick_end = tick                         # (13)
        reading_success = True

应用数据表中规定的过程,我们正在捕获ECHO_GPIO转到HIGH时在第 12 行发送脉冲和ECHO_GPIO转到LOW时在第 13 行接收脉冲之间的时间。如果我们在超时之前(回到第 8 行)检测到ECHO_GPIOLOW,我们会设置reading_success = True,以便get_distance_cms()知道我们有一个有效的读数。

最后,我们在第 14 行向 PiGPIO 注册了echo_handler()回调。pigpio.EITHER_EDGE参数表示我们希望在ECHO_GPIO转换为HIGHLOW状态时调用此回调:

echo_callback = 
    pi.callback(ECHO_GPIO, pigpio.EITHER_EDGE, echo_handler) # (14)

做得好!您刚刚连接、测试并学习了如何使用 HC-SR04 传感器和 PiGPIO 来估计距离。您刚刚学习的电路和代码示例可用于测量水箱液位,甚至可用于机器人碰撞检测(HC-SR04 在业余机器人技术中的一个非常常见的应用),或用于您梦想的任何其他项目,其中距离起着重要作用。

接下来,我们将简要介绍霍尔效应传感器,并了解如何使用它们来检测运动和相对距离。

利用霍尔效应传感器检测运动和距离

本章最后一个实际例子将说明霍尔效应传感器的使用。霍尔效应传感器是检测磁场存在(或不存在)的简单部件。与 PIR 或距离传感器不同,您可以使用霍尔效应传感器和磁铁来监测小范围甚至非常快速的运动。例如,您可以将一个小磁铁连接到直流电机的轴上,并使用霍尔效应传感器来确定电机每分钟的转速。

霍尔效应传感器的另一个常见应用是在手机和平板电脑中。一些电话和桌子的盖子和箱子里有一块小磁铁。当您打开或关闭机箱时,您的设备通过霍尔效应传感器检测该磁铁的存在或不存在,并自动为您打开或关闭显示器。

霍尔效应传感器有三种类型,如下所述:

  • 非闭锁开关类型(数字):它们在有磁性的情况下输出数字状态(即,HIGHLOW),在没有磁性的情况下输出相反的数字状态。在有磁性的情况下,信号是HIGH还是LOW都取决于传感器以及它是激活的LOW还是激活的HIGH(软件工程师请参考第 6 章电子 101,如果您需要复习主动LOW和主动HIGH的概念。
  • 闭锁开关类型(数字):当检测到一个磁极(例如,南)时,输出(并闭锁到)LOW(或HIGH),当检测到另一个磁极(例如,北)时,返回到HIGH(或LOW(解锁)。
  • 比率测量型(模拟):根据它们与磁场的距离,输出不同的电压。

Some readers may be familiar with a component called a reed switch, which is a magnetically controlled switch. At a glance, they seem similar in basic principle and operation to a non-latching Hall-effect sensor. Here are the important differences – unlike a classic reed switch, Hall-effect sensors are a solid-state device (no moving parts), they can be switched/triggered very, very rapidly (thousands of times a second), and they require an appropriate circuit to make them work.

我们的示例将使用 A3144(非锁存数字开关)和 AH3503(模拟比率)霍尔效应传感器。选择这些特定部件是因为其可用性和低成本;然而,我们将讨论的一般原则也适用于其他霍尔效应传感器。

A3144 霍尔效应传感器的图片和常用示意图如下图所示:

Figure 11.9 – Hall-effect sensor and symbols

您会注意到,最右边的符号有四个突出的输出,因为某些霍尔效应传感器有四个支脚。您可以期望该符号的输出在适用于其所指传感器的示意图中进行注释。我们将坚持使用三脚式传感器和相应的三个输出符号。

我们的部件支腿如下所示:

  • Vcc:5 伏电源。
  • 接地:接地连接。
  • 输出:5 伏信号输出。请注意,A3144 处于激活状态LOW,这意味着在存在磁场的情况下,Out支腿变为LOW

根据霍尔效应传感器的类型,Out支腿的行为会有所不同:

  • 闭锁和非闭锁切换类型输出支路将输出数字LOW或数字HIGH
  • 比率式:输出为可变电压(即模拟输出*)。*请注意,变化电压的范围将不是 0 到 5 伏之间的整个范围,而更可能是只有几百分之一伏的范围。

现在我们了解了霍尔效应传感器的支腿结构,让我们来构建我们的电路。

霍尔效应传感器电路的研制

我们将在我们的面包板上建造以下电路。与我们的 HC-SR04 示例和图 11.5中的电路类似,我们需要使用分压器,因为我们的霍尔效应传感器输出 5 伏逻辑,我们需要将其转换为 3.3 伏:

Figure 11.10 – Hall-effect sensor circuit

您会注意到,该电路的输出是二元的,取决于您使用的传感器:

  • 对于非闭锁开关闭锁开关型霍尔效应传感器,您将直接将电路连接到 GPIO 21,因为传感器将输出数字HIGH/LOW信号。
  • 对于比率型霍尔效应传感器,您需要通过 ADS1115 模数转换器将传感器连接到 Raspberry Pi,因为传感器输出的模拟电压不同。

I have not included the ADS1115 wiring in Figure 11.9 or in the following stepped breadboard layouts. We have already seen how to connect an analog output to our Raspberry Pi using the ADS1115 in previous chapters – refer to Chapter 5 , Connecting Your Raspberry Pi to the Physical World , and/or Chapter 9 , Measuring Temperature, Humidity, and Light Levels , for example circuits and code using the ADS1115.

让我们在实验板上构建这个电路。此布局适用于开关型霍尔效应传感器:

Figure 11.11 – Hall-effect sensor circuit breadboard layout

以下是完成您的试验板构建所需遵循的步骤。步骤编号与图 11.10中黑色圆圈中的编号匹配:

  1. 将 A3144 霍尔效应传感器放入试验板,仔细注意其腿部方向。如果您需要识别组件支腿的帮助,请参考图 11.8

  2. 将 1kΩ电阻器(R1)放入试验板。

  3. 将一个 2kΩ电阻器(R2)放入试验板。第二个电阻器的支腿与第一个电阻器的支腿共用同一行。在图中,这可以在左侧气缸组的第 17 行中看到。

  4. 将 Raspberry Pi 的一个 5 伏针脚连接到左侧电源轨的正极导轨上。

  5. 将 Raspberry Pi 的 GND 引脚连接到左侧电源导轨的负极导轨。

  6. 将霍尔效应传感器的 Vcc 支腿连接到正极电源导轨上。

  7. 将霍尔效应传感器的接地端连接至负极电源导轨。

  8. 将霍尔效应传感器的输出支路连接到 1kΩ电阻器(R1)。在图中,这显示在孔 E13 处。

  9. 将 1kΩ(R1)和 2kΩ(R2)电阻器的接头连接到 Raspberry Pi 上的 GPIO 21。

  10. 将 2kΩ电阻器(R2)的左侧连接至负极电源轨。

To use the AH3503 r atiometric type Hall-effect sensor at step 1 in this circuit, the wire at step 9 will instead need to be connected to an input port (for example, A0 ) of an ADS1115 module.

现在我们已经构建了霍尔效应传感器电路,准备好磁铁,因为我们已经准备好运行示例代码,看看磁铁如何触发传感器。

运行和探索霍尔效应传感器代码

您可以在开关和闭锁开关型霍尔效应传感器的chapter11/hall_effect_digital.py文件和比率型霍尔效应传感器的chapter11/hall_effect_analog.py文件中找到霍尔效应传感器的代码。

查看这两个文件时,您会发现以下内容:

  • chapter11/hall_effect_digital.py在功能上与我们在本章前面标题为运行和探索 PIR 传感器代码一节中介绍的 PIR 代码示例相同。PIR 和非闭锁/闭锁霍尔效应传感器均为数字开关。唯一的区别是我们的参考霍尔效应传感器是激活的LOW
  • chapter11/hall_effect_analog.py与我们看到的使用 ADS1115 ACD 的其他模拟数字示例类似,包括第 5 章中的电路布线和代码,将树莓 Pi 连接到物理世界。

The varying voltage range outputted by the AH3503 ratiometic Hall-effect sensor and measured by your ADC via the voltage divider is likely to be in the range of a few hundred millivolts.

运行示例代码时,将磁铁移过霍尔效应传感器。磁铁需要靠近传感器的外壳;但是,它不需要实际接触传感器。如何关闭取决于磁铁的强度。

If you cannot get your circuit and code to work, try rotating your magnet to reverse the north/south pole that passes past the sensor. Also note that for a latching type Hall-effect sensor, it is common for one pole of the magnet to latch (trigger) the sensor, while the opposite pole will unlatch (un-trigger) the sensor.

由于代码的相似性,我们在这里不再讨论代码。然而,我想说的是,在这本书的这一点上,你现在有了数字和模拟的基本电路和代码,你可以连接和使用任何简单的模拟或数字元件。正如本章中已经提到的,只需小心为组件供电所需的电压和电流,尤其是输出电压,因为如果超过 3.3 伏,则需要使用分压器或电平移位器。

总结

在本章中,我们使用树莓圆周率研究了检测运动和估计距离的方法。我们学习了如何使用 PIR 传感器来检测广泛的运动,以及如何使用开关型霍尔效应传感器来检测磁场的运动。我们还发现了如何使用超声波测距传感器在更大范围内估计绝对距离,以及如何使用比率型霍尔效应传感器在小范围内测量相对距离。

本章中的所有电路和示例都以输入为重点,告诉我们的 Raspberry Pi 发生了一些事件,例如检测到有人移动或正在测量距离。

您现在可以将本章(以及第 9 章测量温度、湿度和亮度)中所述的输入电路与第 7 章中所述的基于输出的电路和示例相结合,从而打开和关闭第 8 章灯、指示灯和显示信息第 10 章使用伺服、电机和步进电机移动,创建既能控制又能测量环境的端到端项目!

不要忘记我们在第 2 章Python 和 IoT 入门第 3 章、*使用 Flask 与 RESTful API 和 Web 套接字联网、*和第 4 章与 MQTT、Python 和 Mosquito MQTT 代理联网中学到的知识。这三章为您提供了创建 web 界面以及与能够控制和监视环境的外部系统集成的基础。

到目前为止,本书中介绍的许多电子和代码示例都是围绕单个传感器或执行器展开的。在下一章中,我们将探讨几种基于 Python 的设计模式,这些模式在构建更复杂的自动化和物联网项目时非常有用,这些项目涉及需要相互通信的多个传感器和/或执行器。

问题

最后,以下是一系列问题,供您测试您对本章内容的了解。您可以在本书的评估部分找到答案:

  1. PIR 传感器能否检测到物体移动的方向?
  2. 哪些因素会影响超声波距离传感器的测量精度?
  3. 闭锁式或非闭锁式霍尔效应传感器的输出与比率式霍尔效应传感器的输出有何不同?
  4. 关于这个 PiGPIO 函数调用,callback = pi.callback(GPIO, pigpio.EITHER_EDGE, callback_handler)pigpio.EITHER_EDGE参数是什么意思?
  5. 在由 1kΩ和 2kΩ电阻器组成的基于 5 伏至 3.3 伏电阻器的分压器中,为什么在电路中正确连接两个电阻器值很重要?
  6. HC-SR04 超声波距离传感器和 HC-SR501 PIR 传感器均使用连接至各自 Vcc 引脚的 5 伏电压供电。为什么我们在 HC-SR04 上使用分压器将输出电压从 5 伏降至 3.3 伏,而在 HC-SR501 上却没有?