2015年7月21日 星期二

Arduino 測試 : PIR 紅外線移動偵測 (一)

昨晚回到高雄後, 看到帶回去鄉下又原封不動帶回來的電子實驗工具箱, 突然想要彌補一下, 於是找出上回買的 PIR 人體紅外線偵測模組, 睡前來個電子實驗交代一下. 所謂 PIR 原文 Passive InRared Sensor (被動人體紅外線感測器), 稱為被動是因為此種感測器只被動接收紅外線, 以偵測是否有人或動物經過感測區, 本身不會發出紅外線訊號. 而電視的紅外線遙控器或紅外線測距儀會發射紅外線, 那就是主動式的紅外線.

可見光波長介於 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 則留言 :

Unknown 提到...

版大不好意思,我想請教一個問題
我照著你的程式灌到我的arduino
程式有編譯成功,也可以上傳。
但照理說pin2應該是高電位時LED才會亮
但是LED自從程式上傳後,就開始一直閃爍,無法停下。
不管有沒有靠近,就是一直亮著。
請問是怎麼一會事? 是我的板子的問題嗎?還是?

小狐狸事務所 提到...

如果將 PIR 蓋起來還是這樣, 表示 PIR 一直輸出 High. 你可以試著將 delay 時間拉長, LED 應該是閃爍的. 試試看第二篇的程式 :
http://yhhuang1966.blogspot.tw/2016/10/arduino-pir.html
若還是一樣,調整靈敏度旋鈕看看.

Unknown 提到...

回覆Tony Huang :

版大你好,我在這之前有上網蒐集相關資訊。
delay已經自己嘗試改變過數字,將50調整到1000。但目前看出來的成效,僅是將LED閃爍頻率降低到一秒鐘一次。
靈敏度的window也自己轉過了,但情況還是沒改善。Arduino跑完程式後,LED就開始閃爍,無法測驗。
還是說這是一種浮接,可是自己也安過10k電阻嘗試改善狀況,但還是沒有效果。

小狐狸事務所 提到...

恩, 或許 PIR 真的壞了. 寫個最簡單的 LED 測試程式以確定 ARDUINO 與 LED 都是好的, 這樣就能把矛頭指向 PIR , 若是這樣就只好買新的 PIR 了. 我網購零件通常會多買 1,2 個來應付這種狀況, 二來也可攤低運費.

Unknown 提到...

回覆Tony Huang :

版大你好,Arduino我是用uno板,跟led都確定過沒問題。
PIR方面我當初也是購買兩顆,如今兩顆都做不出來。也參考過網上同模組的實作範例,可也是相差不多,所以才真的很疑惑哪方面做錯。

匿名 提到...

我嘗試過了,要把程式中high的地方改成low即可解決

Jerry's Blogger 提到...

Debug 最基本先確認是硬體還是軟體,如果你有三用電表量一下輸出沒感應錢是不是 0 V,感應後是不是3.3 V,就能確定是這個問題還是 Arduino 問題. 如果模組是好的,用 3.3V 接到 Arduino 模擬偵測到看你LED反應.原則上有可能模組掛,Arduino 硬體掛,或是程式問題
同時這個模組沒有機殼,小心身上靜電毀掉這個模組,盡量兩指捏版邊,不要碰觸上面電子零件