記事一覧

Arduinoで焦電型赤外線センサー(その2)

2013.03.30

前回焦電センサと格闘してあえなく敗退したのですが、その後追加の部品を導入して何とかモノになりそうな気配になってきました。
ファイル 40-1.jpg
追加で購入したのは「超高感度焦電センサー用レンズ」といもので、焦電センサにかぶせて感度をアップします。
このレンズが無いとセンサの前数センチくらいで手をかざした時には反応しますが、それ以上離れると反応を捕えられなくなります。
レンズ装着後はこのような簡易な回路でも、2~3メートル離れた所を人が横切ったのも捕えられるようになりました。
ファイル 40-2.png
センサの前で人が動くと電圧が大きく振れているのが分かります。
あと、どこかでセンサ出力端子からGNDに落とす抵抗を大きくすれば出力の振れが大きくなるという情報があったので抵抗値を1Mに変更しました。
ファイル 40-3.png
サンプルのスケッチを公開しますので、ご自由にお使いください。
以下、一部解説します。

void loop()
{
static int save[100];
static int ix = 0;
save[ix] = analogRead(0);
メインのループでは1ミリ秒ごとにアナログ値を読み取り、テーブルにデータを溜めていきます。


// データが100個溜まったら実行
if (ix > 99){
int v1 = 0, v2 = 0;
for (int i = 0; i < 50; i++){
v1 += save[i];
}
for (int i = 50; i < 100; i++){
v2 += save[i];
}
// 前の50個と後ろ50個の合計を比較し、基準値以上でライトをオン
int v3 = abs(v2 - v1);
int flg = v3 > SENSE ? 1: 0;
light(flg);
ix = 0;


}
ix++;
delay(1);
}
データが100個溜まったところで前半50個と後半50個の合計値を比較し、差分が基準値を越えたら反応ありとみなします。

void light(int f){
static unsigned long light_on;
static byte light_stat = 0;
if (f){
if (!light_stat) {
light_on = millis();
}
light_stat = 1;
} else {
// センス0でもON_TIME経過するまでオン状態を維持
if (millis() - light_on > ON_TIME) {
light_stat = 0;
}
}
digitalWrite(13, light_stat);
}
ライトを一定時間点けるルーチンでは、ライトの状態を保持し、オンになった場合はその時間(millis)を保持しておき、オフの指令が来ても一定時間が過ぎるまではオン状態を維持するようにしています。

このような簡単な回路+スケッチですが、セキュリティ用途などシビアな反応が求められるものでなければ(多少の誤作動が許されるなら)、結構使えるのではないかと思います。
今後いろんなセンサと組み合わせたロガーを作ろうと思っていて、LCDディスプレイのオン・オフにこの仕組みを持ち込もうと考えています。

にほんブログ村 その他趣味ブログ 電子工作へ

タグ:Arduino センサー AKE-1