Raspberry PiとPIRセンサーで監視カメラ

検索すれば本当にたくさん情報を引き出せるけど、とりあえず記録っとく。
やりたいことは以下のとおり。

①10秒毎にカメラで画像保存
②PIRセンサーで動きがあったらメールで通知

本来なら②で撮影も兼ねればいいんだけど、②の動作に不安があったから、結局ずっと画像を保存することにした。②は通知があった時間を知って、①から同じ時間帯の画像を見る・・・的な使い方なのかな。ちょっと馬鹿っぽいけどそうした。
基本的に練習がてら Python でプログラムする。

画像を10秒毎に保存

まずカメラは Raspberry Pi 用のカメラモジュールを利用。
カメラを接続して、以下コマンドで「Enable Camera」を「Enable」に設定。

sudo raspi-config

画像の解像度を 1200px ✕ 900px とすると大体800KBくらいのサイズになりそうだったから、画像サイズは 1200px ✕ 900px 。
1日に必要な容量は以下のような感じで、大体 7.0GB 見ておけば問題ないか。

ファイル名は年月日時分秒として、「data」ディレクトリ内にズラッと保存。
Pythonのソースコードは以下。

import time
import picamera
import datetime

while True:
     d = datetime.datetime.today()
     date = d.strftime("%Y%m%d-%H%M%S")
     with picamera.PiCamera() as camera:
          camera.resolution = (1200,900)
          camera.start_preview()
          time.sleep(10)
          camera.capture('data/' + date + '.jpg')

これを以下のコマンドで実行しておけば、ログアウト後も実行されたまま。

nohup python ./●●●●●.py > result &

メール発信の準備

Raspberry Pi でメールを送信するために、送信メールサーバとmailコマンドを利用。
Postfix と mailutils をインストール。
メールは Gmail から送信させる。

sudo apt-get install postfix mailutils

Postfix の設定。

vi /etc/postfix/main.cf

alias_database = hash:/etc/aliases
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable=yes
smtp_sasl_password_maps=hash:/etc/postfix/isppasswd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter =

上記「smtp_sasl_password_maps」で設定した設定ファイルを作成。
●●●●● = Gmailアカウント
▲▲▲▲▲ = Gmailアカウントのアプリケーション固有のパスワード

vi /etc/postfix/isppasswd

[smtp.gmail.com]:587 ●●●●●@gmail.com:▲▲▲▲▲

そしてハッシュ化

postmap /etc/postfix/isppasswd

このまま Postfix を起動すると IPv6 の警告がでるため、「/etc/postfix/main.cf」の「inet_protocols」を以下のように設定。
inet_protocols = ipv4

Postfixを再起動して、これでいつでもメールを送信可能になった。

PIRで動体検知

購入してあった「Parallax PIRセンサー」を使って、動体検知を行う。
Raspberry Pi と PIRセンサーの配線図は画像のとおり。

メス-メスのジャンパワイヤがなかったから、ブレッドボードを挟んだ形になった。

プログラムとしては、センサーが一度動いたら、5分(300秒)時間が経過してから再度センサーが働く形をとった。
時間を設けないと、人なり動きがあった場合にずっとセンサーが動いていることになって、センサーが働いたらメールを送る仕組みにするので、ずっとメールを送ることになっちゃうからね。

Pythonのソースコードは以下。

import time
import os
import RPi.GPIO as GPIO

INTAVAL = 300
SLEEPTIME = 5
SENSOR_PIN = 21

GPIO.cleanup()

GPIO.setmode(GPIO.BOARD)
GPIO.setup(SENSOR_PIN, GPIO.IN)

st = time.time() - INTAVAL

while True:
     if(GPIO.input(SENSOR_PIN) == GPIO.HIGH) and (st + INTAVAL < time.time()):
          st = time.time()
          os.system('echo NAIYOU!! | mail -s TITLE!! ●●●@gmail.com')
     time.sleep(SLEEPTIME)

これも画像保存ロジックと同様、nohupで実行しておく。

nohup python ./●●●●●.py > result &

重要なことに気がついた

コーヒー焙煎時のチャフと煙の軽減枠 試作2号」を作っている段階で、余ったトタンを利用して作った台に設置して動かせば完了!

・・・もっと早く気がつくべきだった。
それは夜間や暗い場合、画像が保存できないこと(しても真っ暗)になるということ。
PIRセンサーで赤外線キャッチしても、カメラが赤外線非対応だからね。
「照度センサーを買って・・・」と思ったけど、配達されるまで2~3日時間がかかりそうだから、アマゾンで「アイリスオーヤマ 乾電池式LEDセンサーライト 黒 3WAYタイプ」を購入した。
一番安かったし、目的は「動体検知で照らすこと」だったし、プライムだから明日届くし・・・。
本格的にPIRセンサーが意味わからんくなってきたけど、今回はとりあえずここまでにしとこっと。

Exit mobile version