できること

ラズパイでスマートホームを実現しよう!【第4回】

カメラをつけて、お部屋のチェックなど便利に使おう!

 

第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める
第2回: 独自のウェイクワードでお部屋をチェックする
第3回: 声でリモコンを操作して便利に使う

 

こんにちは、ヨシケンです!
ラズパイでスマートホーム化の第4回。これまでラズパイを使って、声による起動、部屋の温湿度チェック、そしてリモコン機器の操作を行ってきました。

今回はカメラを付けて、部屋のチェックをしたり、お子さんの帰宅を知らせたりするなど、画像を使った機能を付けましょう。(左側の丸い窓にカメラを設置しています。)

19-1

また、「おはよう!」や「ただいま!」などのシンプルな挨拶で、家の中の事を自動化する仕組みも作って、スマートホームの完成です!
tadaima

今回の記事で必要な物一覧

・Raspberry Pi 3B+ (最新版のラズパイ本体)
- Raspberry Pi 3B+

・小型USBマイク 
小型USBマイク

・小型スピーカー 
小型スピーカー


・パイ・カメラ

(ラズパイ公式カメラです。これと同形状で夜間撮影が可能なPiNoIRカメラもあります。)
パイカメラ

・温湿度センサ
sensor

・赤外線LED SIR-34ST3F
image30

・赤外線拡散キャップ
image31

・赤外線受光モジュール
I-04659

・小型バッテリー(小型ならどんなものでも構いません)
image9

・ミニブレッドボード
breadboard

・LED、抵抗やケーブル類
・(100円ショップなどで手に入る)木のケースなど装飾部品

 

今回の記事の流れ

1.カメラをセットアップして写真撮影
2.写真をLINEに添付、送付
3.スマートホーム・デバイスにカメラを組み込む
4.音声と連携させて、室内で便利に使う
5.まとめ

 

1.カメラをセットアップして写真撮影

まずラズパイにカメラをセットしましょう。ラズパイの中ほどにあるカメラ端子の白いフックを引き上げ、ケーブルを差して、フックを固定します。
右写真のように黒い端子を上の向きにすると、そのままで上下正しく撮る事ができます。(オプションで写真の向きなどを変更する事もできます)

19-3

smartフォルダ下に、imageという写真保存場所を作って、raspistillコマンドで試し撮りしてみます。(-w 480 -h 360は画像サイズの指定です。)

$ cd smart/$ sudo mkdir image

$ raspistill -w 480 -h 360 -o image.jpg

今後のpythonプログラムで使えるように、camera.pyプログラムを作って、imageフォルダ下に、日付時間毎の画像ファイルを保存するようにします。

[camera.py]

# -*- coding: utf-8 -*-
import subprocess, os, sys, re
from datetime import datetime
import time
def camera():
now = datetime.now()
dir_name = now.strftime('%Y%m%d')
dir_path = '/home/pi/smart/image/' + dir_name + '/'
file_name= now.strftime('%H%M%S') + '.jpg'
fname = dir_path + file_name
try:
os.mkdir(dir_path)
except OSError:
print('Date dir already exists')
os.system('raspistill -w 480 -h 360 -o ' + fname)
return fname
def main(image=""):
if image == "":
fname = camera()
else:
fname = image
  print(fname)
if __name__ == '__main__':
main()
view raw camera.py hosted with ❤ by GitHub

2.写真のLINEへの送付

写真を撮った時に、それをLINEに送って、遠隔からでも簡単にチェックできるようにします。
LINEのNotifyというAPIを使うと、ラズパイから簡単に写真付きメッセージを送る事ができます。

LINE Notifyのページから、LINEアカウントでセットアップをしてみて下さい。
以下画面が出たら、“トークンを発行する”ボタンを押します。

19-4

写真を送りたいグループなどを指定します。ここでは“スマートホーム“グループを作っています。
ここでNotify用のトークンを取得します。一度しか表示されないので、しっかりコピーしておいて下さいね。
またLINE側で、写真を送るグループにLINE Notifyというユーザを招待するのをお忘れなく。

19-5

それでは先ほどのカメラ機能と合わせてcamera_line.pyを作ります。取得したトークンを使ってLINE送付用のコマンドを追加(黄色部分)しています。

[camera_line.py]

# -*- coding: utf-8 -*-
def line(fname):
url = "https://notify-api.line.me/api/notify"
token = "xxx" #ここにトークンを入力
headers = {"Authorization" : "Bearer "+ token}
message = "写真を撮りました!"
payload = {"message" : message}
files = {"imageFile": open(fname, "rb")}
r = requests.post(url, headers = headers, params=payload, files=files)
print(r.text)
def main(image=""):
if image == "":
fname = camera()
else:
fname = image
   print(fname)
if fname:
line(fname)

camera_line.pyを流してみると、ラズパイで撮った写真が、このようにLINEに送られてきました。

19-6

3.スマートホーム・デバイスにカメラを組み込む

それでは、前回まで作っていたスマートホーム・デバイスに、カメラを組み込んでいきます。

19-7

ちょうど空いた穴から、レンズ部分を出し、固定します。
ケーブルが多くなってしまった部分は、赤い屋根でふたをしておきます。

19-8

これを部屋に置いておいて、定期的に室内写真を撮るようにしてみましょう。例えば、10時と15時に自動的に写真を撮って、LINE送付するようにします。

19-9

これにはcronという定期的にプログラムを実行する仕組みを利用します。
cronに必要なライブラリをインストールして、スタートさせます。

$ sudo apt-get install chkconfig$ sudo /etc/init.d/cron start

$ sudo chkconfig cron

19-10

cronエディタ(crontab -e)を実行し、その一番最後に以下2つの実行プログラムを記述します。(この場合、毎日10時と15時に実行)
その後リスト(-l)でcronが正常に登録されているか確認してください。

$ crontab -e# 一番最後にこの二行を追加
00 10 * * * python /home/pi/smart/camera_line.py
00 15 * * * python /home/pi/smart/camera_line.py$ crontab -l

19-12
またcronから正常にプログラムが動いているか確認する為、cronのログを残すようにします。
rsyslog.confという設定ファイルのうち、#cron.*となっている部分のコメントアウトを外せば、/var/log/cron.logとしてログファイルが書き込まれます。

$ sudo vi /etc/rsyslog.confcron.* /var/log/cron.log #コメントアウトを外す

$ sudo /etc/init.d/rsyslog restart

$ sudo cat /var/log/cron.log

[/etc/rsyslog.conf]
19-13

cronが動いているかどうかの確認
19-14

これで部屋に置いて電源を入れておくだけで、定期的に室内の写真をLINEに送ってきてくれるようになります。
19-16

4.音声と連動させて、室内で便利に使う

それでは最後に、発話内容に応じて、室内で便利に使えるように、これまで作った機能を連携させましょう。
以下例のような、普段の“おはよう”や“ただいま”などのあいさつに連動して、自動で動かす仕組みを作ってみてはどうでしょうか?

19-17

そのために、前回作成した日本語認識のJuliusのプログラムを改修して、julius_remote.pyプログラムを作りました。プログラムはリンクからダウンロードできるようになっています。
内容的には、以下の部分で、あいさつに応じて、返答のメッセージや、リモコンのコマンドを指定しています。

[julius_remote.pyの一部]

if u'おはよう' in word:
msg = 'おはようございます!今は' + datetimestr + 'です!'
#device = "light"
command= ["tv", "tvon"]
elif u'いってきます' in word:
msg = 'いってらっしゃい!今日はきっといい事ありますよ!'
command= ["light", "loff"]
elif u'ただいま' in word:
msg = 'おかえりなさい!おつかれさまでした!'
command = ["tv", "tvon"]
elif u'おやすみ' in word:
msg = 'おやすみなさい!良い夢を!'
command= ["light", "loff"]
elif u'テレビオン' in word:
msg = 'テレビを付けます!'
command = ["tv", "tvon"]
elif u'加湿器オン' in word:
msg = '加湿器を付けます!'
command = ["humid", "hon"]
elif u'さよなら' in word or u'バイバイ' in word:
msg = 'また話しかけてね!'

以下の部分で、コマンドに応じて赤外線送信や、室温のチェック、写真、LINE送付などを定義しています。取り入れたい機能に応じて、プログラムの記述を変えてみて下さい。

[julius_remote.pyの一部]

args = ['irsend', '-#', '1', 'SEND_ONCE', command[0], command[1]]
try:
led_blink("red",1)
print(msg)
os.system(aquest_dir + msg + ' | aplay')
os.system('python ' + bme_command)
os.system('python ' + camera_command)
cam_msg = '写真を撮ってラインに送りました!'
os.system(aquest_dir + cam_msg + ' | aplay')
subprocess.Popen(args)
print(command)
led_blink("green",3)
except OSError:
print('command not found.')

また室内の温湿度を測って、その結果に応じて赤外線を操るために、bme.pyを以下のように追加、修正します。このプログラムは、bme_remote.pyとして、こちらに保存しています。

[bme_remote.pyの一部]

if temp > 30:
room = "暑くないですか?"
command = ["air", "cool"]
led_blink("red", 5)
elif temp < 15:
room = "寒いですね!"
command = ["air", "warm"]
led_blink("red", 4)
elif hum > 70:
room = "蒸し蒸ししますねー"
command = ["air", "dry"]
led_blink("red", 3)
elif hum < 50:
room = "乾燥してますね!"
command = ["humid", "hon"]
led_blink("red", 2)
elif press < 1000:
room = "低気圧ですね"
led_blink("red", 1)
else:
room = "快適です!"
led_blink("green", 3)
if room:
print room
os.system(aquest_dir + "AquesTalkPi " + room + " | aplay")
print command
args = ['irsend', '-#', '1', 'SEND_ONCE', command[0], command[1]]
subprocess.Popen(args)

これらのプログラムができたら、スマートホーム・デバイスを室内の好きなところに置いてください。赤外線機器の近くの方がリモコンの効きは良いと思います。
19-18

それではこのjulius_remote.pyプログラムを実行するか、以前の記事を見て自動実行プログラムにして、走らせます。

さあ、まずは「おはよう!」と挨拶してみましょう。
この動画のように、「おはようございます!」の返答と共に、室温などを測って、リモコン操作してくれると思います。

また、「いってきます!」や「ただいま!」のあいさつで、スナップ写真を撮ってくれています。
特に家に帰ってきた子どもの写真がLINEに送られてくると、親御さんは安心ですし、ほっこり和むこと請け合いですね!
19-19

これ以外にも第2回で扱ったSnowboyで「ねぇ、お部屋チェック!」などのウェイクワードを登録し、こちらのプログラムを使えば、似たような操作が可能です。
[wake_remote.pyの一部]

detector = snowboydecoder.HotwordDetector(models, sensitivity=sensitivity)
callbacks = [lambda: camera_line.main(),
lambda: bme_remote.main()]
print(“「ねぇ、お部屋チェック!」や「ねぇ、お部屋測って!」などウェイクワードを発話して下さい。Ctrl+Cで終了します。”)

ぜひ色々組み合わせて、ご自分の部屋や使い方にあった機能を付け加えてみて下さい!

5.まとめ

ラズパイでスマートホーム化として、カメラをつないで室内をチェックできるようにしました。
合わせてLINEと連携させる事により、離れた所からでも家がチェックできるようになりました。

最後に、これまで作った温湿度センサ、赤外線リモコン、日本語音声認識などを組み合わせて、シンプルなあいさつから、様々な機能を呼び出せるようにしました。

一人暮らしの方は挨拶に応えてくれるだけでも嬉しいですし、お子さんがいる方は、帰宅時などのチェックができて、安心ですね。画像解析機能を活用すれば、不審者検知カメラや、ペット監視にも使えるかもしれません。

それではこれからも、ラズパイと、センサ、カメラ、音声機能などを使って、家の中を便利に、スマートホーム化していってください!

(ヨシケン)

 

今回の連載の流れ

第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める
第2回: 独自のウェイクワードでお部屋をチェックする
第3回: 声でリモコンを操作して便利に使う
第4回:カメラをつけて、お部屋のチェックなど便利に使おう!(今回)

deviceplus_vol3_cta_580x223_ver2
アバター画像

普通の会社に勤めるサラリーマンですが、モノ作りが好きな週末メイカーで、電子書籍MESHBOOKを出したり、ブログを書いたりしています!

http://blog.ktrips.net

学生ロボコン2019出場ロボット解剖計画