概要
監視する対象物の近くに設置。
動くものがセンサーの範囲内に入ったら写真を撮影。
撮影した写真をすぐにスマホのLINEに通知。
使用した電子パーツ等
- Raspberry Pi4 modelb
- HC-SR04(超音波センサ)
- カメラモジュール
- モバイルバッテリー
- カモフラージュとなるサメのぬいぐるみ
- 熱を逃がすためのファン
なぜ作ろうと思ったか
我が家の人が勝手に使うからなんですよねぇ、、
嫌なので証拠とってやめてもらうためです。
どう使うか
使われたくない物の近くにぜひ
カメラの下準備(つけ方等)
Raspberry Piの中でカメラを有効にする
- デスクトップから"設定"をクリック
- "Raspberry Piの設定"
- "インターフェイス"
- "カメラ"
- "OK"を押して設定が完了
Raspberry pi本体とカメラモジュールをつなぐ際にリボンケーブルを挿し込む向きに気を付ける
ライブラリーのライブラリーのインストール
Pythonで画像を扱うために、"Open CV"というライブラリーをラズパイにインストールする。
ターミナルを開いてコマンドを一行ずつ実行していく
- pipを最新のバージョンに
sudo python -m pip install --upgrade pip
- OpenCVをバージョン指定でインストール
sudo pip3 install opencv-python==4.5.1.48
- numpyライブラリを最新に
pip install -U numpy
パッケージリストを最新に
sudo apt update
「libatlas3-base」 パッケージをインストール
sudo apt install libatlas3-base
これでカメラの設定はおk!
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)
あ、ちなみにですが、こちらのサイトにも記載されてますが、、
ラズパイとセンサーの流れる電流が違うので5Vから3Vに変換するのですが、
回路を作る際にこの回路図のまんまジャンパ線を繋げて行くと、センサーがこちらに向いているので、センサーの向きを変えるときはピン配置に気を付けて…
私は友人に貸したらやられてしまい、
ありえんほどの熱を持って私のHC-SR04はお亡くなりになりました。。。
某サイトでポチッた結果600個も届いてしまったので欲しい人はあげます(
LINEに通知するための準備
お使いの端末のLINEに通知するためにはLINE Notifyのサービスを利用してアクセストークンを発行する必要があります。
すでにお持ちの場合は既存のトークンを使ってもいいですし、見分けるためにもう一つ作ってもいいかもしれません。
詳細はこちらのサイトを参照してください↓
【使ってみた】LINE Notifyを使ってトークルームにメッセージ送信
カメラモジュール・センサー・LINEの準備が終わったところで、
ソースコードはこちらです。
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()
実際に動く様子はこちらから飛んでください
→ちゃんとしたちょっとした監視カメラ