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

# 自己紹介
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に取り付ける。
- https://learn.pimoroni.com/tutorial/sandyj/assembling-pan-tilt-hat

## 2.PiCameraをインストールしてPythonで撮影してみる。
- https://okuzawats.com/camera-module-20140918/

## 3.pimoroniをインストールしてPythonでカメラ固定台を動かしてみる。
- https://qiita.com/mt08/items/97d89a09e5129e10f88c

## 4.キーボード入力が出来るようにしてみる
- https://qiita.com/pukin/items/3b791b8b759dd704f765

## 5.作成コード

```python: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
```

```python: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](https://qiita-image-store.s3.amazonaws.com/0/25290/141dc33c-3ce3-943a-60cd-88ecbb6cfa6d.png)
( ・ㅂ・)و ̑̑  ＜ よっしゃ！

## 参考記事
- PYTHON PICAMRA：http://igarashi-systems.com/sample/translation/raspberry-pi/usage/python-camera.html
- Raspberry Pi のカメラモジュールの使い方：http://www.mztn.org/rpi/rpi23.html

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

## 最後に
- それでまた来年～