Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@FireFoxCorp

人感センサーPaPIRsをArduinoで使って、人の通過を検知する

More than 3 years have passed since last update.

目的

通路のある一線を人が通ったことを検知して、映像系ソフトにタイミングを送りたい。
設置する予定のポイントが屋外+幅が5mぐらいある通路なので、屋外でも正しく反応するか調べる。

使用したモノ

焦電型赤外線センサー PaPIRs(VZ) 5m EKMC1601111
480円

Arduino UNO
抵抗 10kΩ

焦電型赤外線センサーPaPIRsについて

Panasonicの製品。製品ページいわく

焦電型赤外線センサとは、センサ自身からLEDなどの光を発光するのではなく、周囲と温度差のある人(物)が動く際におこる赤外線の変化量を検出するセンサです。 温度差を検出するため、体温を持つ人体の検出に適します。

とのこと。
パナさんは親切なので、公式にデータシートから使い方から全部ある。
詳しいことは公式を参照。

配線

[回路図]→おいおいFritzingで作成

参考
焦電型赤外線センサ PaPIRs を使う

配線自体は簡単。出力側を抵抗でプルダウンする。

ブレッドボードだと配線しにくい
PaPIRsはデジタル出力なので、D2につないでおく。

コーディング

コード参考
【まるで魔法】手をかざすとぴかぴか光る!焦電センサーでLED3つを光らせてみた!【最終回・焦電センサーの接続】
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (10) 人感センサ1 PaPIRs

とりあえずシリアルで01出力してみる
注意事項としては、PaPIRsの回路が安定して値を出力するまでに電源投入から30秒かかるらしいので、最初に30秒待機する。

PaPIRs_Test001_Serial.ino
#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に対応させてみる。

PaPIRs_Test002_LEDblink.ino
#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
日常からプログラミング、ハード製作まで高頻度でつぶやいています。興味があれば。

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
FireFoxCorp
事務方なのにプログラミングやらされてるアウトドア型引きこもり。GASとKintoneとExcelの間で悶絶している。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?