LoginSignup
6
5

More than 5 years have passed since last update.

RasberryPiでリモート操作が出来るカメラを作成してみた

Last updated at Posted at 2017-12-10

自己紹介

FusicでPHPerやってる早﨑です。
今年はPHP以外にもというととで、昔買ってインテリア化していたRaspberryPiで何かしよう!と意気込んでちょこちょこやってきたことを書きたいと思います。

具体的にやったこと

RaspberryPi(以下RasPi)+カメラモジュール+カメラ固定台で、SSHでRasPiに入ってpython書いたプログラムを実行してキーボードでカメラ固定台を動かして撮影が出来るようにした。

用意するもの

  • RaspberryPi2 ModelB
  • PLANEX 無線LAN子機 (USBアダプター型) 11n/g/b 150Mbps MacOS X10.10対応 GW-USNANO2A (FFP)
  • Raspberry Pi Video Module Raspberry Pi Camera Board 775-7731(カメラモジュール)
  • Pimoroni Pan-Tilt HAT - パン-ティルト キット for Raspberry Pi Camera(カメラ固定台)

全てAmazonで購入可能

実装までの流れ

※RasPiのセットアップとSSH接続は出来てる前提とします。

1.カメラとカメラ固定台をRasPiに取り付ける。

2.PiCameraをインストールしてPythonで撮影してみる。

3.pimoroniをインストールしてPythonでカメラ固定台を動かしてみる。

4.キーボード入力が出来るようにしてみる

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キーでパシャリ!Slackにアップロード!!!

image.png
( ・ㅂ・)و ̑̑ < よっしゃ!

参考記事

まとめ

  • Python楽しい!電子工作楽しい!
  • 監視としてはいいですが、使い方を誤れば盗撮になるので気を付けましょう。

最後に

  • それでまた来年~
6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5