透過Raspberry Pi和Python使用PIR運動感測器

紅外線是一種沒有特殊設備的輔助就無法看到的光線,但是我們可以透過熱量感受到它的存在。這種光線被稱為“紅外線”,是因為它的波長超出了可見光譜中的紅色光線邊界。

這引起了設備製造商的興趣,有一部分原因是人類、動物和物體會一直輻射紅外線。

雖然這聽起來很奇怪,但是其實您應該已經對某些類似的東西很熟悉了:火,溫度非常高,會發出熱量和可見光。

雖然火可以達到足夠高的溫度來發出可見光,但是我們的身體不會,而且我們所輻射的光—紅外線—人眼是無法看到的。

如果Raspberry Pi可以利用紅外線來查看是否有人出現,會不會有人覺得很便利呢?

透過使用非常便宜、可用、耐用、可靠和經濟的元件,我們可以做到這一點!

這種設備叫“被動紅外運動感測器”,通常稱為“被動紅外感測器”或者簡稱“PIR感測器”。

PIR運動感測器是如何工作的

PIR運動感測器由一對熱釋電感測器上的透鏡組成:一種晶體材料,當它接收到紅外光時會產生電壓。

但是任何含有一定熱量的物體都會輻射出一些紅外線。這意味著單個熱釋電感測器會一直產生電壓,即使視野中的所有物體都是完全靜止的。

那麼如何將它變成一個運動感測器呢?這很簡單,但是很有技巧性。將兩個熱釋電感測器進行連接,這種連接使得來自環境紅外線的信號可以相互抵消。

當足夠大且具有一定溫度的物體在鏡頭前移動時,兩個信號將會停止相互抵消,感測器會報告有物體在移動。

PIR運動感測器可能會產生誤報

當您將PIR運動感測器連接到電源時,它需要30秒到60秒才能穩定下來。在還沒有穩定的時候就運行可能會引發誤報,這在某些電路中會很讓人頭疼。在Raspberry Pi專案中,很容易編寫出軟體來讓它在啟動後等待片刻再運行。

更大的問題是由動物、昆蟲甚至陣風所觸發的感測器回應。

您通常可以將元件校準到更低的敏感度,這樣可以阻止您的小貓或者小狗觸發警報。而對於在感測器前飛行的昆蟲來說,這種調整的作用不大。

但是,不要把這些誤報看作是一個破壞者,而是想想如何聰明地處理它們。

在Python中處理PIR運動感測器

從視覺化程式設計工具(如Scratch down)到“close-to-the-metal(能夠以程式設計方式管理作業系統記憶體)”的程式設計語言(例如C),有很多方法可以將PIR運動感測器和Raspberry Pi進行連接。

在這裡,我們將使用Python 和GPIO Zero庫,這些庫已經幫我們整理好了大部分的細節內容。

如果您從來沒有寫過Python代碼,可以嘗試學習來自“Automate the Boring Stuff With Python(用Python將枯燥的工作自動化)”的一些教程。如果您不打算瞭解這些內容,也可以直接使用下面的代碼,如果您能理解下文代碼中的內容,將會學到更多的知識。

本文假設您對GPIO引腳有了基本的瞭解。如果它對您來說是全新的知識,請查看過去的指南。下面的圖表會提醒您有哪些相關基礎知識。

將PIR運動感測器連接到Raspberry Pi

為了開始構建您的Raspberry Pi運動感測器,您將需要:

一個帶電源的Raspberry Pi以及一個安裝了Raspbian的SD卡
一個麵包板
一個GPIO擴展板(可選,但是推薦使用)
一個PIR運動感測器

(我使用的是XC-4444)

您還需要一些可以讓您輸入代碼的設備,例如USB鍵盤或者SSH連接。

將元件連接到麵包板

從背面看這台XC-4444,可以看到引腳在底部,這些引腳為:
• 左邊用於5伏電源
• 中間用於數位輸出
• 右邊用於接地
雖然PIR運動感測器往往大同小異,但是不同型號上的引腳可能順序會有所不同。如果您不確定的話,請查看元件規格。
將Raspberry Pi上的5伏引腳連接到正電源軌,然後將接地引腳連接到負電源軌。
然後,讓鏡頭背對您,將運動感測器的電源引腳連接到正電源軌,將接地引腳連接到負電源軌,並將數位輸出引腳連接到麵包板中間的某處。
最後,將該麵包板行連接到GPIO引腳,我使用的是引腳13。

將其與GPIO Zero接合

現在是時候編寫一個快速腳本了。啟用命令提示符,並透過輸入以下內容打開文字編輯器:
nano intruderAlarm.py

GPIO Zero已經為我們的運動感測器創建了一個類,所以我們直接導入這個類,並導入來自time模組的sleep函數。
from time import sleep
from gpiozero import MotionSensor

現在我們編寫一個函數,功能為當感測器檢測到運動物體時將消息列印到螢幕上。
def detectIntruders():
pir.wait_for_motion()
print(‘Intruder Alert!’)
sleep(5)

sleep指令表示列印完消息後將等待5秒鐘。如果沒有該指令,我們的腳本將在脈衝持續時間內用消息填滿整個螢幕,這樣的話就很難瞭解運行狀況了。
如果我們不對MotionSensor物件進行初始化,那麼detectIntruders()函數將無法工作,所以讓我們將其設置為引腳13:
pir = MotionSensor(13)

您能相信到此我們已經快要完成了嗎?現在我們只需要一個迴圈程式來運行我們的函數就可以完成了。
while True:
detectIntruders()

按下Ctrl+O來保存腳本,然後按下Ctrl+X退出文字編輯器。想要運行程式,請輸入:
python3 intruderAlarm.py

現在起身並走過感測器,您看到列印的資訊了麼?
如果不起作用,請檢查所有引腳是否正確連接。PIR運動感測器的接地和電源引腳很容易混淆。
如果想要停止腳本的運行,請按下Ctrl+C。

校準PIR運動感測器

這款XC-4444有兩個關鍵指標:一個是脈衝長度,標記為Tx,另一個是靈敏度,標記為Sx。
在某些項目中,調整脈衝長度可能會很有用,但是我傾向於保持它的大小,透過編寫代碼來處理Raspberry Pi對信號的回應工作。
調整靈敏度會更有趣。您可以透過調整靈敏度來決定感測器需要檢測出什麼程度的運動才能發出信號。
一些PIR運動傳感器具有更多的控制項。對於一些響應特徵,比如只要檢測到運動,脈衝就一直維持,或者模組是否發處重複的脈衝,這些感測器會有所不同。

PIR運動感測器有多種用途

我們剛剛探討的工作原理不僅僅只適用於警報。
它們還適用於各種家庭中的自動化專案:照明、溫度控制、開門,甚至還可以在您下班回家時為您播放一些專業的摔跤風格的入口音樂。
如果您想要在某人出現的時候獲悉消息,這將會是您的得力助手。