焦電型赤外線センサー(EKMC1603111)をESP32とラズパイ+カメラで試してみた | そう備忘録

焦電型赤外線センサー(EKMC1603111)をESP32とラズパイ+カメラで試してみた

焦電型赤外線センサー

パナソニックの焦電型赤外線センサーを ESP-WROOM-32 と ラズパイで試してみた時の備忘録。

ラズパイはカメラを接続して動きがあった時だけ録画するプログラムを作成してみた。

焦電型赤外線とは人体や動物などから発する熱(赤外線)の変化を検知してモーションセンサーとして使用することができる。

今までは上記の HC-SR501 を主に使っていたが、今回は秋月電子通商でパナソニックの EKMC1603111 (リンクはこちら)を購入した。

EKMC1603111

値段はちょっとお高目だが最大12mまで検知できたり誤動作を起こしにくい設計など、高性能なので試してみる事にした。

主な特徴は以下の通り。

  • 基板が表に出ておらずレンズと一体になっている
  • 回路機能が金属パッケージ内に封入されているので電気的輻射ノイズに強く、誤動作を起こしにくい
  • 動作電圧:DC3~6V
  • 消費電流:170 ~ 300μA
  • 電源投入時回路安定時間:30秒
  • 検出距離:最大12m
  • レンズ色は白の他に黒、シルバーホワイトがある

HC-SR501 は感度調整や遅延時間の調整が出来るがこちらの製品はその様な機能は無い。

また検出距離が 12m と他のモーションセンサーと比較してもかなり長距離まで検出できるスペックになっている。

EKMC1603111 コネクタ

また上記の写真の通り、コネクターは細く 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 ラズパイでの配線図

プログラム

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のアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。