可見光波長介於 380nm~780nm 間, 所謂紅外線是指波長在 780nm~100um 間的電磁波, 靠近 780nm 為近紅外線, 幾乎不會輻射熱能, 常用來作為遙控感測或通訊之用 (例如電視遙控器); 而靠近 100um 的是遠紅外線, 會傳遞熱能. 任何物體都有可能發射紅外線, 溫度越高, 發出的紅外線就越多. 人體或動物常溫下釋放的紅外線波長約為 10um (參見 "Arduino 互動設計入門 2" 第 12 章).
PIR 紅外線感測器通電後會先經過一小段時間作校正, 建立四周紅外線能量分布對應表, 並分成兩部分來偵測移動, 當物體停止時, 兩部分能量值平衡相抵銷, 但當人走動造成晶片上熱點移動, 兩邊的能量分布就會失衡而輸出 HIGH. 不過 PIR 只能偵測是否有物體在移動, 無法偵測移動的距離, 方向與位置等資訊.
關於 PIR 模組的深入介紹可參考高手 Proteus 的大作 :
# [PIR] 簡易人體紅外線感應 (PIR) 模組測試電路
我手上這個紅外線模組是今年 3/11 向露天 XLAN 買的, 當時買了 45 元, 現在便宜了, 約 30 元就可買到 :
# [X-LAN] 送光敏電阻 Arduino HC-SR501 人體紅外感應模塊 PIR(附範例) $45
# Arduino人體紅外線感應器 HC-SR501 $31
# 【盼盼36】 HC-SR501 人體紅外線感應器 PIR $32
此 PIR 模組正面有一個 PE (聚乙烯) 做的平凸透鏡外罩, 用來過濾 (波長 8um~14um) 與聚焦紅外線, 增加感測範圍. 紅外線難以穿越玻璃, 因此玻璃窗外的動靜無法偵測. PE 外罩裡面是一顆焦電型 (pyroelectric) 紅外線感測器 D203S, 負責將溫度變化轉成電子訊號. 如果需要以天色陰晴來控制觸發與否, 還可以加一顆光敏電阻, 以便控制在陰暗時才觸發偵測, 預設是沒有光敏電阻的.
模組背面則是 IC 與被動元件, 特別是可以調整觸發模式的跳接帽與可以調整感應距離 (即靈敏度) 與延時時間的可變電阻. 感應距離最遠 7 公尺, 範圍可達 110 度角. 由於紅外線感應晶片是透過兩個小窗口接收紅外線, 偵測左右方向紅外線到達的時間差, 以分辨是否有人移動, 故水平方向的移動較容易被偵測到, 垂直方向的移動則較不容易.
此模組電源輸入 5~26V, 輸出信號 3.3V (偵測到人體紅外線) 與 0V (未偵測到), 所以電平方面不一致, 如果能全部一律在 5V 或 3.3V 工作就很好規劃, 事實上不然, Arduino Nano/Pro Mini 雖可在 5V/3.3V 電源下工作, 但感測器模組就參差不齊了. 像我手上這個型號 HC-SR501 的 PIR 模組就必須在 5V 電源工作, 我試著調到 3.3V 就不會感應了. 看樣子在 Arduino 應用中, 降壓模組是少不了的, 基本供壓 5V 需要降壓模組供電給吃 3.3V 的感測器或模組 (例如 ESP8266 就必須吃 3.3V).
此模組的規格書 (PDF) 如下 :
# HC-SR501 PIR MOTION DETECTOR
從電路圖可知, 此模組由 7133-1 這顆電源管理晶片將電源降壓至 3.3V 後供應給訊號處理晶片 BIS0001, 其 PDF 規格書參考 :
# 30mA Low Power LDO : 7133-1 (耐壓 26V)
# Micro Power PIR Motion Detector IC : BIS0001
此 PIR 模組功耗很低, 小於 50uA, 可用乾電池供電. 只有三支腳, 兩隻是 +VCC (5V~20V) 與 GND, 中間那支是 Output (3.3V/0V). 有些板子上可能還有三支針腳用來設定觸發模式, 預設是跳在連續觸發模式, 即當偵測到人經過時, 它會輸出 High, 然後保持一段時間 (延時時間), 若在這段時間內又有移動, 它就會一直輸出 High, 否則延時時間到了後就回到 Low. 而非重複觸發模式則是, 當移動偵測被觸發輸出 High 後, 在延時時間到期後一定回到 Low, 即使這段期間內持續偵測到移動, 也不會拉長延時計時器.但我手上這塊模組沒有焊這三隻腳, 而是直接在 PCB 上 Layou 成連續觸發模式, 如下圖右下角所示 :
另外每次觸發結束後 (即 High 變 Low), 會有一段閉鎖時間 (2.5 秒), 此期間內即使有觸發也不會被偵測到. 這個閉鎖時間由模組上的固定電阻與電容決定, 除非拔掉重焊否則無法改變.
以下是我從碁峰 "Arduino 最佳入門與應用" (楊明豐) 這本書第 8 章找到的範例, 但我使用 Arduino Pro Mini 來測試, 接線圖如下 :
PIR 偵測器的信號輸出 (中間腳) 接 Pro Mini 的 D2 (設為 Input), 而 LED 串接電阻後一端接地, 一端接 Pro Mini 的 D13 (設為輸出). 然後寫程式如下編譯後上傳 Pro Mini :
const int led=13;
const int PIRout=2;
void setup() { //定義針腳輸出入
pinMode(led,OUTPUT);
pinMode(PIRout,INPUT);
}
void loop() {
int val=digitalRead(PIRout); //讀取 PIR 輸出
if (val==HIGH) { //PIR 有偵測到時 : LED 閃一下
digitalWrite(led,HIGH);
delay(50);
digitalWrite(led,LOW);
delay(50);
}
else { //PIR 沒有偵測到 : LED 暗
digitalWrite(led,LOW);
}
}
測試結果 OK, 我只要一動, LED 就閃不停. 下一步我打算跟 WiFi 結合, 只要偵測到移動就發出訊息到 Twitter 或物聯網伺服器.
另外我在下面這個露天賣的紅外線感應開關模組使用 DIP 開關來設定頗具方便性 :
# 【優酷3C】12VDC感應模組,可調時,可調光,自動感應,紅外線人體感應器,12v 感應器 $280
2016-10-29 補充 :
更新 : Arduino 測試 : PIR 紅外線移動偵測 (二)
7 則留言 :
版大不好意思,我想請教一個問題
我照著你的程式灌到我的arduino
程式有編譯成功,也可以上傳。
但照理說pin2應該是高電位時LED才會亮
但是LED自從程式上傳後,就開始一直閃爍,無法停下。
不管有沒有靠近,就是一直亮著。
請問是怎麼一會事? 是我的板子的問題嗎?還是?
如果將 PIR 蓋起來還是這樣, 表示 PIR 一直輸出 High. 你可以試著將 delay 時間拉長, LED 應該是閃爍的. 試試看第二篇的程式 :
http://yhhuang1966.blogspot.tw/2016/10/arduino-pir.html
若還是一樣,調整靈敏度旋鈕看看.
回覆Tony Huang :
版大你好,我在這之前有上網蒐集相關資訊。
delay已經自己嘗試改變過數字,將50調整到1000。但目前看出來的成效,僅是將LED閃爍頻率降低到一秒鐘一次。
靈敏度的window也自己轉過了,但情況還是沒改善。Arduino跑完程式後,LED就開始閃爍,無法測驗。
還是說這是一種浮接,可是自己也安過10k電阻嘗試改善狀況,但還是沒有效果。
恩, 或許 PIR 真的壞了. 寫個最簡單的 LED 測試程式以確定 ARDUINO 與 LED 都是好的, 這樣就能把矛頭指向 PIR , 若是這樣就只好買新的 PIR 了. 我網購零件通常會多買 1,2 個來應付這種狀況, 二來也可攤低運費.
回覆Tony Huang :
版大你好,Arduino我是用uno板,跟led都確定過沒問題。
PIR方面我當初也是購買兩顆,如今兩顆都做不出來。也參考過網上同模組的實作範例,可也是相差不多,所以才真的很疑惑哪方面做錯。
我嘗試過了,要把程式中high的地方改成low即可解決
Debug 最基本先確認是硬體還是軟體,如果你有三用電表量一下輸出沒感應錢是不是 0 V,感應後是不是3.3 V,就能確定是這個問題還是 Arduino 問題. 如果模組是好的,用 3.3V 接到 Arduino 模擬偵測到看你LED反應.原則上有可能模組掛,Arduino 硬體掛,或是程式問題
同時這個模組沒有機殼,小心身上靜電毀掉這個模組,盡量兩指捏版邊,不要碰觸上面電子零件
張貼留言