ちょっとした監視カメラ

## 概要
監視する対象物の近くに設置。
動くものがセンサーの範囲内に入ったら写真を撮影。
撮影した写真をすぐにスマホのLINEに通知。

## 使用した電子パーツ等
- Raspberry Pi4 modelｂ
- HC-SR04（超音波センサ）
- カメラモジュール
- モバイルバッテリー
- カモフラージュとなるサメのぬいぐるみ
- 熱を逃がすためのファン

## なぜ作ろうと思ったか
我が家の人が勝手に使うからなんですよねぇ、、
嫌なので証拠とってやめてもらうためです。

## どう使うか
使われたくない物の近くにぜひ

## カメラの下準備（つけ方等）
##### Raspberry Piの中でカメラを有効にする

1. デスクトップから"設定"をクリック
1. "Raspberry Piの設定"
1. "インターフェイス"
1. "カメラ"
1. "OK"を押して設定が完了


###### Raspberry pi本体とカメラモジュールをつなぐ際にリボンケーブルを挿し込む向きに気を付ける

1. Raspberry Piの黒いロック部分を持ち上げる
（割と浮きます）
![IMG_E4347.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962034/11ff36f8-3c90-829e-8f7e-1cb9c3664f73.jpeg)

1. 黒いロック部分にリボンケーブルの裏側が来るように挿し込む(端子がHDMIポート側に来る)
![IMG_E4348.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962034/53bd79f5-685b-6e54-1f38-1d02ef715e99.jpeg)

1. リボンケーブルを挿し込んだら持ち上げた黒いロックを押し込む
![IMG_E4349.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962034/e6a6017a-32c4-5747-9f7f-fd4a2218385a.jpeg)
この状態で軽く引っ張っても外れなければしっかり挿し込めてます。

###### ライブラリーのライブラリーのインストール

Pythonで画像を扱うために、"Open CV"というライブラリーをラズパイにインストールする。

ターミナルを開いてコマンドを一行ずつ実行していく

1. pipを最新のバージョンに

`sudo python -m pip install --upgrade pip`

2. OpenCVをバージョン指定でインストール

`sudo pip3 install opencv-python==4.5.1.48`

3. numpyライブラリを最新に

`pip install -U numpy`

パッケージリストを最新に

`sudo apt update`

「libatlas3-base」 パッケージをインストール

`sudo apt install libatlas3-base`

これでカメラの設定はおｋ！

Raspberry Piがカメラを認識しているか確認する方法は、
LXTerminalを開いて、`vcgencmd get_camera`と入力、、
「supported=1 detected=1」と出てきたらラズパイがちゃんとカメラモジュールを認識してます。
もし「supported=1 detected=0」と出てきたらカメラモジュールを認識できていないです。
その場合は一旦リボンケーブルを挿しなおしてからラズパイを再起動してみると、認識しやすいです



## HC-SR04（センサーの回路）
まず使用するもの
- 1kΩ：3つ
- HC-SR04
- ジャンパ線：5本（ラズパイと繋ぐため、4本はオス-メスピンを使用）

詳細はこちらを参考に→[電気設計人.com【ラズパイ電子工作】超音波センサで距離を読み取る方法(HC-SR04)](https://denkisekkeijin.com/raspberrypi/pi-ultrasound/)
![RPD035_pi_ultrasound_ブレッドボード-1536x1336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962034/17854286-389c-a2c0-0a21-fbc9629c88d0.png)

あ、ちなみにですが、こちらのサイトにも記載されてますが、、
ラズパイとセンサーの流れる電流が違うので５Vから３Vに変換するのですが、
回路を作る際にこの回路図のまんまジャンパ線を繋げて行くと、センサーがこちらに向いているので、センサーの向きを変えるときはピン配置に気を付けて…
私は友人に貸したらやられてしまい、
ありえんほどの熱を持って私のHC-SR04はお亡くなりになりました。。。

私の使用した抵抗器はこれです
　　　　　　↓↓
![IMG_4449.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962034/f9d636ea-b7b4-6bb8-c70d-6df6533e27f0.jpeg)

某サイトでポチッた結果600個も届いてしまったので欲しい人はあげます(
![IMG_4451.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962034/d3702a14-3035-9474-1aec-2d01b39979b5.jpeg)


## LINEに通知するための準備

お使いの端末のLINEに通知するためにはLINE Notifyのサービスを利用してアクセストークンを発行する必要があります。
すでにお持ちの場合は既存のトークンを使ってもいいですし、見分けるためにもう一つ作ってもいいかもしれません。

詳細はこちらのサイトを参照してください↓
[【使ってみた】LINE Notifyを使ってトークルームにメッセージ送信
](https://www.smilevision.co.jp/blog/tsukatte01/)



カメラモジュール・センサー・LINEの準備が終わったところで、
ソースコードはこちらです。

```python
import RPi.GPIO as GPIO
import cv2   #カメラモジュール
import time
import sys
import requests  #line notify
import datetime

#LINEの設定
url = 'https://notify-api.line.me/api/notify'  #linenotifyのurl
token = 'lineのアクセストークン'

# カメラの準備
camera = cv2.VideoCapture(cv2.CAP_V4L2)

# ポート番号の定義
Trig = 17  #ピン番号は11ピン
Echo = 15　#ピン番号10ピン

#GPIOの設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(Trig, GPIO.OUT)
GPIO.setup(Echo, GPIO.IN)

#HC-SR04で距離を測定する関数
def read_distance():
    GPIO.output(Trig, GPIO.HIGH)
    time.sleep(0.00001)
    GPIO.output(Trig, GPIO.LOW)
    
    while GPIO.input(Echo) == GPIO.LOW:
        sig_off = time.time()
    while GPIO.input(Echo) == GPIO.HIGH:

        sig_on = time.time()

    duration = sig_on - sig_off
    distance = duration * 34000 / 2
    return distance

# 連続した値を超音波センサの状態を読み取る
while True:
    try:
        cm = read_distance()
        print("distance=", int(cm), "cm")
        if (cm > 2) and (cm < 400):
            print("distance=", int(cm), "cm")
        time.sleep(1)

	)
        
        if cm < 50:      #50cm以内に設定
            ret, frame = camera.read()
            
            # 写真を分けるため、写真の名前をリアルタイムに設定
            dt_now = datetime.datetime.now()
            file_name = dt_now.strftime('%Y年%m月%d日%H時%M分%S秒')
               
            result = cv2.imwrite("保存先" + file_name + ".jpg", frame)
            print(result)

            ms_date = "何かが映り込みました"

            image = '保存先' + file_name + '.jpg'

            send_data = {'message': ms_date}
            headers = {'Authorization': 'Bearer ' + token}
            files = {'imageFile': open(image, 'rb')}
            
            res = requests.post(url,
                    data=send_data,
                    headers=headers,
                    files=files)
  
            print(res)
            time.sleep(10)

    except KeyboardInterrupt:
        
        camera.release()
        cv2.destroyAllWindows()
        GPIO.cleanup()
        sys.exit()
```

実際に動く様子はこちらから飛んでください
→[~~ちゃんとした~~ちょっとした監視カメラ](https://protopedia.net/prototype/3485)

### 参考文献
- [sozorablog 監視カメラの作り方|Pythonでカメラモジュールを自在に操作](https://sozorablog.com/camera_shooting/)
- [sozorablog 【Python入門】LINEに自動でメッセージを送る（活用事例あり）](https://sozorablog.com/pythonline/)
- [パソコン工房 Raspberry Piとカメラモジュールを接続する](https://www.pc-koubou.jp/magazine/17276)