RasberryPi로 원격 조작이 가능한 카메라를 만들어 봤습니다.

자기 소개


Fusic에서 PHPer를 하는 나가사키입니다.
올해는 PHP 이외에 예전에 사온 인테리어 랩베리피로 뭔가를 해보자!나는 이렇게 의욕이 충만한 경솔한 일을 쓰고 싶다.

구체적으로 한 일


랩베리피(이하 랩피) + 카메라 모듈 + 카메라 고정대에서 SSH를 통해 랩피에 들어가 파이톤이 쓴 프로그램을 실행하고 키보드를 이용해 카메라 고정대를 이동시켜 촬영할 수 있도록 한다.

준비물

  • RaspberryPi2 ModelB
  • PLANEX 무선 LAN 서브머신(USB 어댑터형) 11n/g/b150Mbps MacOS X10.10 대응 GW-SUSNANO2A(FFP)
  • Raspberry Pi Video Module Raspberry Pi Camera Board 775-7731(카메라 모듈)
  • Pimoroni Pan-Tilt HAT-빵 키트 for Raspberry Pi Camera(카메라 고정대)
  • 모두 Amazon에서 구입 가능

    설치까지의 프로세스


    ※ 라스피 설치와 SSH 연결을 전제로 합니다.

    1. 카메라와 카메라 고정대를 랩피에 설치한다.

  • https://learn.pimoroni.com/tutorial/sandyj/assembling-pan-tilt-hat
  • 2. PiCamera를 설치하고 파이톤으로 촬영한다.

  • https://okuzawats.com/camera-module-20140918/
  • 3. 피모니를 설치하고 파이톤으로 카메라 고정대를 이동한다.

  • https://qiita.com/mt08/items/97d89a09e5129e10f88c
  • 4. 키보드 입력을 배워보자

  • https://qiita.com/pukin/items/3b791b8b759dd704f765
  • 5. 코드 만들기


    inputkey.py
    import fcntl
    import termios
    import sys
    import os
    
    def getkey():
      fno = sys.stdin.fileno()
    
      #stdinの端末属性を取得
      attr_old = termios.tcgetattr(fno)
    
      # stdinのエコー無効、カノニカルモード無効
      attr = termios.tcgetattr(fno)
      attr[3] = attr[3] & ~termios.ECHO & ~termios.ICANON # & ~termios.ISIG
      termios.tcsetattr(fno, termios.TCSADRAIN, attr)
    
      # stdinをNONBLOCKに設定
      fcntl_old = fcntl.fcntl(fno, fcntl.F_GETFL)
      fcntl.fcntl(fno, fcntl.F_SETFL, fcntl_old | os.O_NONBLOCK)
    
      chr = 0
    
      try:
        # キーを取得
        c = sys.stdin.read(1)
        if len(c):
          while len(c):
            chr = (chr << 8) + ord(c)
            c = sys.stdin.read(1)
      finally:
        # stdinを元に戻す
        fcntl.fcntl(fno, fcntl.F_SETFL, fcntl_old)
        termios.tcsetattr(fno, termios.TCSANOW, attr_old)
    
      return chr
    
    camera.py
    from pantilthat import *
    import time
    import picamera
    import requests
    import inputkey
    
    # カメラの設定
    camera = picamera.PiCamera()
    camera.hflip = True
    camera.vflip = True
    camera.resolution = (320, 240)
    
    angle_pan = 0
    angle_til = 0
    
    while True:
    
      val_pan = 0
      val_til = 0
    
      # key取得
      key = inputkey.getkey()
    
      # keyOFFはスルー
      if key == 0:
        time.sleep(0.01)
        continue
    
      # key処理
      if key == 10: # enter
        break;
    
      elif key == 97: # a
        time.sleep(1) # カメラのブレ防止
        camera.capture('image.jpg')
        with open("image.jpg",'rb') as f:
          param = {
            'token':'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            'channels':'xxxxxxxx',
          }
          r = requests.post('https://slack.com/api/files.upload', params = param, files = {'file':f})
    
      elif key == 1792833: # 上
        if angle_til > -90:
          val_til = -0.5
    
      elif key == 1792834: # 下
        if angle_til < 90:
          val_til = 0.5
    
      elif key == 1792835: # 右
        if angle_pan > -90:
          val_pan = -0.5
    
      elif key == 1792836: # 左
        if angle_pan < 90:
          val_pan = 0.5
    #  else:
    #    print(key) # key何押したかデバッグ用
    
      # カメラ動作
      angle_pan += val_pan
      angle_til += val_til
      pan(angle_pan)
      tilt(angle_til)
    
      time.sleep(0.01)
    
    quit()
    

    6. 실행해 보자

    $ python3 camera.py
    
    그리고 위아래 좌우 커서 키보드에서 카메라를 이동하고 T, A 키로 눌러라!슬랙에 업로드!!!

    (·재난 12610;·)و ̑̑ < 좋아!

    참고 문장

  • PYTHON PICAMRA: http://igarashi-systems.com/sample/translation/raspberry-pi/usage/python-camera.html
  • Raspberry Pi의 카메라 모듈 사용법: http://www.mztn.org/rpi/rpi23.html
  • 총결산

  • 파이썬 신난다!전자 작업 즐거움!
  • 감시로 활용할 수 있지만 잘못 사용하면 몰카로 변할 수 있으니 주의해야 한다.
  • 최후

  • 그리고 내년에~
  • 좋은 웹페이지 즐겨찾기