Arduinoで人感センサを使用する

Arduino
人感センサ基板表面

赤外線感応モジュール

PIR(Passive Infra-Red=赤外線感応)モジュールを利用した人感センサを使ってみましょう。

パーツとして入手可能な赤外線人感センサの多くは、このように半透明の多面体のドーム状の部品を備えています。このドームの中に赤外線受光素子が納められています。

動作原理と基本構造

温度が高い物体は、その温度に応じた強さの赤外線を発しています。人間には体温があり、(真夏の屋外などを除けば)周囲よりも温度が高い=強い赤外線を発しているので、一定以上の強度の赤外線を受信することで人間の存在を検知することができます。

ただしこれでは、人間の体温に近い温度の物体が置かれた場所では、常に『人間がいる』と誤認してしまいます。そこでもう一工夫して、『人間の体温程度の温度の物体が、センサの前で動いた(横切った)』ことを検出するようになっています。その原理は以下の通りです。

赤外線受光素子単体の場合

まず、赤外線受光素子が1つだけの場合を考えてみます。この素子は受光した赤外線の強度に応じた電位を出力するものとします。

レンズを用いない場合、人間が発した赤外線は受光素子全面を均等に照らします。赤外線は発生源からの距離が遠くなるほど減衰しますが、人間が受光素子の前を横切っても、人間(赤外線の発生源)と受光素子の距離の変化はそれほど大きくありません。よって、受光素子の出力はゆるやかな変化しかしません。これでは『人間(赤外線の発生源)が動いた』ことを検出することは難しいです。

凸レンズを利用する

次に、受光素子の前に凸レンズを置きます。受光素子と凸レンズの距離を焦点距離とし、人間と凸レンズの距離が焦点距離に較べて充分に遠いとすると、受光素子表面には人間からの赤外線が像を結びます。言い換えると、受光素子全面に均等に赤外線が当たるのではなく、人間の位置に応じて受光素子表面に赤外線が当たる位置が変化します。

複数の受光素子を利用する

ここで、赤外線受光素子を2つに分割します。一方は赤外線を受光すると正の電位を出力し(図の+素子)、もう一方は赤外線を受光すると負の電位を出力する(図の-素子)とします。これらの電位の和を全体の出力とすると、人間の移動によって全体の出力は負から正へ(逆向きに横切れば正から負へ)と大きく変化します。

この電位の変化を捉えることで、『人間がセンサの前を横切った』ことを検出することができるのです。

複数のレンズを利用する

さらに、レンズを角度を変えて複数配置することで、いろいろな方向での移動を検出できるようになります。この複数のレンズを一体化したものが、人感センサの外観上の特徴である多面体のドームです。

さらに改善、欠点

この原理から、人感センサは人間の移動方向を横から観察するような位置(たとえば通路の側面の壁)に設置するのがもっともよく人間を検出できることが判ります。

受光素子を+ー2組、直交するように配置することで2方向の移動を検出できるようにしたものがあります。部屋の天井に設置するセンサならこちらの方がよいでしょう。

ただ、この原理上、受光素子の正面からゆっくり近づく/遠ざかる移動の場合は検出がしにくいという欠点がありますので、センサの設置場所には注意する必要があります。

製作・実験

使用部品

種類数量数量備考
赤外線人感センサHC-SR50111
ジャンパ線(メスーオス)3赤×1本、黒×1本、緑×1本

HC-SR501

今回の実験では、人感センサの定番 HC-SR501 を使用します。この人感センサは、角度120°程度の範囲の人間(熱源の移動)を検出できます。感度(検出可能距離)は3~7mの範囲で調整可能です。

OUTPUT端子が通常はLOW、人間を検出するとHIGHになる、というシンプルなインターフェイスです。

外観
表側
裏側

HC-SR501では、裏側(基板としてはこちらが表面のような気もしますが)には電子部品などが取り付けられているのが見られます。

端子

上の写真では、基板の下部に3つのピン端子があります。写真の左からVCC(電源)、OUTPUT(信号出力)、GND(電源および信号のグラウンド)です。

名称意味
VCC電源供給端子(+)。4.5~20Vを供給する。
OUTPUT人間の動きを検出するとHIGH(3.3V)を出力する。
GND電源および信号のグラウンド(電位基準0V)。
調整ダイアル、設定ジャンパピン

上の写真では基板の上方に2つ、調整ダイアルが並んでいます。ダイアルというよりネジの頭のような形状と大きさで、小型のプラスドライバで回せるようになっています。

写真左側がディレイタイマ調節ダイアル、右側が感度調節ダイアルです。

名称機能
ディレイタイマディレイタイム(熱源を検出した後、出力をHIGHに保つ時間)を調整します。
左に回すと短く、右に回すと長くなります。
調節範囲は3秒~5分です。
感度検出可能な距離を調整します。
左に回すと検出可能な距離が長く、右に回すと短くなります。
調節範囲は3m~7mです。

写真右上方には3本のジャンパピンがあります。これは上2本または下2本のどちらを短絡するかで、トリガモードを設定します。上2本を短絡すると単発トリガモード、下2本を短絡すると反復トリガモードです。

モード意味
単発トリガモード熱源の動きを最初に検知した瞬間からディレイタイムを計測します。
反復トリガモード熱源の動き続けて複数回検知した場合、
最後に検知した瞬間からディレイタイムを計測します。

ディレイタイムが終わった後、3秒間の検出ブロック期間があることに注意して下さい。

ジャンパ線(メス-オス)

HC-SR501のピンは、間隔はICピッチ(2.54mm)なのですが、他の部品が邪魔でブレッドボードに直接挿すことができません。よって、今回はメス-オスのジャンパ線を用いてセンサとArduinoを接続します。

回路

HC-SR501の電源は4.5~20V可、電流も最大65mA程度ということなので、Arduinoの5V端子からHC-SR501のVCC端子に直結しています。

HC-SR501の出力信号レベルは3.3Vなので、本当はArduinoとの間にレベル変換コンバータを挟んだ方がいいのですが、今回は手抜きをしてArduinoのデジタル入力端子D3とHC-SR501のOUTPUT端子を直結しました。Arduino側のLOW→HIGHのスレッショルドが3.3Vより低いのでこれでも動作します(マージンが少ないのでノイズには弱くなるでしょうが)。

もちろんArduinoとHC-SR501のGND端子同士も接続しています。

配線

今回はセンサモジュールとArduinoをジャンパ線で直結しました。ブレッドボードすら使っていません。メス-オスのジャンパ線があればそれを使用するのがいいでしょう。写真はメス-メスとオス-オスを組み合わせてメス-オスにしています。

プログラム

C++
#define SENSOR_PIN 3

void setup() {
  Serial.begin(9600);
  pinMode(SENSOR_PIN, INPUT);
}

void loop() {
  Serial.println(digitalRead(SENSOR_PIN));
  delay(200);
}

HC-SR501の出力が『検出するとHIGH』という非常にシンプルなものなので、プログラムもスイッチ入力の検出と同じく非常にシンプルなものです。digitalRead()で入力端子のレベルを取得してSerial.println()でPCに送信するだけです。

実行

HC-SR501は、単発トリガモード、ディレイは最短(3秒)に設定してあります。

最初は出力が0(LOW)
手をかざすと1(HIGH)
1(HIGH)になってから約3秒間は1(HIGH)を維持
0(LOW)になってから約3秒間は検出ブロック期間なので手をかざしても反応なし
検出ブロック期間が終了してから手をかざすと出力が1(HIGH)に

ということが判ると思います。

まとめ

  • 赤外線人感センサは、人間(熱源)が発する赤外線を受光する
  • 多くの人感センサは、『動き』を検知する(ずっと静止している熱源には反応しない)

コメント

タイトルとURLをコピーしました