raspberry Pi 入門③(防犯カメラ作成-2)
前回に引き続き、防犯カメラの作成をやっていきます。
raspberry Pi 入門③(防犯カメラ作成) - yamadaTarouの日記
前回やっていなかった人感センサーについて記載します。
【部品】
ラズベリーパイ用のカメラモジュール
ジャンプワイヤー(メス-メス)×3本
センサーとラズパイは以下の写真のように接続します。
人感センサーのプログラムは以下のようになります。
基本的にはループで、人の反応を検知した際に、対象のロジックを実行するようになります。
GPIO_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)
def main():
try:
print ("処理キャンセル:CTRL+C")
while True:
if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
# 写真撮影ロジック
# slackにファイル転送ロジック
time.sleep(SLEEPTIME)
else:
time.sleep(INTERVAL)
except KeyboardInterrupt:
print("終了処理中...")
finally:
GPIO.cleanup()
print("GPIO clean完了")
if __name__ == '__main__':
main()
前回のカメラ撮影ロジックと上記を合わせると、以下のようなロジックとなります。
# -*- coding: utf-8 -*-
import picamera
import datetime
import requests
import time
import RPi.GPIO as GPIO
# 定数
PATH = '/home/pi/Desktop/pictureData'
FILE_TYPE = '.jpg'
SLACK_URL = 'https://slack.com/api/files.upload'
ACCESS_TOKEN = 'xxxx'
INTERVAL = 3 #単位:秒
SLEEPTIME = 15 #単位:秒
GPIO_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)
# 撮影ファンクション
def taking_picture_function(file_name):
camera = picamera.PiCamera()
camera.capture(file_name)
camera.close()
# 写真転送ファンクション
def send_picture_function(file_name):
files = {'file': open(file_name, 'rb')}
param = {'token': ACCESS_TOKEN}
post_result = requests.post(url="https://slack.com/api/files.upload", params=param, files= files)
print(post_result)
#ファイル名取得ファンクション
def get_full_path():
now = datetime.datetime.now()
file_name = '{0:%y%m%d_%H:%M:%S}'.format(now)
full_path = PATH + file_name + FILE_TYPE
return full_path
# メインファンクション
def main():
try:
print ("処理キャンセル:CTRL+C")
while True:
if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
full_path = get_full_path()
taking_picture_function(full_path)
send_picture_function(full_path)
time.sleep(SLEEPTIME)
else:
time.sleep(INTERVAL)
except KeyboardInterrupt:
print("終了処理中...")
finally:
GPIO.cleanup()
print("GPIO clean完了")
if __name__ == '__main__':
main()
全体的に、前回からファンクションを整理しました。
そのうえで、2回目の撮影時に以下のようなエラーが発生してしまったので、赤字の箇所(camera.close())の処理を追加しました。
mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC
mmal: mmal_port_enable: failed to enable connected port (vc.null_sink:in:0(OPQV))0x182fc50 (ENOSPC)
mmal: mmal_connection_enable: output port couldn't be enabled
どうやら、カメラモジュールを明示的に終了しないと、カメラが使用中となってしまい、エラーとなっているようでした。
参考
【Arduino】Arduino Nano(互換機)で人感センサ付けてLEDを光らせる - かっこいいブログ名つけたい