1. PIR感測器簡介
1.1 優點和缺點
1.2 您將要學習的內容
2. 將PIR感測器與Raspberry Pi連接
2.1 設置環境
2.2 GPIO引腳編號方案
2.3 範例PIR電路和代碼
PIR是被動紅外的首字母縮寫,具有很棒的性能,因為它不發射任何紅外光(這意味著低功耗),只用於檢測其視場中快速變化的紅外光。
傳感部分是一個雙金屬熱釋電感測器,由對紅外光回應方式不同的兩種材料組成,其微弱的電輸出信號會被低噪JFET放大,以產生可用的電壓輸出。
由於熱釋電感測器板是平的,不適合用於諸如110度這樣的視場,所以可以添加一個菲涅爾透鏡進行聚焦,這與美國宇航局的深空天線非常相似。該圓形塑膠部件位於感測器前側,旨在將紅外線反射到構成熱釋電感測器的兩個金屬板上,從而讀取紅外熱像的變化。
根據設計,透過放大級,PIR感測器能夠觸發繼電器(例如打開燈光)或向附近的裝置發送信號,通知它在特定區域有運動發生。這種功能在我們的現代生活中無處不在,比如您附近每一次低沉的“哢嗒”聲和突然的照明,都是透過使用這些先進的感測器實現的。
PIR感測器可靠性好、壽命長,最重要的是,可以靈活應用於很多場景,通常具有可調節的紅外閾值和開啟時間。
然而,PIR感測器也存在局限性。它們容易出現誤報(出於一些常見的情況,如氣流),而高度準確的運動檢測最好使用微波感測器,例如,昂貴的汽車報警器都會使用微波感測器。
PIR在首次通電時還需要長達30-60秒的時間才能穩定下來,並且通常首次通電時會在信號引腳上觸發至少一個誤報。這是因為它們會回應不斷變化的紅外熱像,而通電構成了變化。這意味著您的設備可能不得不延遲操作,直到PIR穩定下來。具體情況取決於不同的應用場景,這可能會有點麻煩。
在後文中我們將要使用的基於Raspberry Pi的 HC-SR501帶有很多旋鈕和控制杆。您可以對所有的功能和對話模式進行調整來為您的應用提供完美的感應輸入資訊。
您的PIR感測器必需要與其他元件連接,否則不會有任何作用。透過本文,您將學習如何將其與您的Raspberry Pi連接。我們提供了範例代碼,在shell腳本中使用了WiringPi的“gpio”程式庫。
您可以根據自己的意願對其進行修改,這很容易,尤其是參照《高級Bash腳本程式設計指南》的話,我們接下來就會安裝該指南。
您需要先設置自己的Raspberry Pi,請根據本指南快速完成此操作。
完成後,將下面的腳本複製到您的Raspberry Pi,然後運行它:
1 |
sudo bash rpi_prepare.sh |
該命令將用於安裝與GPIO硬體介面相關的大多數套裝軟體。“abs-guide”包將用於安裝《高級Bash腳本程式設計指南》,建議所有使用者都安裝該指南。可以在以下位置找到它:“/usr/share/doc/abs-guide/html/index.html”。
專業提示:作為使用者“pi”,將以下內容粘貼到您的終端中:
1 2 3 |
cd /usr/share/doc/abs-guide/html && \ python -m SimpleHTTPServer >/dev/null 2>&1 & cd - |
並在 http://raspberry.local:8000 查看指南—如果您的工作站和Pi之間的mDNS無法正常運行,請使用:
1 |
hostname -I |
然後獲取IP位址,接下來訪問 http://pi-ip:8000 …
或者,可以點擊此處下載PDF格式檔。
即使您不打算編寫腳本,而只是使用終端,本指南也會非常有用。
[ begin rpi_prepare.sh ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#! /usr/bin/env bash set -eu -o pipefail DEBIAN_FRONTEND="noninteractive" DEBIAN_PRIORITY="critical" DEBCONF_NOWARNINGS="yes" export DEBIAN_FRONTEND DEBIAN_PRIORITY DEBCONF_NOWARNINGS _pkg_list="vim zip unzip curl wget pigpio wiringpi rsync wiringpi python-rpi.gpio python3-rpi.gpio rpi.gpio-common git python3-serial python-serial abs-guide python-gpiozero python-gpiozero-doc python3-gpiozero" # Upgrade system and installed packages sudo apt update || echo failed to update index list sudo dpkg --configure -a || echo failed to fix \ interrupted upgrades sudo apt --fix-broken --fix-missing install || echo \ failed to fix conflicts sudo apt -y --allow-downgrades --fix-broken \ --fix-missing dist-upgrade # Install $_pkg_list sudo apt update sudo apt-get -y install $_pkg_list |
[ end rpi_prepare.sh ]
如果您在無頭模式下運行Raspberry Pi並希望添加SSH連接,請在 微SD的第一個分區(/boot)上創建一個名為“ssh”的檔,以允許在首次啟動時進行SSH訪問。如果您使用的是USB-TTL適配器,請發出以下命令以確保串列連接:
1 |
sudo echo 'enable_uart=1' >> /PATH/TO/BOOT/MOUNTPOINT/config.txt |
中級/高級使用者可以跳過此部分。剛接觸GPIO的人需要瞭解一下該部分內容。在Raspberry Pi系統上,引腳的編號至少有兩種方案:BCM和BOARD。BCM方式晦澀難懂,但是很便攜。而BOARD簡單易懂,就像“1-2-3”這樣,GPIO引腳位於板的右側,微SD槽在背對您的位置。但請注意,這可能會因具體情況有所變化!
引腳1為3V3,引腳2為5V,以此類推。此編碼方案可以讓您從頂部開始計數,直到找到所需引腳為止。第三個是WiringPi的編號方案,可以直接使用GPIO編號,我不選擇使用這個方法,也不推薦您使用。請使用BCM或BOARD編號,這絕對是正確的選擇。
您可以透過以下命令使用“wiringpi”軟體中的gpio實用程式來臨時查看這些編號方案的編號對應方式。
1 |
gpio readall |
輸出內容如下所示:
顯示內容可能會因所使用開發板的不同而不同。請參閱Pinout.xyz網站瞭解所有Raspberry Pi板的引腳圖資訊,這可以節省很多時間!
您將需要以下元件來構建
電路:
BOM:
Raspberry Pi 4 | https://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 LED | https://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引腳。
HC-SR501接受5到12V的輸入電壓,因此請從5V引腳(既然我們已經熟練掌握引腳編號方案了,可以直接說是BOARD2和BOARD4)拉一根條線到麵包板的5V/紅色電源軌。
然後將一根條線從GND(BOARD6)拉到黑色軌上。
從那裡將5V連接到HC-SR501的引腳3,並將GND連接到引腳1。
在PIR的引腳2和Raspberry Pi的BCM25/BOARD22引腳之間放置一個1kOhm的電阻,以延長Pi引腳的使用壽命,且信號不會受到影響。這就是我們的輸入。
當您希望調整訊號引腳3V3上信號的IR靈敏度、觸發行為(位置為H和L的3P接頭)以及導通時間時,請參閱HC-SR501的指南。技術規格書可點擊此處獲取。
在下文中您會看到我將跳線設置為“無重複”(L),這意味著只要有運動,它的信號就會保持在3V3—這有點不可靠。電容器看起來也不可靠,但是只要使用一些熱膠,它們就永遠不會脫離模組。
在第二張圖片中,您會看到兩個電位器。左側用於調整靈敏度(CW用於增加,反之用於減少),右側用於調整導通時間(CW用於增加,反之用於減少)。非常簡潔。
我們還想添加一個小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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#! /bin/bash # Detects when BOARD22/BCM25/WiringPi6 goes to 3V3, # and lights a LED for $_action_time seconds when this # happens. # Notes: # * Depends on 'gpio' utility from the wiringpi package. Install it # with 'apt-get -y install wiringpi'. # * Give PIR sensor 30-60s to adjust to ambient IR, you may # want to delay before reading signal from it. set -eu -o pipefail PATH=/bin:/usr/bin _pir_pin=25 # BCM25/BOARD22/WiringPi6 _led_pin=24 # BCM24/BOARD18/WiringPi5 # How long should the action run? _action_time=5 # Clean up on ^C and TERM, use 'gpio unexportall' to flush everything manually. trap "gpio unexport $_pir_pin ; gpio unexport $_led_pin" INT TERM # Explicitly uses BCM_GPIO pin numbering, no '-g' flag needed. gpio export $_pir_pin in gpio export $_led_pin out # Let PIR settle to ambient IR to avoid false positives? # Uncomment line below. #sleep 30 while true do _ret=$( gpio -g read $_pir_pin ) if [ $_ret -eq 1 ] then echo "[!] PIR is tripped, LED on ..." echo "( Do real stuff here ... helloworld with a bullhorn *wink* )" # ... gpio -g write $_led_pin 1 sleep $_action_time elif [ $_ret -eq 0 ] then gpio -g write $_led_pin 0 fi sleep 0.1 done |
[ end pir_wiringpi.sh ]
這段代碼大約是使用了相同RPi.GPIO庫的Python3腳本長度的一半,但是更清晰。
您可能會對腳本剛開始的“陷阱”感到困惑—它只是一個shell信號處理常式。如果按下CTRL+C退出正在運行的程式,GPIO狀態將會被清除。
除此之外,該腳本都用於執行相關程式,檢查PIR引腳的讀數是0(0V)還是1(3V3)。如果讀數為0,則沒有任何反應;如果讀數為1,則會在5秒內執行一些新的動作。
這個新的動作究竟是什麼完全取決於您!
如果您沒什麼想法,可以考慮一下我去年萬聖節想到的反向門鈴。用PIR代替按鈕,用室外擴音器代替室內門鈴(我有一個36W的擴音器,這很棒!)。那麼這個裝置什麼時候可以派上用場呢?
只是在萬聖節嗎?可以透過拒絕給別人家的孩子糖果來對抗兒童糖尿病!做一個新穎的慈善家!