USBカメラで定時撮影するシステムを作ってみた

## 目次
- [USBカメラで定時撮影するシステムを作ってみた]
	- [目次](#目次)
	- [概要](#概要)
	- [揃えるもの](#揃えるもの)
	- [システムの構成](#システムの構成)
	- [Raspberry Pi Zero WHの開発環境を整える](#raspberry-pi-zero-whの開発環境を整える)
	- [ラズパイからUSBカメラを使って写真を撮影できるようにする](#ラズパイからusbカメラを使って写真を撮影できるようにする)
	- [Slackに写真を投稿できるようにする。](#slackに写真を投稿できるようにする)
	- [電源がついたらプログラムが実行されるようにする](#電源がついたらプログラムが実行されるようにする)
	- [ラズパイに定期的に電源を供給するようにする](#ラズパイに定期的に電源を供給するようにする)
	- [実行してみた](#実行してみた)

## 概要
- 1時間ごとにUSBカメラで撮影を行いSlackに画像をアップロードするシステムを作りたい

- 可能であれば電池だけで1ヶ月くらい動作できるようにしたい（重要）


## 揃えるもの
ラズパイの開発用PC：Ubuntu18.04LTS（仮想マシンでもOK）

IWT2525の設定用PC：Windows10

- Raspberry Pi Zero WH

|![raspberrypi_zero_wh.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550473/db6db237-a3f0-b03e-3ae7-145f12c07a8f.jpeg)|
|:-:|


- IWT2525(ラズパイの電源を制御するデバイス)

|![iwt2525.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550473/1d789a13-88bb-8975-db6f-75caf0acfe5c.jpeg)|
|:-:|


- C270(USBカメラ)

|![c270.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550473/dee35b61-f740-f6cf-f4b4-a4a399baecf1.jpeg)|
|:-:|

システムの完成形はこんな感じになります。

|![all_system.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550473/84c16492-f87b-5a0e-592b-ec90aa5912c6.jpeg)|
|:-:|



## システムの構成
1. IWT2525がラズパイに電源を供給

2. ラズパイがWifiに接続

3. USBカメラが写真を撮影

4. Slackのチャンネルに写真を投稿

5. IWT2525がラズパイへの電源の供給を停止


## Raspberry Pi Zero WHの開発環境を整える
開発するためにディスプレイ、キーボードなどを使うのは面倒なので、初回起動からSSHで接続できるようにします。

以下の手順で初回起動時からSSHができるようになります。

1. https://www.raspberrypi.org/downloads/raspbian/ <br>リンク先から「Raspbian Buster Lite」のイメージファイルをダウンロードします。
2. https://www.balena.io/etcher/ <br>リンク先のbalenaEtcherを使ってSDカードにイメージファイルを焼きます。

3. SDカード内の/boot/直下に「ssh」という名前のからファイルを作成します。
4. SDカード内の/etc/wpa_supplicant/wpa_supplicant.confにnetworkの設定を記述します。<br>wpa_passphraseコマンドで得られた以下のような内容をファイルに追記すればOKです。

  ```
  network={
      ssid="MYSSID"
      #psk="passphrase"
      psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  }
  ```

これでラズパイにSSHでログイン可能になります。

## ラズパイからUSBカメラを使って写真を撮影できるようにする
「fswebcam」コマンドでUSBカメラを使って写真を撮影することができます。<br>以下のコマンドでfswebcamをインストールできます。

```
sudo apt install fswebcam
```

以下のようにコマンドを打てば画像を撮ることができます。

```
fswebcam picture.jpg
```

## Slackに写真を投稿できるようにする。
Slack API周りの詳しい内容は以下のリンクを参照

[PythonでSlackに画像をアップロードする方法](https://qiita.com/tottu22/items/594e8c506ece0f8cc87c)

今回は写真の撮影も行いたいのでプログラム全体は以下のようになります。

```
<python:main.py>

import requests
import subprocess

while True:
	result = subprocess.run(["fswebcam","picture.jpg"])
	if result.returncode == 0:
		break

accessToken="xxxx-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
file_path = "picture.jpg"
channelId = "XXXXXXXXX"

files = {'file': open(file_path, 'rb')}
param = {'token':accessToken, 'channels':channelId}
while True:
	try:
		res = requests.post(url="https://slack.com/api/files.upload",params=param, files=files)
		if res.status_code == 200:
			break
	except:
		pass

```

/home/pi/firmwareフォルダを作成し、<br>このファイルをその中に配置します。

## 電源がついたらプログラムが実行されるようにする
crontabを利用してラズパイが起動するたびにmain.pyが実行されるようにします。
以下のコマンドで設定します。

```
sudo su
crontab -e
```
ファイルの末尾に

```
@reboot python /home/pi/firmware/main.py
```

と記述すればOKです。

## ラズパイに定期的に電源を供給するようにする
ラズパイを24時間常時、電池で駆動させるとすぐに電源の供給ができなくなるので、
IWT2525で必要最低限の時間のみラズパイに電源を供給するようにします。
IWT2525の設定はWindows上で行います。
今回は1時間ごとに一回撮影を行いたいので、画像のような設定にします。
![setting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550473/7b84a3d4-f8b4-441e-8561-003d3a144f70.png)

## 実行してみた
一定時間ごとにSlackに画像を投稿することができました。

|![result.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550473/529c81b9-a65c-9eb5-0c2d-00d954afc119.png)|
|:-:|