”Raspberry Pi地震計”に”監視モード”つけてみた
”Raspberry Pi地震計”シリーズ、続きます。
Raspberry Piで”地震計”作ってみた: EeePCの軌跡
”Raspberry Pi 地震計”で揺れの大きいときは自宅の様子をメール送信できるようにしてみた: EeePCの軌跡
今回はタイトルにもある通り”監視モード”をつけてみました。
といっても、別に大したことはやってません。ただ単に大規模揺れの後は1分おきにに写真と気温をメール送信するという仕組みを追加しただけです。
今回追加したのはこのセンサー。
先日4年半ぶりに名古屋・大須へ行ってきた時に買った温度センサー”LM75B”。
+127度まで測定可能らしいので、とりあえずこれを使いました。
先日起こった熊本でもそうですが、自宅を留守にしているときに地震が発生したらまず気がかりになるのは以下のものが考えられます。
・ 地震で自宅の様子がどうなっているか?
これは先回記事のテーマ。
ところが揺れが起こった後にも次の2つの懸念が残ります。
・ 混乱に乗じて泥棒が侵入していないか?
・ 自宅で火災が起こっていないか?
熊本でも起こってるようですね、火事場泥棒ならぬ地震場泥棒。
また阪神淡路大震災では大規模火災も発生しました。
どちらも大震災時には十分起こりうる災難です。
これを可能な限り監視するため、1分おきに部屋の写真と気温を送り続けてくれるようにします。
ただし、Raspberry Piを使う限り自宅の電源およびネット回線が遮断された時点で監視不能に陥ります。まあ、これは仕方がないかなぁと。
まず、加速度センサーMPU6050を含む回路図は以下。
MPU6050、LM75BともにI2CでRaspberry Piと接続するため、それぞれのセンサーの「VCC」は1番ピン、「GND」は6番ピン、「SDA」は3番ピン、「SCL」は5番ピンにつなぎます。
ところでI2C機器って上のように3番、5番ピンに直列につないじゃっても大丈夫なんですね(IDが違うことが前提)。
i2cdetect -y 1
と打って「48」「68」の数字が出ていればOK(”48”がLM75A、”68”がMPU6050)。
続いて、以下の4つのシェルスクリプト、pythonコードを作成します。
◆ sindo.py
# -*- coding: utf-8 -*-
#!/usr/bin/python
import smbus
import math
from time import sleep
import datetime
import logging
import subprocess
# slave address
DEV_ADDR = 0x68 # device address
# register address
ACCEL_XOUT = 0x3b #
ACCEL_YOUT = 0x3d
ACCEL_ZOUT = 0x3f
TEMP_OUT = 0x41
GYRO_XOUT = 0x43
GYRO_YOUT = 0x45
GYRO_ZOUT = 0x47
PWR_MGMT_1 = 0x6b # PWR_MGMT_1
PWR_MGMT_2 = 0x6c # PWR_MGMT_2
bus = smbus.SMBus(1)
bus.write_byte_data(DEV_ADDR, PWR_MGMT_1, 0)
buffa = 0.0
v = 0.0
#
# Sub function
#
# 1byte read
def read_byte(adr):
return bus.read_byte_data(DEV_ADDR, adr)
# 2byte read
def read_word(adr):
high = bus.read_byte_data(DEV_ADDR, adr)
low = bus.read_byte_data(DEV_ADDR, adr+1)
val = (high << 8) + low
return val
# Sensor data read
def read_word_sensor(adr):
val = read_word(adr)
if (val >= 0x8000):
# minus
return -((65535 - val) + 1)
else:
# plus
return val
logging.basicConfig(filename='sindo.log', format='%(levelname)s : %(asctime)s %(message)s',level=logging.INFO)
cmd1 = "/home/pi/cam.sh"
cmd2 = "/home/pi/cam_aft.sh"
while True:
for i in range(1,15):
x = read_word_sensor(ACCEL_XOUT) / 16384.0 * 980.665
y = read_word_sensor(ACCEL_YOUT) / 16384.0 * 980.665
z = read_word_sensor(ACCEL_ZOUT) / 16384.0 * 980.665
u = math.sqrt(x**2 + y**2 + z**2) - 1071.0
v = v + u
sleep(0.02)
w = math.fabs(v / 10.0)
v = 0.0
if w > buffa :
buffa = w
logging.info(str(w))
if w > 400 :
mesg = '震度 7 : '+str(w)
logging.warning(mesg)
f = open('sindo.txt','w')
f.write(mesg)
f.close()
sleep(10)
subprocess.call(cmd1,shell=True)
subprocess.Popen(cmd2,shell=True)
elif w > 250 :
mesg = '震度 6 : '+str(w)
logging.warning(mesg)
f = open('sindo.txt','w')
f.write(mesg)
f.close()
sleep(10)
subprocess.call(cmd1,shell=True)
subprocess.Popen(cmd2,shell=True)
elif w > 80 :
logging.warning('震度 5 : '+str(w))
elif w > 30 :
logging.warning('震度 4 : '+str(w))
sleep(0.01)
◆ cam.sh
#!/bin/bash
fswebcam -r 640x480 /home/pi/cap.jpg
./deg.sh >> /home/pi/sindo.txt
mutt -s "Warning!" 「送信先メールアドレス」 -a /home/pi/cap.jpg < /home/pi/sindo.txt
◆ cam_aft.sh
#!/bin/bash
for i in `seq 1 10`
do
fswebcam -r 640x480 /home/pi/cap.jpg
./deg.sh >> /home/pi/sindo.txt
mutt -s "Warning!" arkouji@gmail.com -a /home/pi/cap.jpg < /home/pi/sindo.txt
sleep 60
done
◆ deg.sh
NOWTEMP=$((`i2cget -y 1 0x48 0x00 w | sed -e 's/0x\(..\)\(..\)/0x\2\1/g'` >> 5)) && date "+%Y/%m/%d - %H:%M:%S" && echo "$NOWTEMP * 0.125 - 4.0" | bc
今回参考にしたのは以下のサイト。
Raspberry Pi で温度センサ LM75B を使う : 或る阿呆の記
まず、震度6以上の揺れ(250 gal以上)を感知したら、部屋の様子を撮影した写真を送信するのは前回と一緒(”cam.sh”で実行)。
続いて”cam_aft.sh”をバックグラウンド実行して、1分おきに指定回数メールを送信(今回のコードは10分間、10回)。
その際、気温のデータも記載します(気温を取得するのは”deg.sh”)。
これらのコードをすべて”/home/pi”に配置して実行します。
sudo python sindo.sh &
コードがバラバラで汚くてすいません。すべて一つのコードで書けるといいんですが、1分おきの監視プログラムをメインプログラムである”sindo.py”とは別のスレッドで動かしたかっただけです。
なお、”sindo.py”でこれらのシェルスクリプトを呼び出すのに、今回は”subprocess”を使ってます。
バックグラウンド実行を記載できる上に、今後のpythonの外部コード呼び出しはこちらがサポートされるそうです。
ここで、またまた俺的震度7地震をRaspberry Pi B+に負荷して動作チェック。
メール来てます。しかも”監視モード”スクリプトからのメールです。
こんな感じに、写真と気温が表示されてます。
メールの回数ごとに気温の数値がどんどん足されて(上の画像では”30.375”という数字)いきますが、これは温度の急激な変化がないかを確認するためにあえてこんな記述をしてます。
(このテスト後にちょっとプログラムをいじってまして、上のコードでは日時と補正した気温[なぜかこのセンサーは4度高めに出るため、4を引いてます]を表示するように変えてます)
部屋の中に侵入者がいれば、何らかの人影が写るはずです。
また火災が起こっていたなら、急激な温度上昇が確認できるはず。
ただし停電が起これば、その時点で停止。
Raspberry Pi用UPSをつけることも考えましたが、どのみち停電が起こるような状況なら自宅のネット回線も不通になるし、あまり意味はないかなぁと考えてあえてそのままにしてます。
UPSとIoT用LTE回線を与えてやれば、もうちょっと堅牢なシステムになるかもしれません。
とりあえず我が家では地デジ録画 兼 地震監視サーバーとして稼働してます。
なお、今回のコードでは監視モードの持続時間は10分間ですけど、もっと長くしたい場合は”cam_aft.sh”の中のfor文の”seq 1 10”の10の数値を増やす(3時間動かしたければ180とする)、写真撮影のタイミングを短くしたければ、このコードのsleepの値を小さくする(30秒おきなら”sleep 30”)といいでしょう。
できればこの地震計用Raspberry Piとカメラを壁などに固定しておきたいですね。
今はこんな置き方。赤外線レーダーのRaspberry Pi 2、最近買ったむき出しのRaspberry Pi 3とともに、ただ転がしてるだけです。カメラなんて、大地震の際は吹っ飛んでしまいそう。
現在固定方法を思案中です。地震対策のAV機器用両面テープ当たりで固定しようかな?などと考えてます。
« 熊本地震被災者応援ブックを内閣府が配布中 | トップページ | ディスプレイ内蔵コーヒーテーブルで一味違う演出が可能に!? »
「科学・技術」カテゴリの記事
- 円形計算尺を購入してみた(2024.05.19)
- 東京ビッグサイトへ行ってきました(2024.04.25)
- 月着陸実証機SLIMが再起動!(2024.01.29)
- JAXAより小型月着陸実証機「SLIM」の写真公開(撮影はSORA-Q)(2024.01.26)
- 大垣の実家に帰省したついでに「ソフトピアジャパン」に行ってきた(2023.08.14)
「Raspberry Pi・Arduino・電子工作」カテゴリの記事
- 名古屋 大須へ行ってきました(2024.04.28)
- Raspberry Pi 5用電源購入(2024.04.19)
- Interface 2024年5月号はRaspberry Pi 5特集(2024.03.26)
- Raspberry Pi 5とPCがつながらなかった理由は「プライバシーセパレーター機能」のせいでした(2024.03.12)
- Raspberry Pi 5に日本語LLM(ELYZA-Japanese-Llama-2-7b-fast-Instruct)を入れてみた(2024.03.10)
コメント
« 熊本地震被災者応援ブックを内閣府が配布中 | トップページ | ディスプレイ内蔵コーヒーテーブルで一味違う演出が可能に!? »
初めて連絡させていただきます
㈱STE 佐藤と申します。
大変興味深く拝見しております。
私は地震計測の仕事をしていますが、電子機器のソフトハード製作は素人です。
地震計測には、高額な機器及びiPod touch/i地震等を使っています。
iPod touch/i地震では、測定項目を追加できないので、試作するしかないかと
考えています。
いろいろ調べていて、arkoujiさんのサイトに到達しました。
Raspberry Pi x加速度センサーx温度xカメラxGPSを考えています。
突然で恐縮ですが、有償で設計・製作の見積を頂けないでしょうか。
ケーシング等は寸法関係が不明ですので、別途でも構いません。
製作数量は、種々の検証が必要と思いますので、取り敢えず 1台作ってみたいと思います。
以上宜しくお願い致します。
投稿: sato | 2016年11月 8日 (火) 17時31分
こんにちは、satoさん。
私も電子工作は素人、プログラミングも趣味でやってる程度でして、とても製品化できるほどの何かを持ってるわけではありません。すいません(本業はCAEです)。
この地震計も欠点だらけでして、上の記事にもある通り震度測定に使うには誤差が大きすぎる、そもそも厳密な震度測定をしていない(昔の簡易基準で判定)という状態です。
多分厳密な震度測定をしようとすると、時々データをとりこぼすRaspberry Piではダメで、Arduinoなどの方が向いてるんじゃないかなあと思ってるところです。
投稿: arkouji | 2016年11月 9日 (水) 04時31分