IoTが話題になっています。HummingBoardは、IoTのような用途に向いています。さっそくセンサーのデータをクラウドにあげてみることを検証してみます。サーバー側のソフトで集計をして、Webからのアクセスでそのデータをグラフにして表示をみたり、ある温度を超えるとMyThingsからお知らせが届くということを検証してみます。
今回はMyThings-IDCFクラウドのサービスを使います。クラウドサービスを提供するIDCFのサイトでは、「標準」の開発環境となるボードを用意していますが、HummingBoardでも同じことができることを見ていきます。
以前のコラムで、温度センサーの値をHummingBoardのI2Cポートから読み出し、HummingBoard内にWebサーバーを組み込んで、温度データをWeb上でグラフを表示することを紹介しています。この時は、HummingBoardをプライベートクラウドのように扱い、クライアントであるWebサーバーから直接読みだすような仕組みとしていたわけですが、今回は、データをIDCFのサーバーに一旦あげて、そのサーバーへクライアントからアクセスするようになるわけです。何故クラウドにデータを上げるといいか、というところがIoTの一番大事なところです。データとしてあげておくと、以前のコラムで紹介したようにグラフ表示としてしか情報を提供できないのに対し、クラウドからデータとして取ってこれれば、違うアプリケーションからそのデータが利用できるということです。それが、統計データとしてや、同様のデータを全国レベルで集計することもあり得ることでしょう。
今回の例では、IDCFが始めたばかりのサービスでもあり、すぐにインタフェースを含めて変更が入ることでしょう。なので、この記事もすぐに時代遅れになってしまうことでしょう。ですが今はこのアイデアを感じていただければ幸いです。
[温度センサーモジュール]
今回使用した温度センサーは「ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール」です。株式会社秋月電子通商から購入することができます。
◆主な仕様
・温度精度:±0.5℃@-40℃~+105℃(2.7V~3.6V)
±0.4℃@-40℃~+105℃(3.0V)
・温度分解能:0.0078℃(16ビット設定時)/0.0625℃(13ビット設定時)
・温度校正および温度補正、直線性補正等は不要
・動作/測定温度範囲: -55℃~+150℃
・電圧範囲:DC+2.7V~+5.5V
・I2C互換インターフェース
・消費電流(@VDD=3.3V、TA=+25℃)
ノーマル・モード:210μA(typ)
パワーセービング・モード(1サンプル/1秒):46μA(typ)
シャットダウン・モード:2μA(typ)
・基板サイズ:15×11ミリ
・基板上の入出力端子:4個(VDD,GND,SCL,SDA)
[配線]
HumminBoardとの接続表です。今回の実験では、前回までと同じGPIO 拡張ボードとブレッドボードを用いています。
GPIO Signal Comparison | ||||||||||
GPIO | Signal | pin# | HB Signal | Sensor-PIN | GPIO | Signal | pin# | HB Signal | Sensor-PIN | |
7 | CE1 | 26 | ECSPI2_SS1 | 17 | P0 | 11 | GPIO 73 | |||
8 | CE0 | 24 | ECSPI2_SS0 | 18 | P1 | 12 | GPIO 72 | |||
11 | SCLK | 23 | SPI_SCLK | 27(21) | P2 | 13 | GPIO 71 | |||
9 | MISO | 21 | SPI_MISO | 22 | P3 | 15 | GPIO 10 | |||
10 | MOSI | 19 | SPI_MOSI | 23 | P4 | 16 | GPIO 194* | |||
15 | RXD | 10 | UART RX | 24 | P5 | 18 | GPIO 195* | |||
14 | TXD | 8 | UART TX | 25 | P6 | 22 | GPIO 67 | |||
3(1) | SCL | 5 | I2C_SCL | CLOCK | 4 | P7 | 7 | GPIO 1 | ||
2(0) | SDA | 3 | I2C_SDA | DATA | GND | |||||
GND | 1 | GND | ||||||||
3.3V | 25 | VCC |
[OS]
HummingBoardのGPIOの検証に使っているDebianを用います。v2.6(2015年2月時点で最新)以降のものを使ってください。(SPIのバグフィックスが入っているので重要)
http://www.igorpecovnik.com/2014/08/19/cubox-i-hummingboard-debian-sd-image/
http://mirror.igorpecovnik.com/Cubox-i_Debian_2.6_wheezy_3.14.14.zip
Debian v2.6 / 5.2.2015
Kernel 3.14.14
Fixed bug in SPI. Display works now
XBMC upgrade ready / tested.
温度センサーが認識できるかチェックします
|
下のように、ADT7410のアドレスが 0x48 し表示されればOKです。
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- |
温度を計測するために、下のようなPythonのファイルを作成します
/root/adt7410ディレクトリを生成して、ファイル名はadt7410.pyでセーブしてください。
(母艦のPCでadt7410.pyファイルを作成して、SDをマウントしてコピーする方が簡単でよいでしょう。以下、様々なテキスト・ファイルの作成・設置については同様に考えてください。)
#!/usr/bin/python # -*- coding: utf-8 -*- import smbus import time i2c = smbus.SMBus(2) address = 0x48 while True: block = i2c.read_i2c_block_data(address, 0x00, 12) temp = (block[0] << 8 | block[1]) >> 3 if(temp >= 4096): temp -= 8192 print("Temperature:%6.2f" % (temp / 16.0)) time.sleep(10)
|
温度測定をしてみます
次のようにPythonスクリプトを実行してください。
# python /root/adt7410/adt7410.py |
10秒ごとに温度が表示されます。
ここまでは、前回のものを繰り返して掲載しました。
[IDCFクラウドサービスの準備]
IDCFサイトに解説があるのでこれに従ってサーバーの準備をします。「IDCF」チャンネルは、IoTのためのメッセージングプラットフォームのMeshbluを使いやすくするためにDocker Composeにまとめられています。
Ayla, EVRYTHNG, Electric Imp, ARRAYENT などの商用クラウドサービスと比べると、MQTT、RESTインタフェースを利用するところでは同じですが、サービス項目・コンセプトが異なっていて、リアルなシステムを組むには物足りないものとなる。ここでは、クラウド利用の手始めと考えてやってみましょう。サイトのマニュアルに従ってサーバーを作り、インストールスクリプトを走らせます。
http://www.idcf.jp/cloud/iot/detail01.html#post01
「Part2プログラミング
Raspberry Pi 2からBME280環境センサのデータ送信」
の部分がHummingBoardに置き換わるだけで、他は全く同じ手順となります。
IDCFの自分で構築したサーバーにアクセスするために、ポートの設定などを行います。セキュリティを考えてアクセス可能なIPを制限するなど工夫します。
[IDCFクラウドサービスにつなぐ]
まず最初は、IDCFのページで参考に書かれていることを踏襲して動作の確認を検証してみます。これまでの手順でMeshbluサーバーの構築とuuidが登録されています。この登録してある10個のuuidから以下の3つを次のような割り当てをしてみます。
trigger-1 : HummingBoardからADT7410の温度データを送信するuuid
action-1 : Dockerホスト上で、MQTT subscribeするuuid
action-2 : Browserで、WebSocket subscribeするuuid
それぞれのtokenとuuidをlistコマンドから確認します。
$ cd ~/iot_apps/meshblu-compose $ docker-compose run --rm iotutil list
> iotutil@0.0.1 start /app > node app.js "list"
│ keyword │ token │ uuid │ │ trigger-1 │ 3879e7e2 │ 278ffd74-e413-4419-aa95-2841a761876b │ ... │ action-1 │ e9a80da4 │ f596c777-a620-4c06-983d-fabb833b753b │ │ action-2 │ 65d6646b │ 553b9d58-a3cf-4e3c-8843-e4be9abbb280 │
... |
trigger-1からaction-2へメッセージが送信できるように設定します。
$ docker-compose run --rm iotutil whiten -- -f trigger-1 -t action-2
> iotutil@0.0.1 start /app
> node app.js "whiten" "-f" "trigger-1" "-t" "action-2" |
trigger-1 can send message to action-2
Dockerホストに別のシェルを開きmosquitto_subコマンド使います。action-2のuuidをトピック名に指定して、action-2のuuidへのメッセージをsubscribeします。
$ mosquitto_sub \ -h localhost \ -p 1883 \ -t f596c777-a620-4c06-983d-fabb833b753b \ -u f596c777-a620-4c06-983d-fabb833b753b \ -P e9a80da4 \ -d |
uuidとtoken情報を入力します。IDCF_CHANNEL_URLのアドレスは環境にあわせて設定します。
TRIGGER_1_UUID (trigger-1のuuid) : 278ffd74-e413-4419-aa95-2841a761876b
TRIGGER_1_TOKEN (trigger-1のtoken) : 3879e7e2
ACTION_1_UUID (action-1のuuid) : f596c777-a620-4c06-983d-fabb833b753b
ACTION_2_UUID (action-2のuuid) : 553b9d58-a3cf-4e3c-8843-e4be9abbb280
~/python_apps/ADT7410-meshblu-py/config.py conf = { "IDCF_CHANNEL_URL": "210-140-66-232.jp-east.compute.idcfcloud.com", "TRIGGER_1_UUID": "278ffd74-e413-4419-aa95-2841a761876b", "TRIGGER_1_TOKEN": "3879e7e2", "ACTION_1_UUID": "f596c777-a620-4c06-983d-fabb833b753b", "ACTION_2_UUID": "553b9d58-a3cf-4e3c-8843-e4be9abbb280" } |
それでは、先のプログラムをクラウドへデータを送り込むように改造をしてみます。上のconfig.pyと同じディレクトリに置きます。
def main(): client = mqtt.Client(client_id='',clean_session=True, protocol=mqtt.MQTTv311) client.username_pw_set("xxxxxxx","yyyyyyy") client.connect("MESUBLU_BROKER", 1883, 60) client.on_publish = on_publish
while True: block = i2c.read_i2c_block_data(address, 0x00, 12) temp = (block[0] << 8 | block[1]) >> 3 if(temp >= 4096): temp -= 8192 sensing_value = temp / 16.0 sensing_message = json.dumps({"devices":"sensing-dev", "payload":{"temperature":sensing_value} }) client.publish("message",sensing_message) message = json.dumps({"devices": [conf["ACTION_1_UUID"], conf["ACTION_2_UUID"]], "payload": retval}) print(message) client.publish("message",message) sleep(10) if __name__ == '__main__': main() |
上のプログラムをADT7410_publish.pyとして、root権限で実行します。10秒間隔で指定した2つのuuidにメッセージをpublishします。
コンソールにmessageが同時に表示されて確認できます。
[Dockerホストで確認]
Dockerホストのmosquitto_subが起動しているシェルに戻ります。HummingBoardから環境データのメッセージをsubscribeできました。
[MyThingsを連携して使う]
MyThingsアプリは、「トリガー」に対して「アクション」を組み合わせることのできるアプリです。入力はチャネルと呼ばれ、好きなチャンネルを選択して、自分の好みの組み合せを作成することができます。天気がよかったらiPhoneで通知を受ける。お買い得な情報が更新されたら逃さず知ることができる。
プログラマ的にいうとif ~ then ~ の組み合わせを作るということです。
「IDCFチャンネル」を利用して、IoTプロトタイプ開発をすることができます。
自作ガジェットとチャンネルを組み合わせることに応用ができます。
以下のコマンドを実行して認証tokenを確認します。この例ではmeshblu_auth_token列のb8c55ad8が認証tokenになります。
このuuidとtokenを認証用のHTTPヘッダに使います。以下のように{idcf channel url}/data/{uuid}のURLにデータをPOSTします。REST APIでHTTPS通信は自己署名の証明書を使っているため、curlコマンドの場合は--insecureフラグが必要です。HTTP通信も使えます。
# ~/python_apps/w1therm-mqtt-publish.py # -*- coding: utf-8 -*- import paho.mqtt.client as mqtt from time import sleep import json import smbus i2c = smbus.SMBus(2) address = 0x48
def on_publish(client, userdata, mid): print("publish: {0}".format(mid))
def main(): client = mqtt.Client(client_id='',clean_session=True, protocol=mqtt.MQTTv311) client.username_pw_set("xxxxxx","yyyyyyy") client.connect("MESUBLU_BROKER", 1883, 60) client.on_publish = on_publish
while True: block = i2c.read_i2c_block_data(address, 0x00, 12) temp = (block[0] << 8 | block[1]) >> 3 if(temp >= 4096): temp -= 8192 sensing_value = temp / 16.0 sensing_message = json.dumps({"devices":"sensing-dev", "payload":{"temperature":sensing_value} }) client.publish("message",sensing_message)
if sensing_value > 25.0: threshold_message = json.dumps({"red":"on"}) client.publish("data",threshold_message) sleep(10)
if __name__ == '__main__': main()
|
次はIDCF cloudのトリガーをMyThingsで受けるようにします。
スマホからMyThingsアプリをダウンロードしてきます。
設定で「チャネル一覧」の中に「開発者向け」に「IDCF」があります。IDCFにチャンネルの認証を行うには、IPアドレスと認証tokenを入力して「利用を開始する」。
ホーム画面に戻り、右上の「プラス」をタップして組み合わせを作成します。「トリガー」をタップして『「IDCF」チャンネル』を選択、「条件を満たしたら」をタップし、「trigger-1」を選択し「OK」します。次に「アクション」をタップして「Slack」を承認します。チャットチャンネルの選択と、「IDCF」チャンネルのトリガーが「条件を満たした」ときにSlackに表示されるメッセージを入力し、「OK」をします。最初の組み合わせ作成画面で「作成」します。
「IDCF」チャンネルのトリガーが「条件を満たした」状態をテストします。「IDCF」チャンネルの仮想マシンにログインして、以下のコマンドを実行します。
$ curl -X POST "https://210.140.66.232/data/f547..." --insecure -d 'led=on' --header "meshblu_auth_uuid: xxxx" --header "meshblu_auth_token: xxxxx" |