目录

1. PIR传感器简介
1.1 优点和缺点
1.2 您将要学习的内容
2. 将PIR传感器与Raspberry Pi连接
2.1 设置环境
2.2 GPIO引脚编号方案
2.3 示例PIR电路和代码

1. PIR传感器简介
PIR是被动红外的首字母缩写,具有很棒的性能,因为它不发射任何红外光(这意味着低功耗),只用于检测其视场中快速变化的红外光。
传感部分是一个双金属热释电传感器,由对红外光响应方式不同的两种材料组成,其微弱的电输出信号会被低噪JFET放大,以产生可用的电压输出。
由于热释电传感器板是平的,不适合用于诸如110度这样的视场,所以可以添加一个菲涅尔透镜进行聚焦,这与美国宇航局的深空天线非常相似。该圆形塑料部件位于传感器前侧,旨在将红外线反射到构成热释电传感器的两个金属板上,从而读取红外热像的变化。
根据设计,通过放大级,PIR传感器能够触发继电器(例如打开灯光)或向附近的装置发送信号,通知它在特定区域有运动发生。这种功能在我们的现代生活中无处不在,比如您附近每一次低沉的“咔嗒”声和突然的照明,都是通过使用这些先进的传感器实现的。
raspberry-pi-motion-detector.jpg

1.1 优点和缺点
PIR传感器可靠性好、寿命长,最重要的是,可以灵活应用于很多场景,通常具有可调节的红外阈值和开启时间。
然而,PIR传感器也存在局限性。它们容易出现误报(出于一些常见的情况,如气流),而高度准确的运动检测最好使用微波传感器,例如,昂贵的汽车报警器都会使用微波传感器。
PIR在首次通电时还需要长达30-60秒的时间才能稳定下来,并且通常首次通电时会在信号引脚上触发至少一个误报。这是因为它们会响应不断变化的红外热像,而通电构成了变化。这意味着您的设备可能不得不延迟操作,直到PIR稳定下来。具体情况取决于不同的应用场景,这可能会有点麻烦。

1.2 您将会学到的内容
在后文中我们将要使用的基于Raspberry Pi的 HC-SR501带有很多旋钮和控制杆。您可以对所有的功能和交互方式进行调整来为您的应用提供完美的感应输入信息。
您的PIR传感器必需要与其他元件连接,否则不会有任何作用。通过本文,您将学习如何将其与您的Raspberry Pi连接。我们提供了示例代码,在shell脚本中使用了WiringPi的“gpio”库。
您可以根据自己的意愿对其进行修改,这很容易,尤其是参照《高级Bash脚本编程指南》的话,我们接下来就会安装该指南。

2. 将PIR传感器与Raspberry Pi连接
您需要先设置自己的Raspberry Pi,请根据本指南(https://techclass.rohm.com.cn/knowledge/tech-info/raspberry/%E2%80%9Dhttps://www.deviceplus.com/raspberry-pi/diy-tip-how-to-set-up-your-raspberry-pi/%E2%80%9D)快速完成此操作。

2.1 设置环境
完成后,将下面的脚本复制到您的Raspberry Pi,然后运行它:
  1. sudo bash rpi_prepare.s
该命令将用于安装与GPIO硬件接口相关的大多数软件包。“abs-guide”包将用于安装《高级Bash脚本编程指南》,建议所有用户都安装该指南。可以在以下位置找到它:
“/usr/share/doc/abs-guide/html/index.html”。
专业提示:作为用户“pi”,将以下内容粘贴到您的终端中:
  1. cd /usr/share/doc/abs-guide/html && \
  2. python -m SimpleHTTPServer >/dev/null 2>&1 &
  3. cd
并在 http://raspberry.local:8000 查看指南—如果您的工作站和Pi之间的mDNS无法正常运行,请使用:
  1. hostname -I
然后获取IP地址,接下来访问 http://pi-ip:8000 …
— 或者,可以点击此处下载PDF格式文件。 https://techclass.rohm.com.cn/knowledge/tech-info/raspberry/%E2%80%9Dhttps://www.tldp.org/LDP/abs/abs-guide.pdf%E2%80%9D

即使您不打算编写脚本,而只是使用终端,本指南也会非常有用。
[ begin rpi_prepare.sh ]
  1. #! /usr/bin/env bash
  2. set -eu -o pipefail
  3. DEBIAN_FRONTEND="noninteractive"
  4. DEBIAN_PRIORITY="critical"
  5. DEBCONF_NOWARNINGS="yes"
  6. export DEBIAN_FRONTEND DEBIAN_PRIORITY DEBCONF_NOWARNINGS
  7. _pkg_list="vim zip unzip curl wget pigpio wiringpi rsync wiringpi
  8. python-rpi.gpio python3-rpi.gpio rpi.gpio-common git python3-serial
  9. python-serial abs-guide python-gpiozero python-gpiozero-doc
  10. python3-gpiozero"
  11. # Upgrade system and installed packages
  12. sudo apt update || ech o failed to update index list
  13. sudo dpkg --configure -a || ech o failed to fix \
  14. interrupted upgrades
  15. sudo apt --fix-broken --fix-missing install || ech o \
  16. failed to fix conflicts
  17. sudo apt -y --allow-downgrades --fix-broken \
  18. --fix-missing dist-upgrade
  19. # Install $_pkg_list
  20. sudo apt update
  21. sudo apt-get -y install $_pkg_list
[ end rpi_prepare.sh ]
如果您在无头模式下运行Raspberry Pi并希望添加SSH连接,请在 微SD的第一个分区(/boot)上创建一个名为“ssh”的文件,以允许在首次启动时进行SSH访问。如果您使用的是USB-TTL适配器,请发出以下命令以确保串行连接:
  1. sudo ech o 'enable_uart=1' >> /PATH/TO/BOOT/MOUNTPOINT/config.tx
2.2 GPIO引脚编号方案
中级/高级用户可以跳过此部分。刚接触GPIO的人需要了解一下该部分内容。在Raspberry Pi系统上,引脚的编号至少有两种方案:BCM和BOARD。BCM方式晦涩难懂,但是很便携。而BOARD简单易懂,就像“1-2-3”这样,GPIO引脚位于板的右侧,微SD槽在背对您的位置。但请注意,这可能会因具体情况有所变化!
引脚1为3V3,引脚2为5V,以此类推。此编码方案可以让您从顶部开始计数,直到找到所需引脚为止。第三个是WiringPi的编号方案,可以直接使用GPIO编号,我不选择使用这个方法,也不推荐您使用。请使用BCM或BOARD编号,这绝对是正确的选择。
您可以通过以下命令使用“wiringpi”软件中的gpio实用程序来临时查看这些编号方案的编号对应方式。
gpio readall
输出内容如下所示:
gpio_readall.png
显示内容可能会因所使用开发板的不同而不同。请参阅Pinout.xyz网站了解所有Raspberry Pi板的引脚图信息,这可以节省很多时间!

2.3 示例PIR电路和代码
您将需要以下元件来构建
电路:
BOM:
Raspberry Pi 4https://www.amazon.com/Raspberry-Model-2019-Quad-Bluetooth/dp/B07TD42S27/ref=sr_1_3?keywords=raspberry+pi+4&qid=1581051818&sr=8-3
HC-SR501 PIR 传感器https://protosupplies.com/product/hc-sr501-pir-motion-sensing-module/
杜邦电线https://www.amazon.com/Elegoo-EL-CP-004-Multicolored-Breadboard-arduino/dp/B01EV70C78/ref=sr_1_2?keywords=dupont+wire&qid=1581051893&sr=8-2
面包板https://www.amazon.com/Pcs-MCIGICM-Points-Solderless-Breadboard/dp/B07PCJP9DY/ref=sr_1_8?keywords=breadboard&qid=1581051922&sr=8-8
ROHM SLR343BC4TT32 3mm LEDhttps://www.digikey.com/products/en?keywords=ROHM%20SLR343BC4TT32
2x 1kOhm 电阻https://www.amazon.com/Projects-100EP5121K00-Ohm-Resistors-Pack/dp/B0185FIJ9A/ref=sr_1_3?keywords=resistor+1k+ohm&qid=1581052039&sr=8-3
一旦您把元件组装在了一起,完成面包板上的电路连接就很容易了。请按照下图连接,特别注意您要连接的Pi GPIO引脚。
rpi_pir_diagram.png
HC-SR501接受5到12V的输入电压,因此请从5V引脚(既然我们已经熟练掌握引脚编号方案了,可以直接说是BOARD2和BOARD4)拉一根条线到面包板的5V/红色电源轨。
然后将一根条线从GND(BOARD6)拉到黑色轨上。
从那里将5V连接到HC-SR501的引脚3,并将GND连接到引脚1。
在PIR的引脚2和Raspberry Pi的BCM25/BOARD22引脚之间放置一个1kOhm的电阻,以延长Pi引脚的使用寿命,且信号不会受到影响。这就是我们的输入。
rpi_and_pir_active.jpg.jpg
当您希望调整信号引脚3V3上信号的IR灵敏度、触发行为(位置为H和L的3P接头)以及导通时间时,请参阅HC-SR501的指南。技术规格书可点击此处获取。
在下文中您会看到我将跳线设置为“无重复”(L),这意味着只要有运动,它的信号就会保持在3V3—这有点不可靠。电容器看起来也不可靠,但是只要使用一些热胶,它们就永远不会脱离模块。
在第二张图片中,您会看到两个电位器。左侧用于调整灵敏度(CW用于增加,反之用于减少),右侧用于调整导通时间(CW用于增加,反之用于减少)。非常简洁。
pir_back.jpg.jpg
pir_potentiometers.jpg.jpg
我们还想添加一个小LED用于在检测到运动时发出指示。我用的是蓝色 ROHM SLR343BC4TT32 3mm LED。需要将一个限流电阻与Pi的BCM25/BOARD18引脚和LED的阳极(长腿)串联,限流电阻至少为1kOhm。将LED的阴极连接到GND轨,就完成了。
在示例应用程序中,我们将使用WiringPi的“gpio”库从PIR读取3V3/0V到Pi。我倾向于捕捉上升沿并忽略整个信号导通时间,但这需要一个硬件滤波器(2个1kOhm电阻、1个0kOhm电阻和1个100nF电解电容器)来消除抖动。
也许还需要加上一个软件过滤器(检查,等待5毫秒,再次检查)以可靠地进行工作。不需要确定引脚的状态,但是您会发现相比于Arduino,在Raspberry Pi上捕捉瞬间波形需要做更多的工作。
[ begin pir_wiringpi.sh ]
  1. #! /bin/bash
  2. # Detects when BOARD22/BCM25/WiringPi6 goes to 3V3,
  3. # and lights a LED for $_action_time seconds when this
  4. # happens.
  5. # Notes:
  6. # * Depends on 'gpio' utility from the wiringpi package. Install it
  7. #   with 'apt-get -y install wiringpi'.
  8. # * Give PIR sensor 30-60s to adjust to ambient IR, you may
  9. #   want to delay before reading signal from it.
  10. set -eu -o pipefail
  11. PATH=/bin:/usr/bin
  12. _pir_pin=25 # BCM25/BOARD22/WiringPi6
  13. _led_pin=24 # BCM24/BOARD18/WiringPi5
  14. # How long should the action run?
  15. _action_time=5
  16. # Clean up on ^C and TERM, use 'gpio unexportall' to flush everything manually.
  17. trap "gpio unexport $_pir_pin ; gpio unexport $_led_pin" INT TERM
  18. # Explicitly uses BCM_GPIO pin numbering, no '-g' flag needed.
  19. gpio export $_pir_pin in
  20. gpio export $_led_pin out
  21. # Let PIR settle to ambient IR to avoid false positives?
  22. # Uncomment line below.
  23. #sleep 30
  24. while true
  25. do
  26.   _ret=$( gpio -g read $_pir_pin )
  27.   if [ $_ret -eq 1 ]
  28.   then
  29.     ech o "[!] PIR is tripped, LED on ..."
  30.     ech o "( Do real stuff here ... helloworld with a bullhorn *wink* )"
  31.     # ...
  32.     gpio -g write $_led_pin 1
  33.     s leep $_action_time
  34.     elif [ $_ret -eq 0 ]
  35.     then
  36.       gpio -g write $_led_pin 0
  37.     fi
  38.   s leep 0.1
  39. done
[ end pir_wiringpi.sh ]
这段代码大约是使用了相同RPi.GPIO库的Python3脚本长度的一半,但是更清晰。
您可能会对脚本刚开始的“陷阱”感到困惑—它只是一个shell信号处理程序。如果按下CTRL+C退出正在运行的程序,GPIO状态将会被清除。
除此之外,该脚本都用于执行相关程序,检查PIR引脚的读数是0(0V)还是1(3V3)。如果读数为0,则没有任何反应;如果读数为1,则会在5秒内执行一些新的动作。
这个新的动作究竟是什么完全取决于您!
如果您没什么想法,可以考虑一下我去年万圣节想到的反向门铃。用PIR代替按钮,用室外扩音器代替室内门铃(我有一个36W的扩音器,这很棒!)。那么这个装置什么时候可以派上用场呢?

来源:techclass.rohm