ラズパイを使って、”安価に”、”容易に”、何か生活に役立てられるようなものができないかと、日々考えながら過ごしていた時に思いついたのが、外出時/就寝時の防犯システム。
不在の時や就寝時に、泥棒などが入ってきたことを自動で検知して、お知らせしてくれるシステムです。本記事では、以降これを「ラズパイ防犯システム」と称して、その構築の流れや実際の動作結果をまとめました。
完成形は下図の通りです!
ラズパイで防犯システムを構築したよ!
ラズパイ防犯システムの概要
経緯と目的
本ブログでは以前、初めてラズパイにカメラを取り付けて、写真を撮影できるようにしてみました。
このカメラを使って、また、ラズパイの特徴である電子工作も取り入れて実用的なものができないかと考え、以下のような目的で防犯システムを作ってみることにしました。
<システムの目的>
・外出中や就寝中に万が一泥棒が入ったときに、証拠を残したい。
・泥棒が入ったことをいち早く把握したい。
・泥棒に入られたとしても、物を盗まれないよう撃退したい。
ラズパイとカメラとその他電子工作を使って、この3つの目的を達成させるシステムを構築しようと考えました。
仕様
前述の目的を果たすシステムの仕様を、今回は以下のようにまとめました。
<前提:システムの設置個所>
泥棒が侵入してくるリスクが最も大きそうな窓際に設置。
<システムの仕様>
1.距離センサを使って常に壁との距離を測る。
2.距離センサの数値が変化した場合、これを泥棒の侵入検知として判断する。
3.侵入を検知したら、カメラ撮影+警告メッセージを音声出力する。
4.カメラの撮影が完了したら、LINEで写真を家主に自動送信。
上記仕様に基づく、動作イメージは下図の通り。
<侵入前>
<侵入時>
ちなみにラズパイからLINEの送信は、以下の記事でまとめています。
ラズパイ防犯システムに必要なもの
ラズパイ防犯システムに必要な機器は、以下の4点です。
- カメラモジュール
- 距離センサ
- ジャンパーワイヤ
- スピーカー
それぞれ詳細は次の通り。
1.カメラモジュール
今回は、「Raspberry Pi Camera V2」というラズパイの正規カメラモジュールを使います。
カメラをつけて写真を撮る方法については、以下のサイトにまとめていますので、ぜひご覧ください。
2.距離センサ
距離を計測するセンサ。今回は、Amazonで購入した「SunFounder Raspberry pi スターター電子工作キット」の中に入っていた「Ultrasonic Sensor Module」という超音波距離センサを使うこととしました。
▼表
▼裏
この超音波距離センサは、超音波を発信し、その後反射して超音波が返ってくるまでの時間を計測することができ、時間と音速から反射箇所との距離を算出、測定することができます。
3.ジャンパーワイヤ(メスーメス:4本)
機器と機器を電気的に繋げるワイヤ。今回はラズパイと距離センサを繋げます。
4.スピーカー
警告メッセージを出力するために、ラズパイのイヤホンジャックに繋げて、音声を出力できるようにします。今回はダイソーで買った300円のものを使用しました。
以下の記事でまとめた節電システムでも使用しているものです。
以上が、ラズパイ防犯システムで必要なものです。
システム構成(ラズパイと電子機器の接続)
ここでは、システムの構成として、ラズパイと電子機器との接続についてまとめます。
まず、ラズパイと距離センサのジャンパーワイヤでの接続方法は次の通り。
<ラズパイ側>
ラズパイ側の接続方法は、以下の通りです。
- 17番ピン:3V3 power → 赤色ジャンパーワイヤで接続
- 16番ピン:GPIO 23 → オレンジ色ジャンパーワイヤで接続
- 18番ピン:GPIO 24 → 黄色ジャンパーワイヤで接続
- 20番ピン:Ground → 黒色ジャンパーワイヤで接続
<距離センサ側>
距離センサ側の接続方法は、以下の通りです。
- 1番右のピン:Vcc → 赤色ジャンパーワイヤで接続
- 右から2番目のピン:Trig → オレンジ色ジャンパーワイヤで接続
- 右から3番目のピン:Echo → 黄色ジャンパーワイヤで接続
- 右から4番目のピン:Gnd → 黒色ジャンパーワイヤで接続
カメラの接続方法については、↓の記事にまとめていますので参照ください。
次に、スピーカーはラズパイのイヤホンジャックに接続します。
今回使用するスピーカーは、電源をUSB(TypeA)からとるタイプになっていたので、ラズパイのUSB端子にも接続します。
以上で準備は完了です。
全てを繋げてみたものものが下図の通り。
上図の通り接続しては見たものの、カメラも距離センサも固定できておらず、写真撮影も距離検出もうまくいかないので、家にある廃材(箱)を使って、下図の通りケースを作ってみました。
ダサいですが、”安価に”が目的なので、これでOKとします(笑)
これでハードの構成は完了です。
プログラム
上記ハードウェアを動作させるために、以下のプログラムを作成し、”SecuritySystem.py”というファイルで保存しました。ファイルの保存先は、デスクトップにしました。なお、プログラムの詳細説明は割愛します。
import RPi.GPIO as GPIO
import time
import datetime
import subprocess
import requests
# LINEトークンID
ACCESS_TOKEN = "XXXXXXXXXX"
headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"}
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(18, GPIO.IN)
def distance():
GPIO.output(16, 0)
time.sleep(0.000002)
GPIO.output(16, 1)
time.sleep(0.00001)
GPIO.output(16, 0)
while GPIO.input(18) == 0:
a = 0
time1 = time.time()
while GPIO.input(18) == 1:
a = 1
time2 = time.time()
during = time2 - time1
return during * 340 / 2 * 100
def picture(filename):
command = ["libcamera-jpeg", "-n", "-o", filename, "-t", "1", ">/dev/null" ]
subprocess.call(command)
def jtalk(phrase):
open_jtalk=['open_jtalk']
mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
htsvoice=['-m','/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice']
speed=['-r','1.0']
outwav=['-ow','open_jtalk.wav']
cmd=open_jtalk+mech+htsvoice+speed+outwav
c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
c.stdin.write(phrase.encode())
c.stdin.close()
c.wait()
aplay = ['aplay','open_jtalk.wav']
wr = subprocess.Popen(aplay)
return print(phrase)
def loop():
distlimit = 20 # 泥棒を検知する距離を定義。当該距離より短くなったら泥棒検知とする。
while True:
dist = distance()
print('距離:%.2f[cm]' %dist)
if dist < distlimit:
print('泥棒検知:%.2f' %dist)
current_time = datetime.datetime.now()
# 写真はDesktop上に保存
filename = "/home/pi/Desktop/monitor_" + current_time.strftime("%H%M%S") +".jpg"
picture(filename)
phr = '泥棒発見。通報しました。'
jtalk(phr)
time.sleep(4)
data = {'message': "泥棒の侵入を検知しました。"}
files={'imageFile':open(filename,"rb")}
# LINEで写真送信
requests.post(
"https://notify-api.line.me/api/notify",
headers=headers,
data=data,
files=files,
)
time.sleep(3)
# 送信が完了したらラズパイに保存された写真は消し他方が良いかも。今回は削除していない。
time.sleep(0.3)
if __name__ == "__main__":
GPIO.cleanup()
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
※上記プログラムの中の「ACCESS_TOKEN = "XXXXXXXXXX"
」のXXX・・・部分に、事前準備で取得したトークンIDを設定します。トークンIDの取得方法は以下の記事を参照ください。
ラズパイ防犯システム稼働させてみた
以上で準備が完了しましたので、実際にラズパイ防犯システムを動作させてみたいと思います。動作の構図は、わかりやすいように、下図のような構成としており、泥棒の侵入は、システムと壁との間に人形を入れて模擬します。
動作を動画で撮ったものは↓
動画より、ラズパイ防犯システムと壁との間に泥棒役を通過させたときに、通過を検知して警告メッセージが音声出力されたとともに、右に置いていたスマホのLINE通知に写真が届いていることがわかります。
LINEで受信した結果も下図の通りであり、しっかりと泥棒役が写っていることが確認できました!!
この結果から、冒頭に示した目的を果たしてくれるシステムが構築できたかと思います!
まとめ
今回は、ラズパイを使った防犯対策のシステムを構築してみました。
外出中の対策にもありますが、夏に窓を開けて寝るときなどにも、ほんの少し不安がある中で寝ていましたが、これで少し安心した夜を過ごせそうです。
今後ももっと役に立つものを考えて作っていきたいなと思います。
本ブログでラズパイでやってみたこと、今後やりたいことは、以下の記事にもまとめていますので、興味のある方は是非ご覧ください。
コメント