masayasanのアイコン画像
masayasan 2023年08月27日作成 (2023年08月30日更新) © MIT
製作品 製作品 Lチカ Lチカ 閲覧数 1408
masayasan 2023年08月27日作成 (2023年08月30日更新) © MIT 製作品 製作品 Lチカ Lチカ 閲覧数 1408

Raspberry Pi 4Bで監視カメラ、NVR作製

Raspberry Pi 4Bで監視カメラ、NVR作製

概要

RaspberryPi 4BにAgent DVRをインストールしてNVR(ネットワークビデオレコーダー)として使用します。
カメラは自身に接続してあるUSBカメラとRTSP化したRaspberryPi +3Bを接続しました。
カメラはONVIF対応のカメラも可能な様です。

使用部品

RaspberryPi 4B 4GB(+PoEハット)
USBカメラ(詳細不明)
RTSP化したRaspberryPi +3B

NPNトランジスタ x1
LEDランプ x3
タクトスイッチ x4
抵抗 330Ω x4

使用ソフト

RaspberryPi OS(64bit)
Agent DVR

Raspberry ハード改造

下記の部品は無くても良いですが利便性を考慮して取付けました。
PoEハット増設
・百均の名刺ケースを改造したケースにFAN取付け
・ボタン及びLEDを取付けた自作基盤
キャプションを入力できます
キャプションを入力できます

自作基盤作製

自分が作ったPythonプログラムを動作させる&動作確認用にタクトスイッチとLEDを取付け
 トランジスタはFANを動作させるために必要。FANが5V仕様なのでRaspberryPiのGPIO(3.3V)からは直接電源供給出来ません。

回路図

キャプションを入力できます

電源ON、OFFのスイッチとFAN制御のGPIOはディフォルトでGPIO3と14なので、そのまま接続。
その他のスイッチは録画スタートボタン及びストップボタンに使用する予定。

#Raspberry Piセットアップ

Raspberry Pi OSインストール

公式のRaspberry Pi Imagerを使用してSDカードに64bit版のOSをインストールする。
32bit版だとAgent DVRが使用できない様です。

Agent DVRインストール

Agent DVR元々はiSpyというソフトだったみたいです。

リンク先にも記載されていますが、下記のコマンドをターミナルで入力するとインストールされます。
インストール前にパッケージのアップデートとアップグレードをしておきます。

<RaspberryPi ターミナルで実行>

sudo apt update && sudo apt upgrade
sudo apt-get install curl
bash <(curl -s "https://raw.githubusercontent.com/ispysoftware/agent-install-scripts/main/v2/install.sh")

インストール後、再起動すればNVRとして運用することが出来ます。

外部パソコンでAgent DVR動作確認①

http://RaspberryPiのIPアドレス:8090/#Live をブラウザに入力
外部パソコンでなくてもRaspberryPi自身のブラウザを使用しても良い。ただCPU負荷が大きくなり遅延が発生するので外部から操作した方が良いと思います。
キャプションを入力できます
上の写真ではVNCでRaspberryPiの画面を表示させてます。

Agnet DVRをインストールした後でも、RaspberyyPiのデスクトップ環境は使用可能ですが、インストール前まで使用出来ていたカメラ(V1.3)が使用できなくなりました。
USBカメラはローカルデバイスとして選択して使用できる様です。

左側がUSBカメラ、右側はRTSP化したRaspberryPi+3Bの映像を映しています。

#自作Pythonプログラムの導入
Agent DVRはモーション検知がありますが、私の持ってるUSBカメラでは上手く動作してくれませんでした。
RTSP化したRaspberryPi+3Bだと対象物に動きがあると自動で録画してくれます。
録画のためにブラウザ開いて操作するのは面倒なのでボタン操作で録画できるようにします。

ついでに、ボタン操作電源ON・OFFしたりFANを自動で制御出来るように設定します。

RaspberryPiの設定変更、config.txtを編集

まずはターミナルで下記コマンドを実行します。

sudo raspi-config

キャプションを入力できます
I1のカメラを有効にしておきます。
キャプションを入力できます

FANを選択。GPIOのピン番号と動作温度(60℃~)を設定できます。
キャプションを入力できます
設定完了したらraspi-configを閉じます。

次にはターミナルで下記コマンドを実行します。

sudo nano /boot/config.txt

/boot/config.txt に下記を追記

hdmi_force_hotplug=1
dtoverlay=vc4-fkms-v3d
dtoverlay=ov5647
dtoverlay=gpio-shutdown,debounce=1000
dtparam=pwr_led_trigger=heartbeat

'hdmi_force_hotplug=1'はRaspberryPiにモニタ接続してなくても外部パソコンでVNC接続をしてデスクトップ画面が表示できる様に。

'dtoverlay=vc4-fkms-v3d''dtoverlay=ov5647'カメラV1.3を使用できるようにする為の設定。
AgentDVRをインストールした後は使用できなくなった。

'dtoverlay=gpio-shutdown,debounce=1000' GPIO3をGNDと1000ms短絡させるとシャットダウンを行う。短絡させる時間は変更可能。

'dtparam=pwr_led_trigger=heartbeat'RaspberryPi動作中はRaspberryPiのランプを点滅表示させる。
RaspberryPiに電源投入するとLED点灯するが、動作してる時もしていない時も点灯しているので、動作状況が分かりづらい。

main.py作成およびSytemdを使用した自動起動設定

サービス内に起動するpythonプログラムを/home/ユーザー名 に作成(main.py)。
とりあえずコードはまだ何も書かなくても良いです。

<下記コマンドをターミナルで実行>

sudo nano /etc/systemd/system/main.service

main.serviceに下記を記入

[Unit]
Description = main

[Service]
ExecStart=/usr/bin/python3 main.py
WorkingDirectory=/home/ユーザー名

[Install]
WantedBy=multi-user.target

サービスを更新をして有効化

systemctl daemon-reload
sudo systemctl enable main.service

これで次回起動時に/home/ユーザー名 にあるmain.pyが自動実行されます。

main.py内のコード

pythonエディタで下記コードを入力
nvr.localはホスト名をnvrとしたからです。代わりにRaspberryPiのIPアドレス入力しても動作します。

#!/usr/bin/env python3
import RPi.GPIO as GPIO
import requests
import time

GPIO.setmode(GPIO.BCM)

GPIOsw1 = 2
GPIOsw2 = 4
GPIOsw3 = 17
GPIOsw4 = 27

LED_red = 22
LED_green1 = 10
LED_green2 = 9

GPIO.setup(GPIOsw1,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIOsw2,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIOsw3,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIOsw4,GPIO.IN,pull_up_down=GPIO.PUD_UP)

GPIO.setup(LED_red,GPIO.OUT)
GPIO.setup(LED_green1,GPIO.OUT)
GPIO.setup(LED_green2,GPIO.OUT)
           
GPIO.output(LED_red, GPIO.HIGH)
GPIO.output(LED_green1, GPIO.HIGH)
GPIO.output(LED_green2, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED_red, GPIO.LOW)
GPIO.output(LED_green1,GPIO.LOW)
GPIO.output(LED_green2,GPIO.LOW)

while True:
    sw1 = GPIO.input(GPIOsw1)
    sw2 = GPIO.input(GPIOsw2)
    sw3 = GPIO.input(GPIOsw3)
    sw4 = GPIO.input(GPIOsw4)
    if sw1==0:
        GPIO.output(LED_red, GPIO.HIGH)
        requests.get('http://nvr.local:8090/command/record')
    elif sw4==0:
        GPIO.output(LED_red, GPIO.LOW)
        requests.get('http://nvr.local:8090/command/recordStop')

リンク先で、その他のコマンドがあります。
ブラウザからの設定で、バッファが20秒設定出来るのでアラーム等をトリガーとしてドライブレコーダの様な使い方も出来るようです。

録画操作風景

@youtube

まとめ

ボタンの代わりにセンサーなどをトリガーにすれば、監視カメラやドラレコシステムが手軽に構築出来そうです。

1
2
ログインしてコメントを投稿する