##目的
通路のある一線を人が通ったことを検知して、映像系ソフトにタイミングを送りたい。
設置する予定のポイントが屋外+幅が5mぐらいある通路なので、屋外でも正しく反応するか調べる。
##使用したモノ
焦電型赤外線センサー PaPIRs(VZ) 5m EKMC1601111
480円
Arduino UNO
抵抗 10kΩ
##焦電型赤外線センサーPaPIRsについて
Panasonicの製品。製品ページいわく
焦電型赤外線センサとは、センサ自身からLEDなどの光を発光するのではなく、周囲と温度差のある人(物)が動く際におこる赤外線の変化量を検出するセンサです。 温度差を検出するため、体温を持つ人体の検出に適します。
とのこと。
パナさんは親切なので、公式にデータシートから使い方から全部ある。
詳しいことは公式を参照。
##配線
[回路図]→おいおいFritzingで作成
配線自体は簡単。出力側を抵抗でプルダウンする。
ブレッドボードだと配線しにくい
PaPIRsはデジタル出力なので、D2につないでおく。
##コーディング
コード参考
【まるで魔法】手をかざすとぴかぴか光る!焦電センサーでLED3つを光らせてみた!【最終回・焦電センサーの接続】
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (10) 人感センサ1 PaPIRs
とりあえずシリアルで01出力してみる
注意事項としては、PaPIRsの回路が安定して値を出力するまでに電源投入から30秒かかるらしいので、最初に30秒待機する。
#define PPR 2
int bState = 0;
void setup() {
pinMode(PPR, INPUT);
Serial.begin(9600);
delay(30000);//wait for 30s until the sensor voltage becomes stable
}
void loop() {
int State = digitalRead(PPR);
if(bState != State){
bState = State;
Serial.println("");
}
if(State == HIGH){
Serial.print(State);
}else{
Serial.print(State);
}
delay(100);
}
出力結果
000000000000000000000000
11111
0
1111111111111111
0
111111111111
000
11111111
0
11111111111111111111
0
1
00
11
0
11111
0
1111111111
0000000000000000000000
ちょっと待ってから、手をゆっくり翳してみた。
単純に各瞬間の値を読んで出してるだけなので、途中で値が振れている。
あとシリアルで01出すだけだと見にくいので、LEDに対応させてみる。
#define PPR 2
#define LED 4
float State = 0;
void setup() {
pinMode(PPR, INPUT);
delay(30000);//wait for 30s until the sensor voltage becomes stable
}
void loop() {
int readState = 0;
for(int i = 0; i < 10; i++){
readState += digitalRead(PPR);
}
State = State * 0.8 + (readState/10)*0.2;
if(State >= 0.5){
digitalWrite(LED, HIGH);
}else{
digitalWrite(LED, LOW);
}
delay(100);
}
(動画)→後で撮影
ローパスフィルタっぽい実装で値の振れをどうにか出来るかと思ったが、いまいち解決していない。
コレに関してはforループの回数を増やすとか平均化するとかで解決できそう(参考:Arduinoで可変抵抗器のゆらぎを軽減する)だが、今回は別ソフト(vvvv)にそのまま送ってそっちで処理するようにする。
それはまた別で書こう。
##まとめ/次
PaPIRsはめっちゃ簡単に人(熱源)の動きを検知できる。
次回はPaPIRs自体の性能の検証と、vvvvに渡したあとの数値処理をやる。
本人Twitter:紙魚@火狐商會(@____Bel)さん | Twitter
日常からプログラミング、ハード製作まで高頻度でつぶやいています。興味があれば。