[ホームオートメーション部門 参考記事] ラズパイ×カメラ×センサーで、超簡単にIoT作ってみた

転載元:ラズパイ×カメラ×センサーで、超簡単にIoT作ってみた(2015年11月11日掲載)
文● 船田戦闘機
週刊アスキー

ph11_480x
ドアセンサーを作ってみる。ドアが開くとセンサー一体型の無線タグが反応し、Raspberry Piへデータを送信。撮影とアップロードが行なわれる

 前回の記事で、HEMS道場のアイデアジェネレーターについて説明した。快適IoTコンテストのアイデアジェネレーター部門に応募する人は着々と準備を進めていることと思う。

 今回は「WebAPIもいいけど、ぼく/わたしはハードウェアを作りたい」と思っている自作ホームオートメーション部門の応募希望者に向けて、情報共有を図りたい。

IoT=ワイヤレス・センサー・ネットワーク

 IoTはInternet of Things(モノのインターネット)の略だが、狭義のIoTはインターネットにつながっているセンサーのネットワークと言ってよいだろう。ネットワークが無線か有線かは問われないが、散在する大小さまざまな「モノ」が対象であることから、無線のほうが好都合なのは明らかだ。現在のIoTに対する注目度アップの背景には、低価格で使いやすい無線通信モジュールの普及があると思われる。

 この記事では、筆者が今もっとも簡単に使えると考える無線通信モジュールの中からひとつを取り上げて、電子工作やハードウェアプロトタイピングに馴染みのない人に応募を勧める。

 ただし自作ホームオートメーション部門のコンセプトは、下記のように無線通信モジュールの使用を前提としていない。

「電子工作やMaker的な工夫をした作品。ホームオートメーションだけでなく、IoT、フィジカルコンピューティング、ロボット、メディアアートなどもキーワードに着想してください」

 デバイスが有線でつながっていてもいいし、通信という概念を持たない作品でも大丈夫ということ。もし無線でインターネットにつなぎたい場合は参考にしてくださいね、と前置きして本題に入ろう。

無線通信モジュールは百花繚乱状態

 最初に質問。無線通信あるいはワイヤレスコミュニケーションと聞いて、まず思い浮かべるキーワードは何?

 3G、LTE、Wi-Fi、Bluetooth、BLE(Bluetooth Low Energy)あたりがまず一般的だろうか。使いやすいモジュールが揃ってきたおかげで、これらの規格を個人プロジェクトに取り入れることも簡単になってきた。筆者の独断と偏見に基づき、日本国内で使用できる代表的なモジュールを通信規格別にまとめたのが下の表だ。リンクしたサイトは日本語の情報が多いところを独断と偏見で選んだものなので、より詳しく知りたい人は他のサイトも参照してほしい。

国内で使用できる無線通信モジュールの例
通信規格 製品名 対象プラットフォーム
3G 3GPI Raspberry Pi
LTE LTEPI Raspberry Pi
Wi-Fi ESP-WROOM-02 汎用
Bluetooth BlueSMiRF Silver 汎用
BLE RedBearLab BLE Nano 汎用

 当初、この記事で使うモジュールを上の表からひとつ選ぶことにして「Wi-FiかBLEで……」と考えた。特に昨今は低価格Wi-Fiモジュール「ESP-WROOM-02」に勢いがある。でも熟慮の末、表には含まれていない製品をチョイスした。今回はそれを使ってみたい。

トワイライトニコニコで超簡単IoT

 東京コスモス電気が製造し、モノワイヤレスが販売サポートするIoT無線タグ「TWE-Lite-2525A(トワイライトニコニコ。以下ニコニコ)」は、ZigBeeという無線規格に準拠している。使用する周波数帯はWi-FiやBluetoothと同じ2.4GHzだ。知名度や普及度ではそれらに劣るZigBeeを使うメリットは、省電力制御や多デバイス環境での使いやすさにあった。「あった」と過去形なのは、BLEの登場やWi-Fi、3Gの低コスト化により、比較が難しくなってきたため。ここでニコニコを選んだのもZigBee準拠だからというより、TWE-Liteシリーズとニコニコ固有の特徴に期待してのことである。

 「アイデアはあるんだけど、工作してプロトタイプを作るのは不慣れです」という読者にもニコニコをおすすめする理由をまとめると、次のとおり。

・入手が容易(国内の取り扱い店が多く、秋葉原や日本橋でもすぐ見つかる)
 ※取り扱い店リストはこちら
・オールインワン設計(通信部だけでなくセンサーと電池ホルダーが一体になっているのですぐ使える)
・軽くて小さい
・電池が持つ(省電力モードなら1年以上)
・電波がよく飛ぶ(見通し約1km)
・アプリケーションソフトウェアが充実
・ツール、ドキュメント類が日本語

 もともとHEMS分野で使われることを想定して開発されたTWE-Liteシリーズは、初心者のプロトタイピングだけでなく経験豊富な開発者のビルディング・ブロックとしても活用されている。より専門的な解説が必要な場合は、モノワイヤレスのHEMSに関するドキュメントを参照してほしい。

ph01_480x
ニコニコはメイン基板、板状の専用アンテナ、電池ホルダーの3部品で構成され、ユーザーは自分で組み立てて使用する。メイン基板とアンテナはあらかじめ用意されている両面テープで貼り付ける。電池ホルダーはハンダ付けが必要だ。今回の作例でハンダごてを使うのはここだけ

ph02_480x
コイン電池(CR2032)1個で動作する。ユーザーが設定する送信の出力と頻度によって電池寿命は変化するが、低消費電力な使い方なら電池は1年以上もつ。CR2032は付属しないので、何個か購入しよう

加速度センサーのデータを見てみよう

 物体の動きを検知して写真を撮る仕組みを作ってみよう。センサーをドアに取り付ければ、その開け閉めに反応するドアカメラとなる。作例としてはありふれているが、IoTの基本的な技術要素が一通り含まれている。これからコンテスト応募作品のプロトタイピングを始める人の参考になるのではなかろうか。

 ニコニコには加速度センサーが内蔵されていて、部品を追加することなくファームウェアの設定変更だけでデータをほかのPCやスマホへ送信できる。

 ただ、設定は少しややこしいと感じるかもしれない。TWE-Lite-2525A単体での設定変更はできないので、シリアル通信モジュールの「TWE-Lite R(トワイライター)」 か「ToCoStick(トコスティック)」が必要だ。両方あると確実だが、どちらかひとつを買うとしたらトコスティックがお勧め。この記事でも、ニコニコが送信するデータをUSB端子に挿したトコスティックで受信しながら、動作チェックやプロトタイピングを進めていく。

ph03_480x
PCのUSB端子に接続して使うトコスティック。PC側からは通常のシリアルポートに見える。他のTWE-Liteモジュールとデータを無線でやりとりしたり、OTA(over the air)設定をする際に使用する。開発時の必需品といっていいだろう

ph04_480x
TWE-Lite Rは無線通信モジュールではなく、ソケットや電線を使ってTWE-Liteモジュールに接続し、設定変更やファームウェアのアップデートを行なうためのもの。あったほうがいい周辺機器だ

ph05_480x
今回は使用しないがTWE-Liteシリーズの標準的なモジュールである「TWE-Lite DIP」も紹介しておこう。アンテナがぴょこんと飛び出しているモデルや、外部アンテナを接続して使うモデルが用意されていて、使用目的に応じて最適な仕様を選べる

 ニコニコの設定をOTAで変更し、Androidスマホに専用アプリをインストールして動作チェックしてみよう。
 以下に手順の概略を示す。より詳しい操作方法はモノワイヤレスのサイト内にあるOTA設定に関するページと、ニコニコ用Androidアプリのページを参照してほしい。

動作チェックの手順

  1. ニコニコ用の最新ファームウェア一式をダウンロード
  2. 「TWE-Lite専用プログラマ」をダウンロード
  3. 2を使って1に含まれるトコスティック用OTAファームウェアをトコスティックに書き込む
  4. PC上のターミナルプログラム(「Tera Term」や「cu」など)を使ってトコスティックに接続し、Androidアプリのページに従ってOTA設定を行なう(この時点ではニコニコの電池を抜いておく)
  5. 設定対象のニコニコをトコスティックに近づけて、おもむろに電池を入れるとOTA設定が行なわれる
  6. 2を使って1に含まれる「親機アプリ」をトコスティックに書き込む
  7. Androidアプリのページに従ってトコスティックの設定を行なう
  8. Androidスマホに専用アプリ「TWE G-Monitor」をインストール。※ダウンロードはGoogle Playから
  9. USB OTG用のケーブルを使ってトコスティックをスマホに接続
  10. TWE G-Monitorを起動し、画面の指示に従う

 ちなみにTWE G-Monitorを使うには、USBホストに対応しているAndroid端末が必要だ。上記の10ステップにより、スマホの画面には次のような加速度変化のグラフが表示される。

ph06_480x
トコスティックをAndroidスマホに接続し、専用アプリTWE G-Monitorを起動したら、まず近いところでニコニコを振ってみよう

ph07_x480
このようにグラフが表示されたら、ニコニコとトコスティックは正しく動作している。3本の線は加速度センサーのXYZ軸に対応している。動きによってどのようなデータになるのかを把握しておこう。このグラフはニコニコのセンサー更新間隔(duration)を0.1秒(100ms)に設定した結果

 シリアルポート越しの設定作業は慣れるまで煩雑に感じるかもしれないが、加速度センサーのデータをここまで手軽に無線通信で取得し可視化できてしまうのは、ニコニコならではの魅力といえる。Androidアプリを作って応募したい人はTWE G-Monitorの代わりに独自のアプリを作ってみるのもいいだろう。

 ここでは、スマホはテストだけに使い、この先はRaspberry Pi(ラズベリーパイ。以下ラズパイ)を使用する。ラズパイにトコスティックを接続し、ニコニコが検知した「動き」をトリガーに撮影を行うアプリを作ってみよう。

ニコニコとトコスティックとラズパイでドアカメラ

 使用したラズパイはクアッドコアのRaspberry Pi2。シングルコアのB+でも問題ないだろう。USB端子が1つしかないA+の場合はトコスティックを接続すると全端子がふさがってしまい、ネットワーク接続を確保できない。ここでは撮った写真をサーバーにアップロードするところまで作るので、B+または2を前提に説明する。

ph08_480x
透明ケースに入れたRaspberry Pi2にカメラ、トコスティック、Wi-Fiモジュールを接続した。この状態で消費電力は約2.5W。モバイルバッテリーを電源にするとどこでもテストできて便利だ。ソフトウェア次第で複数のニコニコを同時にモニターすることもできるので、そのテストもした

ph09_480x
ラズパイ専用のカメラモジュールは「プリット ひっつき虫」でケースに固定した

ph10_480x
ひっつき虫を使うときは、念のため基板上の電子部品を避ける。角度を自在に調整できるので、カメラモジュールの固定にはもってこい。案外長持ちもする

 ラズパイのWi-Fi設定については触れないが、ググればすぐ参考になるページが見つかるだろう。これから始めるラズパイ上の作業はsshで他のコンピュータからログインして行なう。

 プログラミングを始める前に、ニコニコから送られてくる生データをラズパイ上で見てみよう。ターミナルソフトウエアにcuを使う例を示すので、まず次のコマンドでcuをインストールする。

sudo apt-get install cu

 トコスティックをUSBポートに接続した状態で次のようにすると、受信データが表示されるはずだ。

cu -l /dev/ttyUSB0 -s 115200

 ttyUSB0はUSBシリアルデバイスとして認識されたトコスティックを表し、115200はその通信レートだ。接続が成功すると、次のようなデータがぽつぽつと1秒ごとに表示される。

::ts=8380
::ts=8381

 「ts」はタイムスタンプの略。ここで先ほど設定したニコニコに電池を入れると、次のようなデータが連続的に表示されるだろう。

::rc=80000000:lq=57:ct=005E:ed=81015F52:id=0:ba=2970:a1=1288:a2=0658:x=0011:y=-018:z=-136

 このデータの読み方は、こちらのページで詳しく説明されている。『無線タグアプリで使ってみる』

 複数のニコニコがトコスティックの受信範囲にあるとき、それらからのデータを同時に受信できるが、データは混ざりあってしまう。仕分けるには「ed=」以下のMACアドレスを見るのが一番単純な方法だ。加速度センサーのデータはx=、y=、z=の部分で、これは先ほどのスマホアプリのグラフを思い出せば意味がとれるだろう。

Pythonスクリプトで処理する

 「cu」による生データ観察ができたら、「~.」(cuの終了コマンド)を入力してコマンドラインに戻ろう。そして、cuの代わりにPythonスクリプトを作ってトコスティックからデータを取得してみる。ファイル名はread2525.pyとでもしておこう。

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

import sys
import serial

ser1 = serial.Serial("/dev/ttyUSB0", 115200)

while 1:
  if ser1.inWaiting() > 0:
    sys.stdout.write(ser1.readline())
  sys.stdout.flush()

 この短いスクリプトを実行すると、トコスティックの出力がシェルに流れてくる。事前に

chmod 775 ./read2525.py

 として、実行フラグを立てておくと便利だ。次のようにすると、ファイルにデータを保存できる。

./read2525.py > log

 control+cでスクリプトを止め、lsすると、logというファイルができていて、そこにデータが保存されているはずだ。

 データの流れをスクリプトで捕らえられるようになった。次はそのデータを処理するスクリプトを作る。ここでいう処理とは、次のような内容だ。

・指定したニコニコからの「動き」を示すデータを検出する
・カメラモジュールを使って撮影し画像ファイルとして保存する
・そのファイルを指定したサーバにFTPでアップロードする

 できあがったPythonスクリプトを下記に示す。

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import os, sys, datetime, threading
from ftplib import FTP
import picamera  # apt-get install python-camera

sensorAddress = "81015F52"  # 対象TWE-LiteのMAC address
extension = ".jpg"
delay = 3  # second
messageCounter = 0

def takePicture():
    d = datetime.datetime.today()
    dt = d.strftime("%Y%m%d%H%M%S")

    with picamera.PiCamera() as camera:
        camera.resolution = (640, 480)
        camera.annotate_text_size = 20
        camera.annotate_text = dt
        camera.capture(dt + extension)
        print dt + extension 
    try:
        ftp = FTP("your.server""id""password")
        ftp.cwd("/home/your/space/")
        f = open(dt + extension, 'rb')
        command = "STOR " + dt + extension
        ftp.storbinary(command, f)  # put file
        f.close()
        ftp.quit()
    except Exception, e:
        print "ftp error: " + str(e)

while True:
    line = sys.stdin.readline()
    if "ed=" + sensorAddress  in line:
        messageCounter += 1
        if messageCounter % 2 == 1: # 1行おきに処理(動き始めだけを見る)
            print "acceleration detected. taking a picture..."
            t = threading.Timer(delay, takePicture)
            t.start()

 先ほどのスクリプトと比較すると少し長いが、それなりに複雑な処理をこれだけの行数で記述できてしまうのだから、ラズパイとPythonの組み合わせは強力だ。もっともエラー処理をほとんどしていないので、実用に供するためには例外的な状況に対処するコードがたくさん必要となるだろう。あくまでもサンプルプログラムとして見てほしい。

 スクリプト名がcamera.pyだとしたら、実行は次のようにする。

./read2525.py | ./camera.py

 おっとその前に、ラズパイのカメラ設定が有効になっていることを確認しよう。コマンドラインからは

sudo raspi-config

 として設定ツールを起動すれば調べることができる。設定変更もこのツールだ。それから、カメラコントロールのためのPythonライブラリも必要。

sudo apt-get install python-picamera

 とすればよいだろう。

 事前の設定はニコニコ側にも必要となる。スマホと組み合わせて使ったニコニコは加速度センサーのデータを一定間隔で送り続けるという設定だった。今度はドアの開閉という静止状態から突然発生する動きに反応したいので、もう一度OTA設定を行なって、動きの検出に適したモードに変更する。ニコニコの設定については次のページで詳しく説明されている。『IoT無線タグ設定の詳細説明』

 このページの「動作モードとパラメータの変更」に記載されている「モード8 Active/Inactive」がドアの開閉の検出に使えそうだ。準備が整ったら、2つのスクリプトを組み合わせて実行してみよう。

./read2525.py | ./camera.py

 こうするとread2525.pyが受信したデータはパイプ(|)で接続されたcamera.pyへ送られ処理される。

 camera.pyは指定したMACアドレスを持つニコニコからのデータだけに反応する。ニコニコ側で動作を検出するので、データが来たら観測対象が動いたと判断して(加速度センサーの値は無視して)撮影する。ただし間髪入れず撮ってしまうとドアしか写らない。撮りたいのはドアを開けて入ってきた何かなので、ウエイト(wait)を入れられるようにした。このあたりの処理は別スレッドで行なうようになっているので、ドアが頻繁に開け閉めされるような状況でもたぶん大丈夫だろう。

 サーバーへのアップロードにはFTPを使っているが、この部分は用途に応じた変更を加えてほしい。Pythonのサンプルコードはすぐに見つかるだろう。アイデアジェネレーターと連携させる場合は前回の記事の最後で紹介したスクリプトが参考になるかもしれない。

ph13_480x
ドアを開けて入ろうとするとパシャリ。実験成功。カメラ付きのラズパイは下駄箱の上にポンと置かれている。写真が横向きになってるのはカメラを90度回せば直るはず

「OpenCV(オープンソースコンピュータビジョン)」を使ってサンタ検出スクリプトを作ろうと思い、サンタの帽子とヒゲをつけてみたが、服もサンタにすべきだった。OpenCVはラズパイでも動作する画像処理ソフトウェア。顔認識も可能だ。時間切れでそこまで紹介できなかったが、個人プロジェクトとして取り組むつもり。

コンテストの締め切りは11月30日

 皆さんの発想の邪魔にならないよう「ドアカメラ」という地味な作例を示したわけだが、加速度センサーとカメラだけでできることは無数にありそうだ。センサーをどこに付けるかで意味合いが全然違ってくる。玄関ではなくトイレのドア、冷蔵庫の扉、ベランダの洗濯物、勝手に開けられたくない引き出し、猫ドア、家族の手首、赤ちゃんのぬいぐるみの中……。

 加速度以外のデータがほしい場合は、センサー選びから始めることになるだろう。TWE-Liteモジュールにセンサーを接続するときは、次のページが参考になる。『遠隔監視 – I2C入力』

 センサーによっては、ソフトウェア資産が豊富なArduinoを使うほうが楽な場合もある。そのあたりは臨機応変に考えよう。今回のドアカメラのように動きに反応して写真を撮るかわりに、モーターやソレノイドで別の動きを作り出したい場合(例えばノックすると自動的に鍵が外れるとか)は、ラズパイに駆動回路を付け加える必要がある。この場合も作例が豊富なArduinoの併用を検討するといいだろう。

 浮かんだアイデアを形あるものに変える方法を見つけるには、先例を検索するのが有効な手段だ。でも、調べ物ばかりしているとなかなかモノが出来上がらなかったりもする。実際に手を動かして、試しに作ってみることも同じくらい大事だ。

 コンテストの締め切りは11月30日。時間はまだあるので、手を動かして、モノを作りながら、アイデアを膨らませてほしい。

転載元:ラズパイ×カメラ×センサーで、超簡単にIoT作ってみた(2015年11月11日掲載)
文● 船田戦闘機
週刊アスキー

▼コンテストについての詳しい情報はこちらをご覧ください。
・快適IoT公式サイト
entry_01