はじめに
みなさんも経験ございませんでしょうか。
使おうと思ったSwitchの充電が切れていたとか、ゲットしたはずの色違いソーナンスがいなくなっていたりとか、ハイラルの地(ゼルダの伝説)を探索してスリープにしていたはずなのに、電源入れたらパルデア地方(ポケットモンスターバイオレッド)が現れたりしたとか。
それに気づいたら、自分のSwitchを触ったであろう人に「おいっ」と言いますよね?「俺の色違いソーナンス返せよ!」っていいますよね?そうしたら「さわってないけど?」と惚けられる事ございませんか?自分はあります。というか、ありましたさ。
これをなんとかして回避したい。むしろ証拠を突きつけて、色違いソーナンスを返してもらいたい。そう野心を燃えさせた先日、目に入ったのが、以前、記事「アレクサ!!PS4つけて!!を実現する」を書かせていただいた時の相棒。RaspberryPiでした。
監視カメラを作る
今回は、自分のSwitchに誰かが近づいたことを感じたタイミングで、その際の動画を撮り、自分の携帯へなんらかの通知を行うシステムを作ってみようと思います。
使用機材
今回は以下の機材を使用します。
- Raspberry Pi 4 Model B (OS:Raspbian GNU/Linux 12)
- QIAN 1080P HD Webカメラ
- Raspberry Pi 赤外線モーションセンサー PIR Infrared Motion Sensor
(https://jp.seeedstudio.com/PIR-Motion-sensor-module-p-74.html)
RaspberryPiにカメラを繋ぐ
RaspberryPiにはカメラモジュールという拡張部品がありますが、RaspberryPiにはUSBもあり、今回はUSB接続カメラを使用します。通常のPCにUSBで接続するのと同様、RaspBerryPiのUSBに接続してRaspBerryPiを起動するだけで使用可能になります。
※USB接続のカメラは、RaspberryPi専用品ではないので使用できない可能性もあります。すでにUSBカメラを持っている方は使えるか試してみてください。
RaspberryPiでプログラミング
RaspberryPiでは以下の言語が使用できます
ラズベリーパイで使われているプログラミング言語
- Python.
- Java.
- C.
- C++
- Perl.
- Lua.
- Ruby.
- Scratch.
今回はその中でも、Pythonを使って監視カメラを作っていこうと思います。
ラズベリーパイの画面にカメラの映像を表示する。
まず、Pythonで動画を扱うことになるため、Pythonで利用できるライブラリーOpenCVをRaspberryPiにインストールします。
最新のRaspberryOSをインストールしている場合、以下の手順だけでできると思います。
1:numpyをインストール
sudo apt-get install python3-numpy
2:OpenCVをインストール
sudo apt-get install python3-opencv
3:パッケージリストを最新化
sudo apt update
4:「libatlas3-base」 パッケージをインストール
sudo apt install libatlas3-base
これでカメラを使用する準備ができました。
ここからはテストとしてカメラの映像を表示するためPythonでプログラムを組んでいきます。
import cv2
camera = cv2.VideoCapture(0)
while True:
ret, frame = camera.read()
if not ret:
break
cv2.imshow("video test", frame)
key = cv2.waitKey(1)
# 入力されたキーがEscキーならループを抜けて画面を閉じる
if key == 27:
break
camera.release()
cv2.destroyAllWindows()
実行
上記のプログラムを実行すると、カメラ映像が表示されると思います。
無事表示されました。これでPythonでカメラが使用できることが確認できました。
監視カメラを作るぞ
上記のプログラムでは、映像を垂れ流すだけのプログラムのため、監視カメラになりません。
監視カメラにするには、
- 守るべきSwitchに近づく人を動画で撮影し保存する
- 離れている自分に知らせる
の2点を実現してこそ監視カメラです。
守るべきSwitchに近づく人を動画で撮影し保存する
流石に近づいたことをRaspberryPiがカメラで認識するには、常に撮影続け、顔認証等それなりに面倒くさい難易度が高い作りをしないとなりません。
その為ここは文明の力をお借りし実現しようと思います。
人感センサー
Raspberry Pi 赤外線モーションセンサー PIR Infrared Motion Sensorを使用します。Amazonで¥700位で購入できます。
RaspberryPiにはGPIOピンがあり、電子工作で使える赤外線モーションセンサーをGPIOに繋いで、使用することができます。このセンサーをRaspberryPiに繋げていきます。
GIPOのピン配置は、RaspberryPiのマニュアルに記載があると思いますが、わからない場合、以下のコマンドを実行して確認します
pinout
実行すると以下の様にPin配置がわかる画面が表示されます。
Pin配置がわかったので、赤外線モーションセンサーとRaspberryPiを繋げていきます。
センサー側 | RaspberryPi側 | |
1 | + | 5V |
2 | OUT | GPIO18 |
3 | – | GND |
上記の表に合わせて線を繋げることで赤外線モーションセンサーの電源は5VのPinから入力され、GND(グランド)に流れていきます。そして、赤外線モーションセンサーが反応した際に、GPIOの18に向け信号を飛ばします。
これで赤外線モーションセンサーが反応した際に、人が来た!!とプログラムで反応を受け取ることができ、この反応をトリガーとして、動画保存、通知を行う といったプログラムを組めば良いわけです。
通知する方法
通知をする方法は様々なやり方がありますが、一番手っ取り早く色々な方のスマホには入っているだろう、LINEに通知を送る様な仕組みを入れるために、LINE Notifyという、LINEアプリに通知を行うサービスを利用します。
LINE Notifyを使うには自身のアカウントでトークンを取得する必要があります。
1:「LINE Notify」のトークンを以下のページから取得します
LINE Notify(https://notify-bot.line.me/ja/)
2:画面右上の「ログイン」を選択
3:メールアドレスとパスワードを入力してログイン ※ログイン後携帯のLINEの方に本人確認の通知が来るので画面に合わせた数字を入力してください。
4:右上に表示されるユーザー名を押して、マイページを選択
5:画面下部の「トークンを発行する」ボタンを押下
上記の様に表示されている箇所です
6:トークン名を入力し、送信先を選択
※トークン名通知の際に表示されるタイトルに当たるため、今回の場合、「接近者あり」としています。
7:「発行する」ボタンを押下
発行するボタンを選択すると以下の様に、発行されたトークンが表示されます
「コピー」ボタンからトークンをコピーします。このトークンを使う事で「LINE Notify」が利用できるようになります。ページを閉じるとトークンは二度と表示されないので、確実にコピーしてトークンを保存しておきましょう。スクリーンショット撮るのが一番楽かもしれません。その後、LINEのトークに、「LINE Notify」からトークン発行を知らせるメッセージが来ます。
これで、準備は整いました。
ここからは赤外線モーションセンサーが反応したら数秒動画を保存し、LINEへ通知するプログラムを作っていこうと思います。
作成したプログラム
import RPi.GPIO as GPIO
import cv2
import time
import datetime
import numpy as np
import requests
#LINEメッセージ送信の関数
def send_message(Discovery_time):
url = "https://notify-api.line.me/api/notify"
token = "トークンをここに入力"
headers = {"Authorization" : "Bearer "+ token}
message = (Discovery_time,"Switchに近づく人いるよ!")
payload = {"message" : message}
r = requests.post(url, headers = headers, params=payload)
GPIO_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN,GPIO.IN)
while True:
if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
#現在時刻を取得してファイル名にする
dt_now = datetime.datetime.now()
file_name = dt_now.strftime('%Y年%m月%d日%H時%M分%S秒')
#カメラ映像を保存する
cap = cv2.VideoCapture(0)
fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
fps = 20.0
size = (640, 360)
writer = cv2.VideoWriter((file_name + '.m4v'), fmt, fps, size)
i = 0
#60フレーム撮影する
while i < 60:
_, frame = cap.read()
frame = cv2.resize(frame, size)
writer.write(frame)
i = i + 1
writer.release()
cap.release()
#LINEメッセージ送信
send_message(file_name)
time.sleep( 10 )
else:
time.sleep( 1 )
GPIO.cleanup()
これで完成です。
テスト
試しに自分が近づいている状態で通知および動画が保存されるか確認してみます。
上記の様に通知がLINEに届き、動画が保存されていることが確認できました。
RaspBerryPiの電源を入れれば動作する様にするため、autostartに上記のプログラムファイルのパスとファイル名を記載して終了。再起動後動作することを確認してくださいね!!
設置!!
これで自分が不在時に誰かがSwitchに近づいたら通知が来る様になるはずです。
最後に
簡易的ではありますが、監視カメラを作ることができましたが、LINE Notifyでは動画の送信が出来ない為、他の方法で通知と動画が受け取れれば、もっと監視カメラらしいものになるなぁとしみじみ痛感しました。もっと精進せねば。
ただ、USBのWebカメラで動画も撮れることだし、OpenCV使うのだから、特徴点取得からの顔認証もできそうだなぁと感じたので次は顔認証にもトライしてみようかと思います。
さぁこれで、証拠を集めて、ソーナンス返してもらうぞ(♪LINE♪)・・・ん???早速通知かな??
数分後・・・(♪LINE♪)
電源抜かれたら動作しませんよね・・・orz