人が侵入したらアクションを起こす その1 ポーリングを試す
人を感知するのが焦電型赤外線センサを使います。焦電型赤外線センサは駆動回路が必要ですが、モジュールになった製品があります。パナソニックのPaPIRsは、検知距離が約5mで、入手したEKMC1601111は垂直方向が82°、水平方向が94°の範囲を検出します。同シリーズには広範囲タイプもあります。
端子は、電源と出力の3本です。電源は3~6Vです。
焦電型赤外線センサは人より小型の動物を検知することがあるようです。最大の問題点は、人が動かないと検知できないことです。
●出力はディジタル
人を検知したら、出力がHighになります。電源電圧に5Vを使うと出力もHigh=5Vで、取り出せる電流は約100uAです。Arduinoのディジタル端子に直接つないで検知できます。ピン配置などはこちらの記事を参照ください。
●いつHighになるかを知る方法は二つ
仮に、ディジタル・ポート2番にセンサ出力をつなぎます。人がいつ来るかわからないので、ずっと2番を監視しないといけません。ずっと監視していたら、ほかに何もできないです。この方法をポーリングといいます。ほかに何もしないというのは、マイコンにとってはぜいたくな動作です。人が検知できたら、LEDを光らすとか、ブザーを鳴らす、もしくはドアを開閉するというように、人が現れないとほかにすることがないのなら問題ないです。
もう一つの方法が割り込みです。マイコンにカメラがつながっているとすると、画像処理にマイコンの能力は100%使われていると思われます。しかし、人を検知したことを知りたい、というときに、割り込みを使います。これは、マイコンの2ピンの電圧が変化したとたん、マイコンは今のプログラムを中断し、割り込み処理にジャンプします。
このために、二つのことを用意します。
- 割り込みがかかったら動作するスケッチ。できるだけ短く
- 割り込みを許可する
割り込みはマイコンが勝手に処理をします。マイコンによって物理的割り込みに使えるピンは限定されます。
●ポーリングを試す
リアルタイムOSやLinuxなどの汎用のOSが動いているマイコンでは、ポーリングしていてもマイコンは別の仕事もできます。Arduinoは作ったプログラムが動くだけで、ほかに何も起こりません。したがって、ポーリングしていると、マイコンは100%そのためだけに動いています(一部タイマなどは除く)。
ExamplesからBasics-DigitalReadSerialを開きます。接続は下記のとおりです。
コメントを取り去ったスケッチです。
int pushButton = 2;
void setup() {
Serial.begin(9600);
pinMode(pushButton, INPUT);
}
void loop() {
int buttonState = digitalRead(pushButton);
Serial.println(buttonState);
delay(1);
}
Monitorを開きます。人が動くと'1'です。じっとしているとほとんど'0'になります。
●改良版スケッチ
一度センサの出力がHighになったら、100ms待って確認してやっぱりHighだったら人を感知したとしてLEDを点灯させます。
int pushButton = 2;
void setup() {
Serial.begin(9600);
pinMode(pushButton, INPUT);
pinMode(13, OUTPUT);
}
void loop() {
if (1==digitalRead(pushButton)) {
delay(100);
if (1==digitalRead(pushButton)) {
digitalWrite(13, HIGH);
delay(100);
}
}
Serial.print(digitalRead(pushButton));
digitalWrite(13, LOW);
delay(100);
}
ポーリングをしていると、ずっとループが回っていることになり、通常のプログラムでは、ほかの仕事ができなくなります。Arduinoではloop()自体が繰り返す関数になっているので、ほかにやりたいことがあれば、途中に処理を挿入すれば、多くの場合、うまくスケッチを動かせます。
(※1)プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。エディタに持っていくと、スペースやリターン・コードなどが化けていることがあるので、一度消して、Arduino IDEのテキスト・エディタで修正してください。