なつやすみのしゅくだい〜ラズパイで作る自室監視システム〜

# はじめに
やあ！夏休みも明日までだね！良い子の皆、自由研究はやったかな？え？やってない？
そんな子のために今回は簡単に作れてしかも実用的な自室監視システムを紹介するよ！
まぁまぁ簡単に作れるから皆やってみよう！

- 治安が世紀末の地域に住んでてドロボーが入らないか不安な時
- お父さんお母さんにお部屋に入って欲しくない時  

などなど、色んな場面で役に立つぞ！！

# システム構成
今回作るシステムの概要はこんな感じだ！頑張れば数時間もしないで作れるんじゃないかな？
~~ちなみにお兄さんは情弱だから数日かけて作ったぞ！~~
Webカメラとスピーカー繋いだラズパイは他のアプリケーションをガンガン稼働させており、リソースに余裕ないから2台に分散したけど、そういう事情がなければラズパイは1台だけでいいと思う。

<img width="848" alt="スクリーンショット 2019-08-31 14.37.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266022/020c045e-3bf7-2754-7de7-ab7fbd7b5653.png">

# 準備しよう
## 材料の購入
全部Amazonで揃うのでお急ぎ便とかで取り寄せよう。
※ラズパイはOSセットアップ済みとします。

- Raspberry Pi 3 Model B+（OS：Raspbian Buster）
- Raspberry Pi 3 Model B（OS：Raspbian Buster）
- ブレッドボード
- ジャンプワイヤ
- 焦電型人感センサ
- スピーカー：今回は[Creative Pebble](https://www.amazon.co.jp/Creative-Pebble-USB%E9%9B%BB%E6%BA%90%E6%8E%A1%E7%94%A8%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96-45%C2%B0%E4%B8%8A%E5%90%91%E3%81%8D%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC-SP-PBL-BK/dp/B077XF3XJK/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=USB+%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC&qid=1567230164&s=gateway&sr=8-6)を使用
- Webカメラ：今回は[Logicool HD Webcam C270n
](https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%A1%E3%83%A9-C270n-%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0-2%E5%B9%B4%E9%96%93%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E4%BF%9D%E8%A8%BC/dp/B07QMKND9M/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Web%E3%82%AB%E3%83%A1%E3%83%A9&qid=1567229997&s=gateway&sr=8-7) を使用

## SlackBot関連のセットアップ
[Pythonを使ったSlackBotの作成方法](https://qiita.com/kunitaya/items/690028e33ba5c666f3e2)の「Slackで利用するBotアカウントを作成」を参考に、SlackBotの作成・トークン取得を済ませておこう。
SlackBotの作成・トークン取得が終わったらBotを適当なチャンネルに追加し、チャンネルIDを取得しておこう。

# 作ってみよう
ここではラズパイを以下の呼称で区別するよ。

- 1号機：人感センサを繋げたラズパイ（ラズパイ2）
- 2号機：Webカメラ・スピーカーを繋げたラズパイ（ラズパイ3）

## 1号機の設定
### 各種パッケージのインストール
先に必要なパッケージをインストールしておこう。

```bash
# バックグラウンド実行用
sudo apt-get install screen
# 信号受信・Slack通知用
sudo python3 -m pip install slackbot RPi.GPIO
```

### 人感センサの接続
[【Raspberry Pi】自作人感センサーの使い方と活用法](https://chasuke.com/motionsensor/)の「ラズパイと人感センサーを接続」を見て設定してみよう。

### パスワード無しでsshするための処理
[ターミナルからパスワード入力無しでssh接続する3つの方法](https://orebibou.com/2015/01/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%8B%E3%82%89%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E5%85%A5%E5%8A%9B%E7%84%A1%E3%81%97%E3%81%A7ssh%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B3/)の「鍵認証方式に切り替える」を参考にして、1号機から2号機にパスワードなしでssh出来るように設定してみよう。

### 侵入者検知用スクリプトの作成
侵入者を検知する以下のスクリプトを作ろう。かいつまんで言うと5秒間隔でチェックし、2回連続で検知したら後述する2号機側の撮影・警告・通知用スクリプト（`secom.sh`）を実行する処理をするぞ。

```python:check_fushinsha.py
#coding: utf-8
from slackbot.slackclient import SlackClient
import RPi.GPIO as GPIO
from time import sleep
from subprocess import Popen

# slack用設定
slack_token = "<ここにトークンを記入>"
sc = SlackClient(slack_token)

# 検知
gpio_out = 18  # outputのGPIOピン番号
GPIO.setmode(GPIO.BCM)
GPIO.setup(gpio_out, GPIO.IN)

counter = 0

while True:
    if GPIO.input(18) == 1:
        counter += 1
        print(counter,":someone may be here.")
        if counter >= 2:
            print(counter,":someone MUST be here.")
            Popen(["ssh", "-i", "<使用する鍵の絶対パス>",
                   "<ユーザ名>@<2号機のIPアドレス>", """sh <secom.shの置き場所の絶対パス>"""])
    elif GPIO.input(18) == 0 and counter > 0:
        counter = 0
        print(counter,":reset counter.")
    else:
        print(counter,":no one is here.")
    sleep(5)
```

### 侵入者検知用スクリプトの実行

以下のコマンドで作成した侵入者検知用スクリプトをバックグラウンド実行しておこう。

```bash
screen
python3 check_fushinsha.py
# Ctrl+A+Dで抜ける
```

## 2号機の設定
### 各種パッケージのインストール
ここでも先に必要なパッケージをインストールしておこう。

```bash
# バックグラウンド実行・Webカメラ操作・警告音再生用
sudo apt-get install screen fswebcam aplay
# Slack通知用
sudo python3 -m pip install slackbot
```

警告音声を作成する日本語音声合成エンジンとして今回は[AquesTalk Pi](https://www.a-quest.com/products/aquestalkpi.html)を使う。リンクから「aquestalkpi-20130827.tgz」をダウンロードして2号機上に持ち込んでおこう。

```
scp aquestalkpi-20130827.tgz <ユーザ名>@<2号機のIPアドレス>:<path>
ssh <ユーザ名>@<2号機のIPアドレス>
cd <path>
tar -xzvf aquestalkpi-20130827.tgz
```

### 警告音声のテキストを作成
上記手順で展開したディレクトリ（aquestalkpi）に移動し、読み上げたい文章を記入したテキストファイルを作っておこう。改行を入れると改行の手前までしか読んでくれないので注意だ。

```text:keikoku.txt
あなたを住居不法侵入罪と窃盗罪で訴えます！理由はもちろんお分かりですね？あなたが私の家に無断で入り、金品を盗んだからです！覚悟の準備をしておいて下さい。ちかいうちに訴えます。裁判も起こします。裁判所にも問答無用できてもらいます。慰謝料の準備もしておいて下さい！貴方は犯罪者です！刑務所にぶち込まれる楽しみにしておいて下さい！いいですね！
```

### 写真送信用スクリプトの作成
Slackに撮影した写真を送るためのスクリプトを作成しよう。

```python:send_picture.py
#coding: utf-8
from slackbot.slackclient import SlackClient
import sys

filename = "<撮影した写真の絶対パスを記入>"
slack_token = "<ここにトークンを記入>"  # botのtoken

channel="<メッセージを送るチャンネルのIDを記入>"

sc = SlackClient(token=slack_token)

with open(filename, "rb") as myhome:
    sc.upload_file(
        fpath=myhome,
        channel=channel,
        fname="photo",
        comment=u"撮ってあげたよ"
    )
```

### 撮影・警告・通知用シェルスクリプトの作成
合成音声を流して写真撮ってSlackに送るためのスクリプトを作ろう。

```bash:secom.sh
#!/bin/bash
# <path>には適切な値を記入

# 警告音声再生
<path>/AquesTalkPi -f <path>/keikoku.txt -s 90 -v f1 | aplay

# 写真撮影
fswebcam -r 640x320 <path>/photo.jpg

# 写真送信
python3 <path>/send_picture.py
```

これで完成だ！

# 動かしてみよう
上手くいくとSlackにはこんな感じで通知がいくはずだ。
<img width="662" alt="スクリーンショット 2019-08-31 16.26.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266022/4a64c41e-d81b-7b85-651e-f1f4a45d5666.png">


# 考えてみようのコーナー

- 常時稼働状態だと自分が部屋にいる時も延々とSlackに写真が送られてきてウザいよね。となるとシステムを停止・実行するための仕組みが必要な訳だけど、どうやればいいかな？いちいち1号機にログインして`check_fushinsha.py`の実行を止めるのも面倒だよね。
- 合成音声のスピード・種類を変えるにはどうしたらいいかな？`./AquesTalkPi -h`でオプションを見て考えてみよう。
- 合成音声は所謂ゆっくりボイスなので緊迫感に欠ける所は否めないよね。他の合成音声エンジンを使いたくなったらどうしたらいいかな？色々ググって試してみよう！

# まとめ

ラズパイで簡単に監視システムを作れることが分かったね。色々自分でカスタマイズすると楽しいかもね！