赤外線センサは「人感センサ」と呼ばれることもあるように、近付く人間を検出する用途で使用されます。
皆さんの中にも、ラズパイ(Raspberry Pi)に赤外線センサを取り付けて、センサライトを作った経験のある方がいるかもしれません。
今回は、赤外線センサの反応に合わせて何かが動くような電子工作ではなく、赤外線センサ自体の仕組みに着目します。
本記事では、赤外線センサは電子工作向けの汎用品を使い、GPIO Zeroで反応を読み取る簡単な電子工作を通して説明を進めます。
目次
- なぜ赤外線センサが人感センサとなるのか?
- 赤外線センサの仕組み
- 赤外線センサを構成するデバイス
- 赤外線センサと誤検出
- ラズパイで赤外線センサを扱う
- 赤外線センサを使用した実験
- 準備
- ラズパイと赤外線センサを接続
- GPIO Zeroで赤外線センサを操作
- 赤外線センサの調整
- まとめ
1. なぜ赤外線センサが人感センサとなるのか?
最初に、以下の図を確認してください。
これは「光のスペクトル」などと呼ばれる、光の波長と実際に目に見える色の対応を表すグラフです。
教科書で見たことがあるかもしれません。
グラフ上のVISという記述は「可視」を意味し、人間の目に見える光の範囲を示しています。概ね400ns(ナノメートル)から700nsの範囲です。数字が小さいほど波長が短く、400nm周辺の光は、人間の目には紫色に見えます。そこから波長が長くなるにつれて、光は青、緑、黄、橙、赤と段階的に変化(グラデーション)します。グラフでは赤色が700nm付近です。
赤外線センサが反応するのは、名前の通り「赤外線」です。
赤外線は、このグラフの「IR」と呼ばれる領域の光に相当します。
「赤外線」と呼ばれる理由は、「可視(VIS)」の範囲の中で下限に位置している赤色の波長を超えているからです。
この領域の光(赤外線)は特別な機器を使用しなければ目に見えません。しかし、この光は熱として感じることができます。
反対に、「熱を感じる」ということは「赤外線を発している」ことを意味します。
絶対零度(マイナス273.15℃)と呼ばれる「温度がない」状態がありますが、この温度より高い環境に存在している物質は、常に赤外線を発していることになります。人や動物も同様です。
赤外線センサはこの現象を利用したデバイスです。
「熱を感じる」ことは「赤外線を発すること」と言われてもピンとこないかもしれませんが、実は皆さんも日常的に体験しています。
例として「火」を想像してください。火は熱と同時に光を発しています。
火が目に見えるのは、光を発するのに十分な熱を持っているからであり、人間が放つ熱は火と比べて温度が低いため、発する光が目に見えない赤外線になると考えられます。
ラズパイでもこの仕組みを利用して、人の動きを知ることができます。
そこで登場するのが、赤外線センサです。
ラズパイなどのマイコンボードに簡単に接続できるように設計された赤外線センサが、手頃な価格で手に入ります。種類も豊富なので、使いやすいものを探してみるのも良いでしょう。
2. 赤外線センサの仕組み
赤外線で人間の動作が検出できる原理が分かったところで、赤外線センサの構造を見てみましょう。
赤外線センサを構成するデバイス
赤外線センサは、正しくは「PIRモーションセンサ」と呼ばれています。
「PIR」は「Pyroelectric Infrared Ray」の頭文字を取ったもので、日本語には「焦電型赤外線センサ」と訳されます。
「受動型赤外線センサ(Passive Infrared Ray)」と呼ぶ場合もありますが、同じものを指しています。
本記事では混乱を防ぐため、単に「赤外線センサ」と呼びます。
赤外線センサは、2組の焦電素子と、それをカバーするレンズで構成されています。
焦電素子が赤外線センサの心臓部です。強誘電体セラミックという素材で作られ、赤外線を受けると電圧を生じるという特徴があります。
注目する点は、焦電素子を2個使用するところで、これは赤外線センサをより使いやすくするための工夫です。
焦電素子は、赤外線を受けると電圧を生じるので、本来であれば1個でも人間を検出することができます。
しかし実際には、日常に存在するどんな物質も微少な赤外線を発しているので、焦電素子からは常に電圧が生じていることになり、何を検出したのか分かりません。
そこで焦電素子を2個用意して反対向きに接続します。「反対向き」がポイントです。
2個の焦電素子は同じ量の赤外線を受けているので、同じ電圧を出力するはずです。素子同士を反対向きに接続すると、片方の素子は極性が反転し、双方の発生する電圧をキャンセルすることができます。仮に双方の素子から5Vの電圧が出力されるような環境では
+5V + (-5V) = 0V
のような関係になります。
これは、焦電素子の前の物体が動かなければ、2個の焦電素子が接続された状態では電圧が発生しないことを意味します。
そこで、もし人間のように大きく、周囲の物質より温度の高い物体が2個並ぶ焦電素子の検出範囲内に入ると、打ち消し合っている素子のバランスが崩れて、「何かが動いた」と電圧が生じます。
赤外線センサと誤検出
赤外線センサが、どのように物質を検出するかイメージがつかめたと思います。
しかしながら、これはあくまでも理想的な状況での動作です。実際の赤外線センサは、さまざまな原因で誤検出をします。ここでは、誤検出の原因と対処方法を考えます。
1つ目は、赤外線センサを電源につないだ直後は、動作が不安定になるという問題です。
焦電素子固有の特性が一因と考えられます。
この問題は、赤外線センサを電源につないだ後、30〜60秒間、安定するまで待つことで回避できます。
赤外線センサを使用した電子機器を設計する際には、この間はタイマーでセンサの反応を無視するなどの工夫をします。
2つ目の問題は動物や虫、風による誤検出です。
通常は、赤外線センサを調整して、感度を落とすことで、人間より小さい動物を検出しないようにします。ただし、虫が赤外線センサの近くを飛んだ場合は避けられません。
この問題は、有効な解決策がありません。実用的なセンサライトを作成する場合は、試行錯誤が必要です。
ラズパイで赤外線センサを扱う
ラズパイで赤外線センサを扱う方法は数多くあります。
C言語でハードウェアを直接制御することや、Scratch(プログラミング言語の一種)を使ってゲーム感覚でプログラミングすることもできます。
お勧めなのはPythonを使った制御です。特にPython用のライブラリの一つであるGPIO Zeroを使うと、プログラムで赤外線センサを簡単に扱えます。
Pythonでプログラムを作成した経験がある方なら、このライブラリは簡単に利用できます。
もし、Pythonのプログラミングが初めてなら、書籍『退屈なことはPythonにやらせよう』がお勧めです。原著(英語)はAutomate the Boring Stuff With Pythonです。WEB版は無料で読むことができます。
本記事では、PythonとGPIO Zeroを使って実験を進めます。簡単なコマンドを使用するので、身構える必要はありません。記事の通りに進めれば問題ないでしょう。
以降はGPIOピンの基本的な知識があることを前提とします。不安な方は過去の記事を参考にしてください。
GPIOピンのピンアサインを以下に示します。本記事のコマンドをアレンジしたい場合は、参考にしてください。
3. 赤外線センサを使用した実験
それでは、ラズパイと赤外線センサを使った実験を始めます。
準備
以下のものを準備してください。
GPIO拡張基板
スイッチサイエンス製(互換可)
GPIO拡張基板はAdafruit製(海外)やスイッチサイエンス製(国内)が手に入りやすそうです。
ほかにも、さまざまな製品が販売されているので、皆さんご自身で使いやすいものを探してみるのも良いでしょう。
入手できなくても問題はありません。ブレッドボード用のジャンパワイヤを使って直接配線することもできます。
電子工作向けの赤外線センサは、VMA314やHC-SR501など、ピン配列に注意すれば、ほとんどの製品が利用可能です。
コマンドの入力にUSBキーボードとマウスを使用します。SSH接続ができる場合は不要です。
ラズパイと赤外線センサを接続
最初に赤外線センサのピン配列を確認します。
お手持ちの赤外線センサを見てください。電子工作向けの赤外線センサには次の3本の端子があるはずです。
- 電源: 5Vに接続します。
- 信号: GPIOピンに接続します。
- グランド: GNDに接続します。
端子の並びは製品によって異なります。配線する際は間違えないように注意が必要です。
赤外線センサのピン配列を確認したら配線します。
ラズパイの5Vピンをブレッドボードの電源ライン(+)に、GNDピンを電源ライン(-)に接続します。
赤外線センサをブレッドボードに配線します。ジャンパーワイヤなどを使って、赤外センサの電源をブレッドボードの電源ライン(+)に、グランドを電源ライン(-)につなぎます。
赤外線センサの信号はGPIOピンの空いているピンに接続します。今回はGPIO13を使用しました。
GPIO Zeroで赤外線センサを操作
Pythonのスクリプトを作成します。スクリプトとは、Pythonのコマンドを一つのファイルにまとめたものです。
最初に、空のテキストファイルを作成します。このファイルの名前は「intruderAlarm.py」です。ターミナル上に次のコマンドを入力してください。
nano intruderAlarm.py
ターミナル上にテキストエディタが起動します。ここにPythonのコマンドを1行ずつ入力していきます。
from time import sleep from gpiozero import MotionSensor
1行目はプログラムの実行を一時的に止めるsleep()関数を使えるように、timeモジュールをインポートしています。
Pythonではライブラリのことをモジュールと呼びます。
2行目は赤外線センサを制御するモジュールのインポートです。
今回はGPIOピンの制御にGPIO Zeroを使用します。赤外線センサを扱うクラスがあらかじめ用意されているので、少ないソースコードで制御ができます。クラスの名前はMotionSensorです。
独自の関数を作ります。この関数は人を検知した時に、端末上にメッセージを表示します。
def detectIntruders(): pir.wait_for_motion() print('Intruder Alert!') sleep(5)
sleep()関数を使って、メッセージを表示した後に5秒間、プログラムを停止します。
プログラムを一時的に停止しないと、人が動いている間、メッセージを表示し続けます。「Intruder Alert!」のメッセージで画面が埋め尽くされてしまうので、sleep()関数で適度に間隔をおき、メッセージの出力を減らします。
作成したdetectIntruders()関数は、赤外線センサの反応と関連付けなければ動作しません。
関連付けるには次のコマンドを使用します。
pir = MotionSensor(13)
この1行で接続した赤外線センサがプログラムで制御できるようになりました。引数の13はGPIO13という意味です。
後は、ループ(繰り返し)文を使用して、人の動きを監視し続けるようにします。
while True: detectIntruders()
スクリプトの作成は、これで終わりです。[Ctrl+O]キーで保存、[Ctrl+X]キーでテキストエディターを終了します。
このスクリプトを起動するには、ターミナル上で次のコマンドを入力します。
python3 intruderAlarm.py
赤外線センサの前を歩くと、ターミナル上にメッセージが表示されるはずです。
上手く動作しない場合は配線を確かめてください。特に赤外線センサの端子は製品によって異なるので、よく確認してください。
このスクリプトを終了するには、[Ctrl+C]キーを押します。
赤外線センサの調整
赤外線センサには、半固定抵抗器で感度を調整できるタイプがあります。
使用した赤外線センサは「検知時間」と「検知距離」が調整できます。テクニックとしては「検知時間」を短めに設定すると、プログラムで制御しやすくなります。
「検知距離」は「感度」とも呼ばれます。半固定抵抗器のツマミを中間ぐらいの位置にしてから始めると、調整しやすいでしょう。
詳細な調整方法は、赤外線センサのマニュアルを参照してください。
4. まとめ
赤外線センサをラズパイで扱うことは、それほど難しくありません。
ところが本格的な電子工作は、電子部品を一つ一つ集めて回路を作成します。そのため、電子部品それぞれの電気的な特性を理解しなければ、設計することはできません。
今回は、赤外線センサの中心となる焦電素子について説明しました。今回のように実験しながら、少しずつ電子部品の特性を学習していきましょう。