IoT何をいまさら(78) PIRセンサでPiCameraのシャッタを押す

Joseph Halfmoon

一時は失敗ビルドで上書きしてしまったので使えずにいたラズパイ1(model B+)のpython3が復活したトホホの件書きました。そこでもともと目論んでいた「PIRセンサをトリガにして写真をとってサーバーのラズパイ3 model B+のHDDに送る」件を実施したいと思います。まあPythonさえ復活してくれれば赤子の手を捻るようなもんだ(何と不穏なたとえ)?

使用するPIRセンサ(焦電センサ)はNiCERA(日本セラミック株式会社)製の

PSUP7C-02-NCL-16-1

という長い型番のセンサです。ニッセラ様の仕様書でのお名前は「焦電型赤外線ユニット」です。仕様書から検知性能についての1文を引用させていただくと、

背景から温度差ΔT=+4(+1/-0)℃の人体(大きさ150cmx30cm程度)、もしくはそれに相当する熱源が、7.項に記す検知エリア内を1.0m/sの速度で左右に横ぎった場合

検知することができるセンサであります。真夏の暑い日やら、ゆっくり動くやら、センサの苦手が分かります。大分前になるのですが、以下の投稿で既に動作を確認しております。

IoT何をいまさら(36) PIRセンサからメッセージ

上記で作成した配線治具あり、今回はそれを流用しているので楽です。Raspberry Piの40pin拡張コネクタとの接続は以下の回路図のようです。なお、LEDは動作確認用に「ちょっと」使用した後は制御ソフトでは使っていないです。タクトスイッチが押されるか、PIRセンサが前述の規定の物体を検出してLOWを出力すると一発写真を撮る、という感じです。

PIR_CAM_SCH現物は以下のようです。左上の白い小さな長方形の物体が乗っているボードが焦電センサPSUP7Cです。左下の小さい緑のボードに黒い物体が乗っているボードがラズパイ用のカメラモジュールです。フレキのケーブルでRaspberry Pi model B+ に接続しています。この幅(端子配列)がPi ZEROとは異なるため、ZEROにとりつけられなかったわけです。ラズパイ本体は透明プラスチックのケースに入っていますが、拡張端子のピンにあたり難いので、昨日つくった3段ソケットタワーで信号を取り出しています。中央やや左は以前PIRセンサ接続の回で作った治具にタクトスイッチとLEDなど追加したもの。ほぼ上の回路図の実体。
Pi1_PIR_CAMERA_DUT2使用したPythonのコードは末尾に全文掲げましたがごくごく短いものです。カメラとのインタフェースに

picameraモジュール

を使用させていただいています。picameraモジュールのドキュメンテーションはこちらから辿れます。結構機能の大きなモジュールでかつカメラを取り扱うために出来ることも複雑です。このモジュールの使い方を勉強するだけでもかなりな時間かかりそうです。またカメラのハードウエアについても説明があるので、カメラ素人の私としてはその辺から勉強すべきかなと痛感しています(が、まだちゃんと読んでません。)ま、「とりあえず」写真を撮るだけなら末尾のコードのように非常に簡単です。なおpreview画面は直接ビデオ画面にオーバレイするようなので、VNCでデスクトップを見ているとVNCのクライアント側には表示されないようです。

Raspberry Piの拡張端子との接続には

RPi.GPIOモジュール

を利用させていただいています。ドキュメンテーションはこちらから辿れます。こちらはまだまだ開発中らしく機能追加を予定しているようです。引用すると

 watch this space!

らしいです。機能追加が期待されます。なお文書の冒頭に凄く大事な事が書いてあります。その部分も引用させていただきます。

Note that this module is unsuitable for real-time or timing critical applications.

理由としては2つ挙げてあります。

  • Pythonのギャベージコレクションの動作は予測できない
  • マルチタスクだが実時間性に乏しいLinuxの上で動作している

真っ当な理由であります。組み込みやられている方には御馴染みな理由であります。「それでも許せるような」アプリならOKっと。なお、”predictability” が必要ならば 「Arduino買えよ」と書かれており、あまつさえ Arduino.ccへのurlリンクまで貼り付けてあります。

どちらのモジュールもPython(とPIP)が復活してくれないと使えなかったもの。それを利用させていただいている今回のプログラムそのものはごく簡単なのでこれ以上の説明はいりますまい。写真自体は /mnt以下の固定名のファイルに出力しています。このパスはNFSでマウントしている Raspberry Pi 3 model B+のHDD上のディレクトリを指しているので、撮られた写真はサーバー上に置かれることになります。ま、その先の処理はまた今度だけれども。

実際に、PIRセンサを「シャッター」にして撮った写真の例を冒頭のアイキャッチ画像に掲げました。ピンボケ気味ですが、謎の生物(UMA?当然ヤラセですが)のシッポらしきものが見えまずでしょうか?

IoT何をいまさら(77) M5Stack, M5ez GUIからNode-REDへMQTT へ戻る

IoT何をいまさら(79) Python、threadingとasyncioなLチカ へ進む

import picamera
import RPi.GPIO as GPIO
import time

shutterPin = 23
pirPin = 24
GPIO.setmode(GPIO.BCM)
GPIO.setup(shutterPin, GPIO.IN)
GPIO.setup(pirPin, GPIO.IN)

picam = picamera.PiCamera()

picam.rotation = 180
time.sleep(3)
takeApicture = False
while not takeApicture:
    if GPIO.input(shutterPin) == 0:
        takeApicture = True
    elif GPIO.input(pirPin) == 0:
        takeApicture = True
    else:
        time.sleep(0.1)
picam.capture('/mnt/pi3/pi1/pirTest.jpg')