테크/라즈베리파이

[라즈베리파이] 클라우드와 카메라 연동

시그널보내 2021. 8. 8. 23:19

라즈베리파이는 소형 컴퓨터 이다.

 

게다가 리눅스 기반 컴퓨터라 사용자가 마음껏 용도를 바꿀수도 있다.

 

이번 포스팅에서는 구글의 모바일 및 웹 애플리케이션 개발 플랫폼 'Firebase' 에서 클라우드와

 

파이의 카메라, GPIO에 모션감지센서를 연결 할 것이다.

 

방에 침입자가 들어오면 모션센서가 이를 인식한 후 카메라로 찍어서 클라우드에 사진을 전송하는 기능을 구현해 보자.


Firebase 설정

1. Firabase홈페이지에 들어가서 구글계정으로 가입

Firebase (google.com)

 

Firebase

Firebase는 고품질 앱을 빠르게 개발하고 비즈니스를 성장시키는 데 도움이 되는 Google의 모바일 플랫폼입니다.

firebase.google.com

2. 시작하기 -> 프로젝트 추가(Raspberry Pi) -> 왼쪽메뉴 Storage -> 파일 추가(Images)

3. 생성된 링크의 주소를 잘 기억해둔다.(raspberry-pi-da9d6)

4. 왼쪽메뉴 톱니바퀴 -> 프로젝트 설정 -> 서비스 설정 -> python선택 -> 새 비공개 키 생성

5. 다운받아진 파일(키값)을 라즈베리파이의 pi 디렉토리로 옮긴 후 파일명을 "serviceAccountKey.json" 으로 바꿔준다.


라즈베리파이 설정

1. Firebase와 라즈베리파이간의 파이썬 모듈을 설치해야 한다.

  firebase_admin : 파이어베이스와 연동하기 위해 설치

  uuid : UID를 생성하기 위해 설치

  PiCamera : 파이카메라를 이용하기 위해 설치

~$ pip3 install firebase_admin
~$ pip3 install uuid
~$ pip3 install PiCamera

2. 깃허브에서 파이썬 코드 갖고오기.('reasley-com'오픈소스 참고)

GitHub - reasley-com/BP_Computing-RaspberryPi

 

GitHub - reasley-com/BP_Computing-RaspberryPi

Contribute to reasley-com/BP_Computing-RaspberryPi development by creating an account on GitHub.

github.com

~$ git clone https://github.com/reasley-com/BP_Computing-RaspberryPi/tree/main/Series3_Camera(FireStorage)

3. 파이썬코드 확인 및 수정

pi디렉토리에 Storage_camera.py파일이 다운받아졌는지 확인.

PROJECT_ID = " "부분에 본인의 파이어베이스 코드를 작성 후 저장

~$ nano Storage_camera.py

4. pi디렉토리에 Images 디렉토리 생성

~$ mkdir Images


결과확인1

파이썬 파일을 실행하면 파이어베이스 스토리지에 자동으로 업로드 되는것을 확인해보자.

~$ python3 Storage_camera.py


응용(GPIO)

라즈베리파이의 GPIO를 이용하여 모션감지센서를 연결한 후 모션을 감지하면 카메라 촬영을 하도록 만들어보자.

 

1. GPIO연결

GND GND
VCC 5V
OUT 17번핀

2. 파이썬코드 수정

PROJECT_ID = " "파이어베이스 링크

chk라는 체크변수를 만들어서 2초이상 모션이 감지되면 촬영을 한다.

~$ nano HC-SR501+Storage_camera.py

from picamera import PiCamera
from time import sleep
import datetime
import sys, os
import requests
import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage
from uuid import uuid4
import RPi.GPIO as GPIO
import time

PROJECT_ID = "raspberry-pi-da9d6"

cred = credentials.Certificate("./serviceAccountKey.json")
default_app = firebase_admin.initialize_app(cred, {
    'storageBucket': f"{PROJECT_ID}.appspot.com"
})

camera = PiCamera()

def fileUpload(file):
    bucket = storage.bucket()
    blob = bucket.blob('Images/'+file)
    new_token = uuid4()
    metadata = {"firebaseStorageDownloadTokens": new_token}
    blob.metadata = metadata

    blob.upload_from_filename(filename='./Images/'+file, content_type='image/jpeg')
    print(blob.public_url)

def execute_camera():
    subtitle = "Ras"
    suffix = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + '.jpg'
    filename = "_".join([subtitle, suffix])

    camera.capture('/home/pi/Images/' + filename)
    fileUpload(filename)

pin = 17

GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.IN)

time.sleep(2)
print('Ready')

chk = 0
try:
    while True:
        if(GPIO.input(pin)==1):
            print('motion')
            chk += 1
            if chk >= 2:
                execute_camera()
                chk = 0
        else:
            print('noting')
        time.sleep(1)

except KeyboardInterrupt:
    pass
    print('Exit with ^C. Goodbye!')
    GPIO.cleanup()
    exit()

결과확인2