2015年02月17日

mbed と Parse で作る高齢者世帯安否確認システム

はてなブックマークに登録

2017-01-30 追記:
2017年1月末の Parse.com サービス終了に伴い以下の記事を追加しました。他サービスへの移行に関する情報等を記述しています。

さよなら Parse - 当ブログ

個人的に、高齢者世帯の安否を日常的に静かに確認できる仕組みがほしいと思っていました。要件として想定していたのは次の二点。現地にはインターネットへの接続環境が整っています。

  • 現地での被監視感や拘束感が希薄であること
  • 情報を自分でハンドリングできること
実現方法を考えると案外悩ましく、よくあるリモートカメラの類は手軽な反面 日常を生々しく監視するようでNG、自作の選択肢はあれど PC をフロントエンドとすることには何かと牛刀感があり気が進まず、また、各社様による優れたサービスの数々にも関心はあるものの恒常的に費用がかかることは当然としても自分が個人的に望む柔軟性・拡張性に適合する仕組みをなかなか見出すことができず導入には至らずにいました。
以前から頭の中でときどきそういうループを巡らせていたのですが、先日ふとマイコンとクラウドサービスを組み合わせて利用することを思いつきました。折からの「モノのインターネット(Internet of Things : IoT)」の潮流にも合致するためその視点からも面白そうです。

マイコン方面には今までほとんど馴染みがなかったのですが、情報収集を経て選択した mbed マイコンボードを利用することでフロントエンドの装置本体もそれを動かすためのプログラムも手早く作ることができました。バックエンドにはメジャーな BaaS のひとつである Parse を利用しサーバ側処理もシンプルに仕上げています。必要な費用は装置材料分のおよそ 1万円程度(2015年2月現在)のみでクラウドサービスは手元では無料枠内でゆったりと使えており、今後もいろいろ手を加えていくつもりです。なかなか便利なものになったので現時点での内容と構成を紹介します。離れて暮らす家族を気に懸けておられる方のご参考となれば幸いです。

全体像を図に示します。

動作の様子

装置の動きとクラウドサービスとの連携の様子を以下の動画に収めています。

動画1:装置が人間を検知すると Parse サーバへデータを送出

動画の内容
(無音 1分15秒)

  1. 装置へ給電 〜 初期化が完了するまで全 LED が点滅
  2. 赤外線センサが人を検知し赤 LED が点灯 〜 Parse サーバへ検知情報を送出
  3. PC 上のブラウザでは Parse アプリ「Anpi」の「Detected」 クラス(テーブル)のデータを表示中
  4. 表示を更新して新しいデータが追加されていることを確認
  5. Gmail で前日受信したレポートメール(人を検知した日付時刻と気温情報の直近の一覧)を表示してみる
  6. 最後にふたたび装置の赤外線センサに手をかざして反応を試してみる

動画2:装置の「緊急ボタン」が長押しされるとその場でメール通知

動画の内容
環境音+ブザー音あり 30秒)

  1. 緊急ボタンを押すと装置の LED が反応 〜 短時間の押下はそのまま受け流される
  2. 2秒程度長押しすると操作者にブザーで長押しの受け入れを伝え Parse サーバへ緊急ボタン押下を通知
  3. ボタン押下がメールで通知される

mbed について

ARM 社 によって開発された mbed は ARM マイコン搭載のコンピュータボードと専用の開発環境によって構成され「高速プロトタイピングツール」のキャッチフレーズの通りシンプルな手順で手早く扱うことができるように設計されています。現在さまざまな mbed ボードが販売されていますが、今回選んだのはもっとも代表的な「mbed NXP LPC1768」です。Cortex-M3 プロセッサを載せたこの単三電池二本分ほどの大きさのボードには多様な入出力ポートに加えイーサネット用コントローラまでもが実装されています。

初めて mbed に触れる場合は mbed.org へのユーザ登録が必要です。製品に同梱の USB ケーブルで mbed LPC1768 を PC へ接続するとボード上のストレージがマウントされます。ストレージ上の「MBED.HTM」をブラウザへロードするとユーザ登録画面へ遷移するのでそこへ必要な情報を投入します。登録が完了すると mbed のオンラインコンパイラをブラウザから利用できるようになります。C, C++ でコードを記述し「Compile」ボタンを押すとサーバ側でビルドが行われ、そこで生成された実行形式をダウンロード 〜 mbed の USB ストレージへコピーしてボードのリセットボタンを押下するとプログラムが実行されます。そこから先は、コードを編集したり既存のライブラリをインポートしたり mbed ボードを装着した回路に手を加えたり、、といった手順の繰り返しです。作法どおり最初はまずあれこれサンプルコードをビルドして動かしたりそれに手を加えて試したりということから始めました。なお、mbed ボードのコントローラは USB 仮想シリアルポート経由でホスト PC とのシリアル通信をサポートしており PC 側でターミナルアプリを使えばデバッグにも便利です。

mbed の世界ではコミュニティが発展しており様々な資産が共有されています。わかり易く有用な記事・文書も数多く存在するのでとても参考になります。

装置について

製作した装置の材料と組み立て方、制御用プログラムについて説明します。

材料

(※価格はいずれも2015年1月時点の税込額)

  • マイコンボード mbed NXP LPC1768 ¥5,800 秋月電子通商
  • 焦電型赤外線センサーモジュール (SB612A) ¥600 秋月電子通商
  • LAN コネクタ (mbed用イーサネット接続キット) ¥514 スイッチサイエンス
  • IC 温度センサ (LM61BIZ) ¥200 (4個入) 秋月電子通商
  • 電子ブザー (PKB24SPCH3601) ¥150 秋月電子通商  
    ※不要なら省略可
  • ブレッドボード (EIC-801) ¥257 スイッチサイエンス
  • ジャンプワイヤ (固いオス〜オス)  ¥257 (70本入) スイッチサイエンス
  • ジャンプワイヤ (柔らかいオス〜メス) ¥691 (50本入) スイッチサイエンス
  • 赤色 LED ¥350 (100個入) 秋月電子通商  
    ※不要ならカーボン抵抗とともに省略可
  • 75 Ω カーボン抵抗 ¥100 (100本入) 秋月電子通商  
    ※不要なら LED とともに省略可
  • 押しボタン・ピンコネクタ・導線 近所のホームセンターで 5〜600 円くらいで購入 
    ※不要なら省略可
  • 適当なケース 廃物利用
※上記参考価格計 ¥9,519
※LAN ケーブルと DC 5V USB-Aタイプ の AC アダプタは手持ちのものを利用

組み立て

LAN コネクタである「mbed用イーサネット接続キット」の組み立てのみハンダづけが必要ですが、その他の配線・パーツの取り回しはすべてブレッドボード上で行うため材料が揃っていれば装置の組み立ては簡単です。写真のようにブレッドボード上の配線には固いジャンプワイヤ、センサやブザーの接続にはオス−メスの柔らかいジャンプワイヤを使いました。実体配線図をあわせて掲載します。(クリックで拡大)

むき出しのままでは扱いにくいので前に買った PC 用パーツの外箱を再利用して簡単なケースを用意しました。素材が薄いプラスチックと紙なので加工しやすく耐久性もそれなりにありそうです。

焦電型赤外線センサモジュールは白いレンズの部分を露出しないと機能しないためサイズに合わせてケースに切り込みを入れました。測定誤差軽減のために IC 温度センサも外に引き出しています。外観を不透明にしているのは設置先での存在感を抑えるためで、LED は動作確認用と割り切りトラブルが起こった場合のみ点滅状態を見ることにしています。

プログラム

上記の装置構成にあわせて作成した mbed LPC1768 用プログラムを以下の場所で公開しています。

Parse サーバ上の対向処理との連携のために main.cpp の冒頭に当該 Parse アプリケーションの ID と REST API キーを記述する形にしています。公開したソースでは伏字にしていますが、後述の手順で当該 Parse アプリのコピーを作成しその ID とキーをここに記述してリビルドすれば実際に連携を試すことができます。Parse 上の所定の ID とキーは Parse へのログイン後、[Dashboard] - [(アプリ名)] - [Settings] - [Keys] から確認できます。

装置には識別用に任意の名前をつけることができます。名前は mbed ボードの USB ストレージ上の "id.txt" ファイルに記述します。この名前は装置が人を検知した際に Parse サーバへ送出する情報のひとつとして扱われます。

装置が人を検知するたびに Parse サーバへデータを送るのは不経済なので、データ送出の最短間隔を以下の定義で指定しています。
#define HTTPS_REQUEST_INTERVAL 1800 // 30分

クラウドサービスについて

装置の対向処理用に用意した Parse 用のサーバコードと、そのコードからメール送信のために呼び出している Mailgun サービスについて説明します。

Mailgun の準備

Mailgun は多くのプログラミング言語に対応したクラウドメールサービスです。REST API セットに加え Python, Ruby, Java, C#, PHP 用のライブラリが公開されており、自作のコードで簡単にメール送信をハンドリングできる便利なサービスなので今回の話題とは無関係にアカウントを作って試してみるのも良いでしょう。サインアップ時にクレジットカード情報の入力は不要です。

http://www.mailgun.com/

Mailgun にアカウントを作成すると一件の「Sandbox Domain」が割り当てられます。この Mailgun Subdomain はテスト用とされておりメール送信は 300件/日までという制約がありますが、自前のドメインがあればそれを登録することでこの制約はなくなります。なお、無料枠はこの記事の時点で 10,000件/月までとなっています。[詳細]
ちなみに手元では今のところ一日 300件もメールを送信できればまず十分なのでひとまず Sandbox Domain をそのまま使っています。

Parse からの Mailgun API 呼び出しにおいては Mailgun アカウントに紐付けられた「API Key」を使用します。Parse は Mailgun と公式に連携しているためごくシンプルなコード記述で Mailgun API を呼び出すことができます。

Parse の準備

Parse は Facebook 傘下の Parse.com が開発・運営する現在もっともメジャーな BaaS(Backend as a Service) のひとつです。ユーザ管理・データストア・スマホへのプッシュ通知・アクセス解析・ホスティング・SNS 連携・位置情報連携など多くの機能から構成されており対象プラットフォーム・言語も広範です。無料枠も広く 30リクエスト/秒まで、プッシュ通知 100万件/月までは無料、また、アクセス解析機能も自由に利用できます。[詳細]

https://parse.com/

一般に BaaS の主な目的はアプリケーションの対向サーバ側機能を代替・補完することにあり、サーバの管理運用やサーバ側コード開発に踏み込むコストを抑制しアプリ本体の開発に注力可能となることが利用者にとってのメリットですが、Parse にはサーバ上でユーザコードを実行することのできる「Cloud Code」というしくみが用意されています。これを利用することで標準の機能のみではカバーできない固有の要件に対応できる余地が大きくなり、また、フロントエンドのアプリケーションを一切伴わず所定のサーバコードのみを Parse サーバ上で実行するといった使い方も可能となります。今回作った装置は Parse サーバ上に設置した自作コードをそのまま呼び出して必要な処理を行っています。このように目的に応じて柔軟に利用できることが Parse の魅力のひとつと言ってよいでしょう。

Parse サーバ用に作成したコードを https://github.com/mkttanabe/Anpi で公開しています。このコードを自分の Parse アカウント環境で使用する手順を以下に記述します。

1. 「Anpi」アプリと「Detected」クラスの作成

Parse へログイン後、[Dashboard] - [Create a new App] をクリックして「Anpi」という名前のアプリを作成し同アプリの [Core] へ移動

[Dashboard] - [Anpi] - [Core] - [Data] の [+ Add Class] をクリックして Custom タイプの「Detected」クラスを作成
※ここでいう「クラス」とは Parse 用語であり、「テーブル」の概念とほぼ同じものです

[+Col] ボタンをクリックして Detected クラスに次の各カラムを追加。カラム並びは任意に調整可

  • 「posted」Date 型
  • 「deviceId」String 型
  • 「deviceAddress」String 型
  • 「temperature」Number 型

装置から受信した人検知情報はこの Detected クラスのデータとして保存されます。

2. Parse コマンドラインツールの導入と Cloud Code のセットアップ

Parse 用の開発を行う PC には専用のコマンドラインツールの設置が必要です。公式ドキュメント「Cloud Codeとは」の冒頭の説明にそって開発環境へツールをインストールします。インストールが終わったら任意の開発用フォルダへ移動し「parse new」コマンドで「Anpi」アプリ用 Cloud Code の雛形を生成します。

$ parse new Anpi
Email: your@mail.com
Password:
1:Anpi
Select an App: 1

github.com/mkttanabe/Anpi 下の Parse/Anpi/cloud/main.js の内容を開発用フォルダ下の Anpi/cloud/main.js へ上書きし、冒頭の下記の箇所を自分の Mailgun ドメインと API Key、送信先とするメールアドレスで書き換えます。

var MAILGUN_DOMAIN = 'sandboxXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.mailgun.org';
var MAILGUN_KEY    = 'key-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
var MAILGUN_TO     = 'Makoto Tanabe <XXXXXXXXXXXXX@XXXXX.XXXX>';
var MAILGUN_FROM   = 'Safety Alert <postmaster@' + MAILGUN_DOMAIN + '>';

開発用フォルダ下の Anpi/ へ移動しそこから「parse deploy」コマンドを実行すると配下の各ファイルが Parse サーバへ転送されます。

$ cd Anpi
$ parse deploy
Uploading source files
Finished uploading files
New release is named v1

Parse サーバへ転送したコードの動作は 公式ドキュメント「Cloud Codeとは] - [はじめに] - [シンプルな関数] に記述された方法で確認できます。

3. ジョブの登録

上の手順で deploy した main.js には Detected クラス上の直近 30件のデータをメールでレポートするためのジョブ用関数「report」が含まれています。 ジョブの登録・編集・削除は [Dashboard] - [Anpi] - [Core] - [Jobs] から行います。図の UI から任意の内容で設定可能です。

※無料枠の Parse アカウントでは複数のジョブを同時に実行することはできません

以上の手順・設定で、今回作成した mbed ベースの装置本体と各クラウドサービスが連携して稼動します。アイディア次第で応用も可能でしょう。こういう仕組みを低コストで自作できる時代になりました。


(tanabe)
klab_gijutsu2 at 07:54│Comments(0)TrackBack(0)IoT | cloud

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント