焦電型赤外線センサー(EKMC1603111)をESP32とラズパイ+カメラで試してみた
Contents
焦電型赤外線センサー
パナソニックの焦電型赤外線センサーを ESP-WROOM-32 と ラズパイで試してみた時の備忘録。
ラズパイはカメラを接続して動きがあった時だけ録画するプログラムを作成してみた。
焦電型赤外線とは人体や動物などから発する熱(赤外線)の変化を検知してモーションセンサーとして使用することができる。
今までは上記の HC-SR501 を主に使っていたが、今回は秋月電子通商でパナソニックの EKMC1603111 (リンクはこちら)を購入した。
値段はちょっとお高目だが最大12mまで検知できたり誤動作を起こしにくい設計など、高性能なので試してみる事にした。
主な特徴は以下の通り。
- 基板が表に出ておらずレンズと一体になっている
- 回路機能が金属パッケージ内に封入されているので電気的輻射ノイズに強く、誤動作を起こしにくい
- 動作電圧:DC3~6V
- 消費電流:170 ~ 300μA
- 電源投入時回路安定時間:30秒
- 検出距離:最大12m
- レンズ色は白の他に黒、シルバーホワイトがある
HC-SR501 は感度調整や遅延時間の調整が出来るがこちらの製品はその様な機能は無い。
また検出距離が 12m と他のモーションセンサーと比較してもかなり長距離まで検出できるスペックになっている。
また上記の写真の通り、コネクターは細く 2.54mm 間隔では無いので、そのままブレッドボードに指すことは出来ない。
後、電源投入後、約 30秒間はセンサー出力が安定しないので待つ必要がある。
※データシートより
ESP-WROOM-32で試す
まず最初に ESP-WROOM-32 モジュールで試してみた。
使用したモジュールは以下の製品でピン配置はESP32 DEVKIT V1(30ピン)のピン配置となっている。
配線図
ESP-WROOM-32 モジュールとの配線は以下の通り。
電源は3V3、信号は GPIO23 に接続した。
スケッチ
テスト用のスケッチは以下の通り。
0.1 秒間隔で GPIO23 の値を print するだけのスケッチだ。
/*
* 焦電型赤外線センサー PaPIRs(VS)シリーズ
* EKMC1603111 テストスケッチ
*
*/
int SENSOR_PIN=23;
int mode1 = 0;
void setup() {
Serial.begin(115200);
Serial.println("Program Start ");
pinMode(SENSOR_PIN, INPUT);
delay(100);
}
void loop() {
mode1 = digitalRead(SENSOR_PIN); // 入力ピンを読む
Serial.println(mode1);
delay(100);
}
実行結果
机の上にセンサーを固定して、約 30 cm の距離で手をかざして検証をしてみた。
シリアルモニターの出力結果。
手の動きに合わせて1 が出力された。
焦電型は赤外線が入射した際の温度変化を検知する仕組みなので手をずっと動かさずにいると、時々 0 が出力される。
少しでも手を動かすと直ぐにまた 1 が検知されるので使用用途によってはスケッチに工夫が必要になってくる。
例えば、動きがある時だけ録画をする監視カメラを作成する場合、単純に 0 → 1 の時に録画開始、1 → 0 の時に録画終了としてしまうと、一瞬検出された 1 → 0 の際に録画が止まってしまう。
その際は一定時間連続して 0 が検出された時だけ録画を停止する等のスケッチ側での工夫が必要だ。
ラズパイで試す
焦電型赤外線センサーと Raspberry Pi 4B、PiCameca を使って動きがある時だけ録画するプログラムを試してみる。
事前準備
ラズパイ
RaspberryPi 4Bを使用したが、Raspberry Pi 3B+ でも特に問題は無いと思う。
PiCameca
Raspberry Pi 用の PiCameca を用意してラズパイ本体に接続後、ラズパイのメニューの”Raspberry Piの設定” にてカメラを有効化する。
詳細はリンク先の過去記事を参照して欲しい。
配線図
配線図は以下の通り。
尚、ピン番号 1 と 6 は冷却ファンに使用しているので使っていない。
プログラム
EKMC1603111_test.py
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 16 09:52:08 2022
焦電型赤外線センサー(EKMC1603111)テストプログラム
センサーで動きを感知した時だけラズパイカメラで撮影を行う
@author: Souichirou Kukuchi
"""
from picamera import PiCamera
from time import sleep
import RPi.GPIO as GPIO
import datetime as dt
import os
SC_CAMERA_PIN = 4 # ピンの名前を変数として定義
INTERVAL = 0.1 # 監視間隔(秒)
CAMERA_WIDTH = 1280 # 読み込むカメラの解像度(1920x1080、1280x720、640x480)
CAMERA_HEIGHT = 720
GPIO.setmode(GPIO.BCM) # ピンをGPIOの番号で指定
GPIO.setup(SC_CAMERA_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # GPIOセットアップ
class PiCameraClass: # カメラのクラス
def __init__(self):
self.camera = PiCamera(resolution=(CAMERA_WIDTH, CAMERA_HEIGHT), framerate=30) # PiCamear
def start_recordings(self): # 録画開始
__time_stamp_file = "{0:%Y-%m-%d-%H-%M-%S}".format(dt.datetime.now()) # 日付時刻をセット
self.save_file_path = "./video" + __time_stamp_file + ".h264" # ディレクトリ、ファイル名をセット
self.camera.start_recording(self.save_file_path) # 指定pathに録画
print('start recording', __time_stamp_file)
return True
def stop_recordings(self): # 録画終了
self.camera.stop_recording() # 録画終了
print('stop recording')
return False
def close_camera(self): # カメラクローズ
self.camera.close()
#main
try:
if __name__ == "__main__":
os.chdir(os.path.dirname(os.path.abspath(__file__))) # カレントディレクトリをプログラムのあるディレクトリに移動する
sec_camera = PiCameraClass()
rec = False # 録画中フラグ OFF
und_count = 0 # 未検知回数
while True:
rec_time = dt.timedelta(seconds=0)
if GPIO.input(SC_CAMERA_PIN) == GPIO.HIGH: # 検知
if rec == False: # 録画 OFFなら
rec = sec_camera.start_recordings() # 録画開始
und_count = 0 # 未検知回数
else: # 未検知
und_count += 1
if rec == True and und_count >= 30: # 録画 ON で未検知回数が30回(約3秒)以上
rec = sec_camera.stop_recordings() # 録画終了
sleep(INTERVAL)
except KeyboardInterrupt:
pass
GPIO.cleanup()
sec_camera.close_camera()
補足説明
詳細はコメントを参照して欲しい。
約 0.1 秒間隔で GPIO4 をチェックして 0 → 1 の時に録画開始をしている。
注意点は未検知が30回連続して発生した時だけ録画を停止している点だ。
実行結果
ラズパイとカメラを屋外に持ち出して約10m、12m、15m の距離で反応して録画されるかを試してみた。
結論は、
- 10m:問題なく反応して録画した
- 12m:同上
- 15m:反応したり、しなかったり(しない方が多い)
という状態だった。
センサーの角度やその他の条件によっても変わってくるとは思うが、今回検証した限りでは 12m 以内であれば良い反応だった。
以上で今回の記事は終了とする。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント