« ”大垣城”へ行ってきました | トップページ | ある曲を流すと緊急地震速報が流れるラジオ!? »

2016年5月 3日 (火)

”Raspberry Pi 地震計”で揺れの大きいときは自宅の様子をメール送信できるようにしてみた

先日Raspberry Piで”地震計”作ってみたんですが、あれをもうちょっと実用的(?)に改良。

もし自宅にいないときに、熊本地震や東日本大震災のような地震が起きたら気になるのは自宅の様子のはず。

本棚が崩れてる程度なのか、深刻なダメージを受けているのかどうかくらいは早めに知りたくなります。

ということで、強烈な揺れを検知した直後に自宅の様子を撮影/送信してくれるように改良してみました。

加速度センサーmpu6050の設定などは、以下の記事がベース。

Raspberry Piで”地震計”作ってみた: EeePCの軌跡

まずRaspberry Piにカメラをつけます。

20160430_17_13_31

このUSBカメラを買ってきました。

これまで何個もUSBカメラを購入、捨てたつもりはないんですが、なぜか一つも見つかりません。おかげでまたまた無駄な出費を・・・とりあえず、一番安いwebカムでOKです。

カメラ撮影用コマンドをインストールします。今回”fswebcam”というのを使用。

sudo apt-get install fswebcam

撮影テストは以下のコマンドで実行。

fswebcam -r 640x480 test.jpg

”test.jpg”という画像ファイルができていれば成功。

ただし、撮影した画像が暗すぎる場合は、以下の記事を参考に露出時間をいじってみます。

RaspberryPiでWebカメラ - Qiita

私の場合、とりあえずデフォでOKでした。

続いて、画像ファイル付きメール送信できるようにします。

以前Apple WatchにZIP-FMのオンエアリストを通知させてみた(要Raspberry Pi): EeePCの軌跡の記事で使った”nullmailer”では画像ファイルを添付できなかったため、別の方法を模索していたら見つけたのは以下の記事。

Raspberry Pi | 撮った写真をgmailで送るための設定(sSMTPとMutt) – たぷん日記

こちらを参考に、メール環境構築と写真送付用のスクリプトを組みます。

まず、必要なソフトをインストール。

sudo apt-get install -y ssmtp mailutils mutt

sSMTPの設定ファイルを編集します。

vi /etc/ssmtp/ssmtp.conf

”root”と”mailhub”の2項目を編集。ここではGmailを想定してます。

root=(gmailのアカウント名)@gmail.com
mailhub=smtp.gmail.com:587

以前作ったRaspberry Pi用のメアドをそのまま使いました。専用のgmailアカウントを作っておいたほうがいいでしょう。

AuthUser=(gmailのアカウント名)@gmail.com
AuthPass=(gmailアカウントのパスワード)
UseSTARTTLS=YES

これでメール送信可能となるはずです。

以下の”cam.sh”というシェルスクリプトを作成。

#!/bin/bash
fswebcam -r 640x480 /home/pi/cap.jpg
mutt -s "Warning!" arkouji@gmail.com -a /home/pi/cap.jpg < /home/pi/sindo.txt

これを実行可能にしておきます。

chmod 777 cam.sh

前回作成した”sindo.py”を以下のように書き換えます。

# -*- coding: utf-8 -*-
#!/usr/bin/python

import smbus
import math
from time import sleep
import datetime
import logging
import commands

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

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)
       commands.getoutput("./cam.sh")
    elif w > 250 :
       mesg = '震度 6 : '+str(w)
       logging.warning(mesg)
       f = open('sindo.txt','w')
       f.write(mesg)
       f.close()
       sleep(10)
       commands.getoutput("./cam.sh")
    elif w > 80 :
       logging.warning('震度 5 : '+str(w))
    elif w > 30 :
       logging.warning('震度 4 : '+str(w))

    sleep(0.01)


これで”震度6”以上で写真撮影し、メール送信してくれます。

pythonコード中に同じ表記がだらだら出てきますが、突貫工事で作ったコード故、少々汚いです。すいません。

ところで、cam.shを実行する前に”sleep(10)”を入れております。これは、大揺れした直後に撮影したのでは意味がないと思い、若干タイムラグ(10秒)を入れております。

この10秒の間に停電・ネット切断・Raspberry Pi破損が起こればメール送信は不可。そのあたりはご了承ください。

さて、再びこのコードを実行します。

sudo python sindo.py &

ここで前回同様、俺的震度7をRaspberry Piに加えて(つまりRaspberry Piを思いきりゆすって)テストしてみました。

20160430_21_13_15

メール到着!成功です!!

あとは気になる場所に設置してやればOK。

揺れをなるべく正確に検知するため、壁や床などできるだけ固いところに固定するのがいいでしょう。

カメラ自体はどこでもいいですが、簡単に落下するようなところに置くとちゃんとした画像が撮れません。

地震直後すぐにインフラが寸断されなければ、とりあえず自宅の様子を撮影したメールが届くはずです。

とりあえず、自分の部屋にて稼働中。

これを作ってたら、さらに欲が出てきまして。

熊本地震でも東日本大震災でも地震直後の混乱に乗じて空き巣被害がおこってるそうですが。

この対策のため、今回の写真メール送信と同時に人感センサーを発動し、反応があればその写真も送信するという仕組み、作れないかなぁと。

もし家族が写っていれば安否の確認ができますし、見知らぬ人が写っていれば証拠写真になります。

さらに欲を言えば、無停電電源装置的なものをつけて、さらにLTE回線で送信する仕組みがあるとなおいいですよね。

もうちょっと発展させてみようかな、この仕組み。

Raspberry Pi3 Model B ボード&ケースセット (Element14版, Clear) -Physical Computing Lab

SODIAL(R) GY-521 MPU-60503軸ジャイロ 3軸加速度センサ

iBUFFALO マイク内蔵120万画素Webカメラ HD720p対応モデル グレー BSWHD06MGY

« ”大垣城”へ行ってきました | トップページ | ある曲を流すと緊急地震速報が流れるラジオ!? »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

地震の揺れをトリガーにして
写真付きメールって
トリガーの対象を変えれば
いろいろ使えますね。

春先には庭先の菜園に
ヒヨドリ等が来て菜っ葉類を喰い散らかしてましたから
そういう状況確認とか

自宅裏は県境でもある川がありますから
雨量計を作りそれをトリガーにして川の状況をメールするとか。

Webカメラが赤外線を撮れる(赤外線除去フィルターが付いてない)
のなら赤外線LEDを装備して畑や水田の夜間監視に使えるかな?
(監視してても猪などへの対処は難問ですが…(苦笑))

なんだか色々使えそうな気がします。

こんにちは、enuteaさん。

他にも大きな音をトリガーにするというのも可能です。実はそういうセンサーを買ったんですが、使わずにほったらかし。子供が騒いだら「うるさ〜い」って言い返してくれるガジェットを作ろうとしたんですけど、なんだか馬鹿らしくなって放置してます。

猫被害の対策として、Raspberry Piと距離計+ナーフを組み合わせた「猫撃退機」(弾は柔らかいので、あくまでも追っ払うだけです)も考えてるんですが、なかなか実行に移せませんね。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/510034/63560903

この記事へのトラックバック一覧です: ”Raspberry Pi 地震計”で揺れの大きいときは自宅の様子をメール送信できるようにしてみた:

« ”大垣城”へ行ってきました | トップページ | ある曲を流すと緊急地震速報が流れるラジオ!? »

当ブログ内検索

  • カスタム検索

スポンサード リンク

ブログ村

無料ブログはココログ