yamadaTarouの日記

日々の生活を書いてます。誰か宛てではなく、自分宛て。もはや自〇行為(オ〇ニー)と同じ

raspberry Pi 入門③(防犯カメラ作成-2)

前回に引き続き、防犯カメラの作成をやっていきます。

raspberry Pi 入門③(防犯カメラ作成) - yamadaTarouの日記

 

前回やっていなかった人感センサーについて記載します。

 

【部品】

ラズベリーパイ用のカメラモジュール

www.amazon.co.jp

ジャンプワイヤー(メス-メス)×3本 

 

センサーとラズパイは以下の写真のように接続します。

f:id:yamadaTarou:20200618134005p:plain

f:id:yamadaTarou:20200618134150j:plain

 

人感センサーのプログラムは以下のようになります。

基本的にはループで、人の反応を検知した際に、対象のロジックを実行するようになります。

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を光らせる - かっこいいブログ名つけたい