PIR(人感センサー)の使い方
焦電センサを使用したPIRンサーモジュールの基本的な使い方を紹介します。
PIRとはPassive Infrared Rayの略でして焦電型赤外線センサーを利用し人体から発生する赤外線の変化を検知し人・動物などを検知するいわゆる人感センサーとして応用されています。
使い方は至って簡単でモジュール内部で赤外線センサー駆動、赤外線の変化検知などをしてくれるのでArduinoとの接続は特に難しくなく新しいライブラリーを追加することもなく使えます。
目 次
PIRセンサー
外観
注)本記事の画像はすべてクリックすることで別ウィンドで拡大画像を表示します。
主な仕様
・型名:HC-SR501
・電源電圧:5V~20V
・待機時消費電流:65μA以下
・保持時間:約8秒~15分以上、半固定抵抗[Tx]で調整
・最大検知距離:7m(気温等に依存)、半固定抵抗[Sx]で調整
・検知角度:120度
・検知出力電圧:3V(検知時)、0V(非検知時)
(制御ICと基板の出力端子間に1.5kΩの抵抗が直列挿入)
・次の検出までの待機時間:約2秒
・動作モード:リピートモード(検知後、保持時間内に動体を検知すると再延長されます)
・焦電センサ制御IC:BISS0001
・基板サイズ:32x24mm
・ネジ穴:2mm、28mm間隔
・レンズ:直径23mmドーム型
レンズ&焦電センサー
ドーム型のレンズは基板に対してねじ止め等はされておらず手で引っ張れば容易に外れます。そしてこのレンズを外すと内部には焦電型赤外線センサーが搭載されているのが判ります。
焦電型赤外線センサーについてはここに詳細情報が載ってます。
(注.リンク先のメーカー素子が本モジュールに搭載されているものと同一かどうかは不明ですので参考情報になります。)
接続端子&調整用ボリュームなど
下図に接続端子、調整用ボリューム、モード選択端子の位置と説明を記載したものを示します。(画像クリックで拡大)
<接続方法>
ピンヘッダーの各端子の、VCCピンを+5V、GNDピンをグランドに接続、あとは検知出力ピンをArduinoのデジタルピンに接続するだけです。
プログラム完成後は各ボリュームにて感度・延長時間を調整。
<感度調整VR>
赤外線検知感度を調整する、人体等の検知距離を調整することになる。
<延長時間調整VR>
最初に検知してから、検知出力を保持する時間を(8秒~15分以上)に整調整できる。検知後に対象物が圏外に出てもこの時間内は検知状態が保持される。
<モード選択ジャンパー>
ショートプラグ(黄色)の挿入位置をH側、L側に変えることとでモード選択が可能。
- 再検知有り(H):検知後に延長時間内に再検知すると検知状態が延長される。すなわち、検知エリア内に対象物がある間は検知出力が継続されることになる。(Hレベルを持続)
- 再検知無し(L):検知後に再検知しても保持時間の延長はしない、すなわち検知エリア内に対象物がある間でも検知出力は保持時間経過後に一度切れる。(一度Lレベルになる)
ArduinoNanoとの接続
PIRセンサーの検知状態を目視できるようLEDも接続してあります。
デジタルピン接続:
・PIRセンサOUT ⇒ D2ピン
・LED ⇒ D11ピン
(他のデジタルピンでもOKです)
当然ですがLEDは検知状態を自動で点灯できるわけでもないのでプログラムで制御することになります。
(画像クリックで拡大します。↑↓)
プログラム
例によってArduinoIDEにてプログラミングします。
PIRセンサ出力(D2ピン)がHIGH(+3V)になったらLEDを点灯させるようにしてありとても簡単なものです。
PIR制御のためのライブラリーも不要ですので#include文も不要。
PIRセンサーオン ⇒ LEDをオン
スケッチファイル:「PIR_LED_OnOff」
PIR_LED_OnOff
#define LED_OUT 11 #define PIR_IN 2 void setup() { pinMode(LED_OUT, OUTPUT); pinMode(PIR_IN, INPUT_PULLUP); } void loop() { if (digitalRead(PIR_IN) == HIGH) { digitalWrite(LED_OUT, HIGH); } else { digitalWrite(LED_OUT, LOW); } }
PIRセンサーオン ⇒ LED点滅速度を速くする
今度は、検出オンとオフでLEDの点滅速度を遅いから速いに変えてみます。
ブレッドボード回路の変更なしで、プログラムだけをちょっと変えるだけです。
スケッチファイル:「PIR_LED_blinkSpeed」
PIR_LED_blinkSpeed
#define LED_OUT 11 #define PIR_IN 2 void setup() { pinMode(LED_OUT, OUTPUT); pinMode(PIR_IN,INPUT); } void loop() { digitalWrite(LED_OUT, HIGH); if (digitalRead(PIR_IN) == HIGH) { delay(100); } else { delay(1000); } digitalWrite(LED_OUT, LOW); if (digitalRead(PIR_IN) == HIGH) { delay(100); } else { delay(1000); } }
拝見させて 頂きました、
この プログラムで カウンター(人数)が表示するには
大変でしょうか?
PIRセンサーそのものの感度が鈍いので人数カンターには無理だと思います。数センチまで近づいても検出しないこともあるし、数十センチで検出することもあるしという状態で、更に検出後に離れても非検出までに数秒のディレイがあるという状況です。数メータの範囲内に長時間スパンで発熱体検出をするような大雑把な検出用途に向くと思います。ご質問はプログラムということですが、センサー自身がこのような状態なのでプログラムでの対応もできないと思います。他のセンサー(カメラ、レーダー等)を考えた方が良い気がします。(管理人)