夜、庭や玄関に近づく人に反応して光るセンサーライトは、手軽で効果が高い防犯グッズの一つです。
実は、センサーライトもArduinoと赤外線センサを使えば簡単に作れます。
Arduinoの基本的な使い方を覚えたばかりだけど、実用的な電子工作にもチャレンジしてみたい方にちょうど良いテーマです。
本記事では、赤外線センサとLEDを使ったセンサーライトの作り方を解説します。
目次
赤外線センサを動かすための準備
本記事では次のものを使用します。
Arduino Uno
赤外線センサ
Arduino IDE
LED
抵抗
LEDの破損を防ぐために必要です
電子工作向けの赤外線センサは、ピン配列に注意すれば、VMA314やHC-SR501など、ほとんどの製品が利用可能です。
LEDは、Arduinoボードのデジタル入出力ピンに、直接つなぐことはできません。LEDに流れる電流を制限しないと、LEDが破損します。破損を防ぐには、ピンとLEDの間に抵抗を挿入します。
挿入する抵抗の値は、デジタル入出力ピンの電圧・LED固有の順方向電圧降下(VF)・LEDの明るさ(電流)で決定します。
計算方法はLEDの使い方&選び方を参考にしてください。
上記に加えて、USBケーブルを用意してください。赤外線センサを配線する時は、ブレッドボードを使うと便利です。
赤外線センサの仕組み
今回の電子工作では、侵入者の検出に、赤外線センサを使用します。
なぜ、赤外線で人間の動作が判別できるのでしょうか?
その秘密は、物体が発する熱の仕組みに関係しています。
そもそも、人体を検知するのに赤外線センサを使うのも不思議ですね。
実は、人体を含む全ての物質は、温度に依存する電磁波を放出しています。この電磁波は熱輻射・温度放射とも呼ばれ、そのほとんどが赤外線です。温度が高くなるにつれて、分子や原子の運動が大きくなる(温度が高くなる)と赤外線の放射も多くなるので。この赤外線を測定すれば、人や物体の存在を検出できるわけです。
赤外線センサは、常にセンサの周辺、数m〜数十mの範囲にある赤外線の量を監視しています。人間がその範囲内に出入りすると、赤外線の量が変化するので、センサは、信号ピンに電圧を出力(HIGH)します。また、一定時間内に、赤外線の量が変化しない時は、信号ピンがLOWになります。
赤外線センサは、正しくは「PIRモーションセンサ」と呼ばれています。
「PIR」は「Pyroelectric Infrared Ray」もしくは「Passive Infrared Ray」の頭文字を取ったもので、それぞれ日本語で「焦電型赤外線センサ」や「受動型赤外線センサ」と訳されます。どちらも同じものを指すので、本記事では混乱を避けるため「赤外線センサ」と呼びます。
この「赤外線センサ」についてのより詳しい説明が知りたいときは、PIRモーションセンサの仕組み(英語)を参考にしてみてください。
Arduinoなどのマイコンボードに接続できるように設計された赤外線センサは、センサ素子・赤外線を素子に集めるレンズ・アンプ・制御回路が基板上に実装されたモジュールであり、電源ピン・グランドピン・信号ピンの3本のピンを持っています。
また、半固定抵抗器で感度を調整できるタイプもあり、VMA314、HC-SR501のどちらにも調整機能があります。
赤外線センサが物体の動きを検出した時は、信号ピンが「HIGH」レベルに、検出しない時は「LOW」レベルに変化します。
スケッチ(プログラム)全体
Arduino Unoに転送するスケッチは以下の通りです。
int ledPIN = 8; // LED output int motionPin = 2; // PIR sensor pin int motionStatus = 0; // Motion detected status void setup() { pinMode(ledPin, OUTPUT); pinMode(motionPin, INPUT); Serial.begin(9600); } void loop() { motionStatus = digitalRead(motionPin); if (motionStatus == HIGH) { // When motion is detected digitalWrite(ledPIN, HIGH); // turn LED ON Serial.println("Motion detected."); // Print motion detected message } else { digitalWrite(ledPIN, LOW); // Turn LED OFF if no motion is detected Serial.println("All clear."); // Print all clear message } }
上記のソースコードをArduino IDEにコピー&ペーストしてください。
赤外線センサとLEDを動かすスケッチを見てみよう
スケッチの重要な部分を、赤外線センサの動作や、調整のポイントと合わせて解説します。
Arduinoボードに転送する前に全体の動きを解説しましょう。
赤外線センサを使って、LEDを点灯・消灯する方法は、それほど難しくありません。
ただし、スケッチ上のピンの指定と赤外線センサ・LEDの配線などは間違えやすいポイントなので、デジタル入出力ピンの何番に接続するかをしっかりと確認してください。
プログラムの先頭、setup()関数の前に、いくつかの変数を初期化するコードを実装します。
int ledPIN = 8; // LED output int motionPin = 2; // PIR sensor pin int motionStatus = 0; // Motion detected status
最初のledPINには、LEDを接続するデジタル入出力ピンの番号を指定します。ここで指定しているのは「8番」ピンです。
次に設定するのはmotionPinです。これは赤外線センサの「信号」ピンをつなげるデジタル入出力ピンの番号です。「2番」ピンを指定します。
最後のmotionStatusは、赤外線センサの状態を格納する変数です。使用する前に0(LOW)に初期化しておきます。
次にsetup()関数です。
void setup() { pinMode(ledPin, OUTPUT); pinMode(motionPin, INPUT); Serial.begin(9600); }
最初の2行は、デジタル入出力ピンの動作を設定します。
LEDを接続するピンの動作を出力(OUTPUT)に、赤外線センサの状態を受け取るピンを入力(INPUT)に設定します。
続くSerial.で始まる行は、赤外線センサの状態を、シリアルポートを通して送信するための準備です。LEDが点灯しない時に、LEDと赤外線センサの、どちらに問題があるのかを切り分けることができます。
プログラムの中心、loop()関数の中を以下に抜粋します。
motionStatus = digitalRead(motionPin); if (motionStatus == HIGH) { // When motion is detected digitalWrite(ledPIN, HIGH); // turn LED ON Serial.println("Motion detected."); // Print motion detected message } else { digitalWrite(ledPIN, LOW); // Turn LED OFF if no motion is detected Serial.println("All clear."); // Print all clear message }
最初の行は、赤外線センサの反応を、変数motionStatusに格納します。センサの状態「HIGH」か「LOW」のどちらかが入ります。
次は単純なif文です。赤外線センサの反応によって、LEDを点灯・消灯するために使用します。
if文と呼ばれる、ifやelseは、プログラムの基本的な制御構造の一つです。Arduino言語だけでなく、ほとんどのプログラム言語で対応する構文です。
赤外線センサに反応があると、信号ピンの状態が「LOW」から「HIGH」に変化します。
そこで、変数motionStatusに格納されている値をチェックして、「HIGH」の場合は、LEDが接続されているデジタル入出力ピンに「HIGH」を出力し、LEDを点灯させます。
同時にシリアルポートを通して「Motion detected.」とデータを送信します。このデータはArduino IDEのシリアルモニタで確認できます。
反対に、赤外線センサに反応がない時は、格納されている値が「LOW」となるので、elseブロックを実行します。
ここでは、LEDが接続しているデジタル入出力ピンに「LOW」を出力し、LEDを消灯します。また、シリアルポートに「All clear.」を送信します。
赤外線センサとLEDの配線
ソースコードの実装が終わり、スケッチが完成したらArduinoボードに転送しましょう。
その後、一旦、パソコンにつながっているUSBケーブルを取り外して、赤外線センサとLEDを次の手順で配線してください。
回路の組み替えも簡単なので、ブレッドボードの使用をお勧めします。
最初に赤外線センサを接続します。
- 赤外線センサの「グランド」ピンを、Arduinoボードの「GND」ピンに接続します。
- 赤外線センサの「電源」ピンを、Arduinoボードの「5V」ピンに接続します。
- 赤外線センサの「信号」ピンを、デジタル入出力ピンの「2番」に接続します。
次に、LEDを接続します。
- LEDをブレッドボードに挿します。
- LEDの短いリードからArduinoボードの「GND」まで配線します。
- 電線を使い、LEDの長いリードと、抵抗の一端を接続します。
- 抵抗のもう一端から、デジタル入出力ピンの「8番」に配線します。
配線が終わったら、Arduinoボードを再びパソコンに接続します。
いよいよ本番です。
手を赤外線センサのすぐ前にかざしてみましょう。手を振るとLEDが点灯するはずです。
もし点灯しない時は、Arduino IDEのシリアルモニタを起動して、動作を確認してみましょう。
手の動きに合わせて、パソコンの画面に「Motion detected.」や「All clear.」と表示されますか? この場合、赤外線センサは正常に動作しているので、LEDにつながる配線が間違っている可能性があります。
また、赤外線センサに感度調整の機能がある場合は、半固定抵抗器を確認してください。半固定抵抗器のツマミを、中間程度に回してデバッグするのが良いでしょう。
ArduinoボードにはLチカ用のLEDが実装されている
Arduino Unoには、あらかじめ基板上にチップLEDが実装されています。
このLEDは、デジタル入出力ピンに接続されているので、スケッチから、ON/OFFすることができます。Arduino UNOの場合ならは「13番」のピンの「HIGH」「LOW」を切り替えるだけでオレンジ色のLEDのON/OFFを制御できます。
基板上に実装されているLEDの操作は、公式のチュートリアルBlinkスケッチが参考になります。
Blinkスケッチは、Arduinoボード上に実装されているLEDを点滅(「Lチカ」と呼ばれます)させる、小さなスケッチです。
スケッチやArduinoボードに手を加える必要はありません。Arduino IDEから転送するだけでLチカを見ることができます。このスケッチはArduinoボードが正しく動いているかの調査にも使えます。
今回のスケッチでは、赤外線センサ動きをシリアルモニタから確認できるようにしていますが、この方法はデバッグには便利でも、シリアル通信に対応するパソコンなどのデバイスが必要になってしまいます。
赤外線センサの入力に合わせて、基板上に実装されているLEDが点灯・消灯するように改変すると、Arduinoの動きを見るだけでデバッグすることができます。市販されているデバイスは、このようなLEDを持ち、センサの反応をデバイスだけで確認できるものが多くあります。
ただし、このLEDの光は、あまり明るくないので、侵入者を照らし出すような防犯グッズに使う時には外付けの大光量LEDを点灯できるようにしましょう。
まとめ
今回は、Arduinoに赤外線センサとLEDを取り付けて、センサーライトを作成しました。
電子回路やスケッチ自体はシンプルですが、今回扱った、LEDの点灯・消灯は、さまざまな電子工作で必要となる基本的なテクニックです。しっかりとマスターしましょう。