7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

東京テクニカルカレッジAdvent Calendar 2022

Day 9

ちょっとした監視カメラ

Last updated at Posted at 2022-12-09

概要

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

使用した電子パーツ等

  • Raspberry Pi4 modelb
  • HC-SR04(超音波センサ)
  • カメラモジュール
  • モバイルバッテリー
  • カモフラージュとなるサメのぬいぐるみ
  • 熱を逃がすためのファン

なぜ作ろうと思ったか

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

どう使うか

使われたくない物の近くにぜひ

カメラの下準備(つけ方等)

Raspberry Piの中でカメラを有効にする
  1. デスクトップから"設定"をクリック
  2. "Raspberry Piの設定"
  3. "インターフェイス"
  4. "カメラ"
  5. "OK"を押して設定が完了
Raspberry pi本体とカメラモジュールをつなぐ際にリボンケーブルを挿し込む向きに気を付ける
  1. Raspberry Piの黒いロック部分を持ち上げる
    (割と浮きます)
    IMG_E4347.JPG

  2. 黒いロック部分にリボンケーブルの裏側が来るように挿し込む(端子がHDMIポート側に来る)
    IMG_E4348.JPG

  3. リボンケーブルを挿し込んだら持ち上げた黒いロックを押し込む
    IMG_E4349.JPG
    この状態で軽く引っ張っても外れなければしっかり挿し込めてます。

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

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

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

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

sudo python -m pip install --upgrade pip

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

sudo pip3 install opencv-python==4.5.1.48

  1. 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)
RPD035_pi_ultrasound_ブレッドボード-1536x1336.png

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

私の使用した抵抗器はこれです
      ↓↓
IMG_4449.JPG

某サイトでポチッた結果600個も届いてしまったので欲しい人はあげます(
IMG_4451.JPG

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()

実際に動く様子はこちらから飛んでください
ちゃんとしたちょっとした監視カメラ

参考文献

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?