Raspberry Pi 4で作る監視カメラ(検出・撮影)

この記事はIPFactory Advent Calender 2020の13日目の記事です。

qiita.com

前日12/12はy0d3n による「WordPressをハックしてみる」でした。

y0d3n.hatenablog.com

はじめに

今回 Advent Calender 書く機会を頂いたので、途中までのまとめとして本記事を書くことにしました。

筆者はこのような記事を書くのは初めてです。 至らない点や誤った記述や表現があればご指摘をお願いします。

初期設定 

初期設定は主に下記の記事を参考にさせていただきました。 利用環境や用途に合わせて設定していただければなと思います。 こちらを参考にした方が早いと思いますので、本記事での説明は割愛させて頂きます。

SSHせずにRaspberry Pi で画面出力する場合もあると思いますので、利用状況問わず最悪Python3系が動けば問題ないと思います。

qiita.com

qiita.com

qiita.com

※ 三つ目の記事は「③SSHのポート番号を22から他番号に変更」までで大丈夫です。

環境 

  • Python Version 3.73
  • Raspbian Version 10.7

  • Raspberry Pi 4 Model B Rev 1.2

  • Raspberry Pi Camera Module(カメラモジュール)
  • Raspberry Pi RIP Motion Sennor(赤外線人感センサー)
  • breadbord jumper cable (female-female) どれも通販などで気軽に購入できると思います。 各メーカーから様々なスペックで販売されているので、自分の用途や予算似合ったものを購入していただければ幸いです。 

構成

f:id:PeD1y:20201213192655p:plain ざっくりとしていますが大体このような構成で考えています。 人感センサーに反応した時だけ撮影を行い、その動画をAWSのS3に送信、受信したのをトリガーとしてLambdaで関数を実行、LINEなどに通知を送るといった感じです。 これ加えてスマホからリアルタイムで撮影場所の様子が見れるようになると尚使い勝手がよくなるのかなと考えいます。 時間がなかったので今回は検出から撮影の部分のみにします。

実装

接続

カメラモジュールと赤外線センサーの接続は下記のサイトを参考にしてください。

chasuke.com

www.pc-koubou.jp

ディレクトリー構成

hoge
  |--camera.py
  |    
  `--/video

コード

import os,json,time,picamera 
import RPi.GPIO as GPIO

SENSOR_PIN,INTERVAL,SAVE_DIR = 18,0.5,"./video/" 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(SENSOR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 

class Camera: 
    
    def __init__(self):
        self.camera = picamera.PiCamera()
        self.camera.annotate_text = "My-Room"
        self.camera.annotate_text_size = 12
        self.camera.rotation = 270
    
    def Strat(self): 
        time_stamp   =  "{0:%Y-%m-%d-%H-%M-%S}".format(dt.datetime.now()) 
        self.save_directory = SAVE_DIR + "video" + time_stamp + ".h264" 
        self.camera.start_recording(self.save_directory) 
        return True 
    
    def Stop(self): 
        self.camera.stop_recording() 
        return False 
    
    def Close(self): 
        self.camera.close()

try:
    if __name__ == "__main__":
        camera = Camera()
        recode = False 
        while True:
            if GPIO.input(SENSOR_PIN) == GPIO.HIGH: 
                if recode == False:  
                    recode = camera.Strat() 
            else: 
                if recode == True: 
                    recode = camera.Stop() 
            time.sleep(INTERVAL)

except KeyboardInterrupt:
    GPIO.cleanup()
    camera.Close()

まとめ

一通りは人感センサーに反応がある間だけ撮影を行うようになるかと思います。 あとは、煮るなり焼きなりしてください。

余談: IPFactoryについて

IPFactoryとは、情報科学専門学校という学校に存在する学内サークルです。 IPFに在籍するメンバーがそれぞれ自身の専門分野についての勉強やアウトプット活動を行っています。 サークル内有志メンバーでCTFを主催したりもしています。 IPFに所属する各メンバーのTwitterやブログ等はこちらのページを参照してください。

ipfactory.github.io

明日14日目はDuGlaserの記事です。お楽しみに