Armadillo-Iotとセイコーソリューションズ株式会社様の無線センサーネットワーク を使って、 Armadillo-IoT+USBベース(SW-4000-1000)(920MHz無線親機)
と 温・湿・照度ノード(SW-4210-1204)(920MHz無線子機)
CO2ノード(SW-4230-1000)(920MHz無線子機)
人感ノード(SW-4220-1010)(920MHz無線子機)
の組み合わせで、 セイコーソリューションズ株式会社様の無線センサーネットワーク(920MHz無線)の 各センサーノードから温度、湿度、照度、CO2、人検出のデータをArmadillo-IoTで読み取って、クラウド(Heroku)経由で見てみました。
(ブラウザのURLの部分は、後述の手順でHerokuから割り当てられたURLになりますので、伏字(***.herokuapp.com)にしてます。)
当方で確認した手順、サンプルプログラムを下記に説明します。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
注意)
ここでは、当方が確認した簡易的な手順を示しているに過ぎません。(エラー処理等は考慮されていません。)
本格的には、エラー処理、フェイルセーフなどを行う必要があります。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
以下、
USBベース(SW-4000-1000)(920MHz無線親機)は、「USBベース(無線親機)」
温・湿・照度ノード(SW-4210-1204)(920MHz無線子機)は、「温・湿・照度ノード」
CO2ノード(SW-4230-1000)(920MHz無線子機)は、「CO2ノード」
人感ノード(SW-4220-1010)(920MHz無線子機)は、「人感ノード」
と呼称します。
今回の動作確認は下図のような構成です。
手順の概要は下記のようになります。
1.機材、資料の準備
2.Armadillo-IoTでUSBベース(無線親機)を使う準備
3.各ノードから取得したデータの確認
4.各ノードからデータを取得するサンプルプログラム
5.クラウド(Heroku)側のアプリの準備
6.温度・湿度・照度、CO2、人感ノードのデータをクラウド(Heroku)で見る
1.機材、資料の準備
機材は下記のもの使用しました。
・Armadillo-IoT+USBベース(SW-4000-1000)(920MHz無線親機)
Aramdillo-IoTのUSBポートに、USBベース(無線親機)を接続します。
・温・湿・照度ノード(SW-4210-1204)(920MHz無線子機)
・CO2ノード(SW-4230-1000)(920MHz無線子機)
・人感ノード(SW-4220-1010)(920MHz無線子機)
今回の動作確認において、下記の資料を参考にしました。
・無線センサーネットワークのサポート(ダウンロード)
よりダウンロードできるUSBベース(無線親機)、温度・湿度・照度、CO2、人感ノードの製品仕様書(※要ID/パスワード)
※)ダウンロードページのID、パスワードは、セイコーソリューションズ株式会社様へ、メールまたはフォームからお問い合わせください。
2.Armadillo-IoTでUSBベース(無線親機)を使う準備
USBベース(無線親機)の製品仕様書より、USBを仮想シリアルポートとすることで、 Armadillo-IoTとUSBベース(無線親機)はシリアルで通信できます。
同製品仕様書より、USBベース(無線親機)は、FTDI製のUSBシリアルコンバーターを使用しているので、 Armadillo-IoTのカーネルコンフィギュレーションで、FTDI製のUSBシリアルコンバーターのドライバを有効にします。
ATDEで、make menuconfigを実行して、カーネルコンフィギュレーションで下記のように設定を行います。
(USB FTDI Single Port Serial Driverを有効にします。)
Kernel Configuration
Device Drivers --->
[*] USB support --->
<*> USB Serial Converter support --->
<*> USB FTDI Single Port Serial Driver
上記の設定後、ビルドしたイメージをArmadillo-IoTに書き込んで、起動します。
Armadillo-IoTにUSBベース(無線親機)が接続されている状態の場合、下記のように認識されているログが表示されます。
[root@armadillo-iotg (ttymxc1) ~]# usb 1-1: new high-speed USB device number 3 using ci_hdrc
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 2 ports detected
usb 1-1.1: new full-speed USB device number 4 using ci_hdrc
ftdi_sio 1-1.1:1.0: FTDI USB Serial Device converter detected
usb 1-1.1: Detected FT232RL
usb 1-1.1: Number of endpoints 2
usb 1-1.1: Endpoint 1 MaxPacketSize 64
usb 1-1.1: Endpoint 2 MaxPacketSize 64
usb 1-1.1: Setting MaxPacketSize 64
usb 1-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
usb 1-1.2: new full-speed USB device number 5 using ci_hdrc
上記のログより、USBシリアルコンバーターはttyUSB0として認識されています。 以降の説明において、USBベース(無線親機)のデバイスファイルは、"/dev/ttyUSB0"の場合で説明します。
3.各ノードから取得したデータの確認
Armadillo-IoTでtipコマンドを使って、USBベース(無線親機)とシリアル通信を始めます。
(デバイスファイル名は、手順2で確認した"/dev/ttyUSB0"を指定します。
ボーレートは、USBベース(無線親機)の製品仕様書より、115200を指定します。)
温・湿・照度ノード、CO2ノード、人感ノードの電源がONになっている場合、下記のようなログが表示されます。
(各ノードは定期的にデータを送信しているので、データを受信次第、ログが追加されます。
他にもソフトウェアバージョン通知などのログも出力されますが、下記は今回使用するログのみを抜粋しています。)
[root@armadillo-iotg (ttymxc1) ~]# tip -l /dev/ttyUSB0 -s 115200
Connected.
GID:0x65,RID:0x00,CH:0x3C,MSG:0x0B0000000000000000000006,IDX:0xF8,SID:0xE6,RT:0x00E6FFFFFF380000A5A0
GID:0x65,RID:0x00,CH:0x3C,MSG:0x03000000A0269A310A000955,IDX:0xF9,SID:0xE7,RT:0x00E7FFFFFF380000A5C6
GID:0x65,RID:0x00,CH:0x3C,MSG:0x200000000000000000001142,IDX:0x09,SID:0xE8,RT:0x00E8FFFFFF380000A58A
(と、出力し続ける。)
("~."と入力(文字は表示されない)するとシリアル通信終了。)
各ノードの製品仕様書を参考に読み解くと、
GID:グループID
RID:宛先ID
CH:通信チャネル
MSG:メッセージ
IDX:インデックス
SID:通信元ID
RT:ルート情報
という意味で、MSGの箇所が各ノードによって、異なるデータとなっているようです。
各ノードの製品仕様書と照らし合わせると、
温・湿・照度ノードは、MSGの頭の2文字が"03"と定義されており、上記のログの場合、
MSG:0x03000000A0269A310A000955
03:ユニットタイプ(温・湿・照度ノード)
00:制御コード(00:温度・湿度データ)
00:電池電圧(00:2.8V以上)
00:固定値
A:固定値
0:温度データの符号(0:プラス)
269:温度(BCDフォーマットなので、26.9[度])
A:固定値
310:湿度(BCDフォーマットなので、31.0[%])
A0:固定値
00955:照度(BCDフォーマットなので、955[lx])
CO2ノードは、MSGの頭の2文字が"20"と定義されており、上記のログの場合、
MSG:0x200000000000000000001142
20:ユニットタイプ(CO2ノード)
00:制御コード(00:CO2ノード)
00:サブ制御コード(00:出力)
000000:固定値
000000001142:CO2濃度(BCDフォーマットなので、1142[ppm])
人感ノード(イベントドリブン)は、MSGの頭の2文字が"0B"と定義されており、上記のログの場合、
MSG:0x0B0000000000000000000006
0B:ユニットタイプ(人感ノード:イベントドリブン)
00:制御コード(00:検出時送信、検出カウント数)
00:電池電圧(00:2.8V以上)
000000:固定値
000000000006:カウント数(BCDフォーマットなので、6[回])
のようなデータになっています。
4.各ノードからデータを取得するサンプルプログラム
手順3のとおり、Armadillo-IoTとUSBベース(無線親機)は、シリアルで通信します。
そこで、Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー をベースに、手順3で確認したシリアル通信で得られるテキストデータから 各ノードのセンサーの値を算出し、ログに出力するサンプルプログラムを作成しました。 serial_seiko_nodes.tar.gz
<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_seiko_nodesディレクトリ内でmakeすると、
serial_seiko_nodesという実行ファイルができます。
この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。
serial_seiko_nodes <device>
引数
device:デバイスファイル(手順3で確認した"/dev/ttyUSB0")
温・湿・照度ノード、CO2ノード、人感ノードの電源がONになっている場合、本プログラムを実行すると、各ノードからのデータを受信した場合、下記のようなログファイルの生成と、ログ表示を行います。
・log_tmp.txt:温・湿・照度ノードのログファイル
(sid_tmp:SID(送信元ID)、tmp:温度、hum:湿度、lux:照度)
sid_tmp=231&tmp=28.1&hum=31.7&lux=956
・log_co2.txt:CO2ノードのログファイル
(sid_co2:SID(送信元ID)、co2:CO2濃度)
sid_co2=232&co2=1745
・log_human.txt:人感ノードのログファイル
(sid_human:SID(送信元ID)、detect_count:検出数)
sid_human=230&detect_count=39
補足)各ログファイル内の各パラメータは、
5.クラウド(Heroku)側のアプリの準備
で、クラウド側のアプリで受けとるデータ区切りに合わせて、"&"で区切っています。
ログ表示
[root@armadillo-iotg (ttymxc1) ~]# ./serial_seiko_nodes /dev/ttyUSB0
****************************************************
-------- Start to reveive data from nodes --------
****************************************************
GID:0x65,RID:0x00,CH:0x3C,MSG:0x200000000000000000001745,IDX:0x12,SID:0xE8,RT:0x00E8FFFFFF380000A5BB
GID(101), RID(0), CH(60), IDX(18), SID(232)
Root Information: 0x00E8FFFFFF380000A5BB
--------- CO2 sensor data --------
CO2[ppm]: 1745
****************************************************
GID:0x65,RID:0x00,CH:0x3C,MSG:0x0B0000000000000000000029,IDX:0x39,SID:0xE6,RT:0x00E6FFFFFF380000A590
GID(101), RID(0), CH(60), IDX(57), SID(230)
Root Information: 0x00E6FFFFFF380000A590
--------- Human Detect sensor data --------
Count of Human Detction: 29
****************************************************
GID:0x65,RID:0x00,CH:0x3C,MSG:0x03000000A0281A314A000955,IDX:0x3A,SID:0xE7,RT:0x00E7FFFFFF380000A54D
GID(101), RID(0), CH(60), IDX(58), SID(231)
Root Information: 0x00E7FFFFFF380000A54D
--------- Tmp/Hum/Lux sensor data --------
Temparature[degC]: 28.1
Humidity[%RH]: 31.4
Ambient[Lx]: 955
<サンプルプログラムの補足>
serial_seiko_nodes.c
(Armadillo実践開発ガイド第2部 6.5.1. シリアルエコーサーバーをベースに今回のサンプル特有の箇所を抜粋します。)
/**** sample: response data from nodes: begin ****/
// ノードからの受信データと、各ノード別のデータ用の構造体
/**** sample: response data from nodes: end ****/
/**** sample: Nodes response: begin ****/
// ノードからのレスポンス判断用の文字列。(頭の3文字に"GID"があることで判断)
/**** sample: Nodes response: end ****/
/**** sample: char(HEX) to int: begin ****/
// テキスト表記の16進数を整数に変更する関数
/**** sample: char(HEX) to int: end ****/
/**** sample: variable: begin ****/
// ノードのレスポンスの最初が"GID"で始まるテキストかどうかのフラグ
int flag_start, flag_end;
/**** sample: variable: end ****/
/**** sample: receive data from nodes: begin ****/
// データの読み込みの開始
/**** sample: analize sensor data: begin ****/
// データの解析の開始
// 手順3のテキスト文字の位置と製品仕様書のフォーマットに合わせて、
// センサーデータを抽出し、計算
/**** output Tmp/Hum/Lux sensor data to stdout: begin ****/
// 温度・湿度・照度ノードの場合のログ表示
/**** output Tmp/Hum/Lux sensor data to stdout: end ****/
/**** output Tmp/Hum/Lux sensor data to log file: begin ****/
// 温度・湿度・照度ノードの場合のログファイルへの出力
/**** output Tmp/Hum/Lux sensor data to log file: end ****/
/**** output Human Detect sensor data to stdout: begin ****/
// 人感ノードの場合のログ表示
/**** output Human Detect sensor data to stdout: end ****/
/**** output Human Detect sensor data to log file: begin ****/
// 人感ノードの場合のログファイルへの出力
/**** output Human Detect sensor data to log file: end ****/
/**** output CO2 sensor data to stdout: begin ****/
// CO2ノードの場合のログ表示
/**** output CO2 sensor data to stdout: end ****/
/**** output CO2 sensor data to log file: begin ****/
// CO2ノードの場合のログファイルへの出力
/**** output CO2 sensor data to log file: end ****/
/**** sample: analize sensor data: end ****/
/**** sample: receive data from nodes: end ****/
5.クラウド(Heroku)側のアプリの準備
5.1.準備
まず、Armadillo-IoT + Heroku(Node.js)でHello World のとおり、Armadillo側からのデータ送信と動作確認まで行ってください。
以下、この手順を実行したことをベースに説明します。
よって以下では、ATDE5の
~/temp/myapp
がクラウド(Heroku)側のアプリ用のディレクトリとします。
5.2.サンプル
クラウド(Heroku)側のアプリのサンプルソースを添付します。
myapp_seiko_20160224.tar.gz
を解凍して、myapp_seiko_20160224ディレクトリの中身を
~/temp/myapp
ディレクトリの下にコピーしてください。
<サンプルソースの説明>
今回のサンプル特有の部分のみ説明します。
app.js
・HerokuのURL(***.herokuapp.com)にアクセスした際、index.ejsを表示するようにします。
表示の際、index.ejsに各ノードのid、湿度、温度、照度、CO2、人感の検出回数を与えています。
app.get('/', function(req, res){
res.render('index', {sid_tmp: sid_tmp, hum: hum, tmp: tmp, lux: lux, sid_co2: sid_co2, co2: co2, sid_human: sid_human, detect_count: detect_count});
});
・HerokuのURL(***.herokuapp.com/series)にポストされたデータ(※)をパースして、上記のindex.ejsに渡す変数に代入しています。
※)上記サンプルアプリ(serial_seiko_nodes)を実行時のログファイル
・log_tmp.txt:温・湿・照度ノードのログファイル
・log_co2.txt:CO2ノードのログファイル
・log_human.txt:人感ノードのログファイル
の内容をスクリプトで合成して、生成される
sid_tmp=231&tmp=28.1&hum=31.7&lux=956&sid_co2=232&co2=1745&sid_human=230&detect_count=39
という形式のデータです。"&"で温度、湿度等の各データを区切っています。
app.post('/series', function(req, res) {
console.log('post:/series');
sid_tmp = req.body.sid_tmp; // 温度・湿度・照度ノードのID
tmp = req.body.tmp; // 温度
hum = req.body.hum; // 湿度
lux = req.body.lux; // 照度
sid_co2 = req.body.sid_co2; // CO2ノードのID
co2 = req.body.co2; // CO2
sid_human = req.body.sid_human; // 人感ノードのID
detect_count = req.body.detect_count; // 人感の検出回数
res.send("Received\n");
});
<```
<h5>view/index.ejs</h5>
・上記app.get('/', function(req, res)により、受け取った各ノードのデータを表示するhtmlです。
5.3.サンプルの実行<br/>
下記のコマンドで、クラウド(Heroku)にアップロードします。
[atde ~/temp/myapp]$ git add --all [atde ~/temp/myapp]$ git commit -m "seiko_node" [atde ~/temp/myapp]$ git push heroku master:master
5.4.アプリの動作確認<br/>
Webブラウザで
https://\*\*\*.herokuapp.com
(***.herokuapp.comの部分は、手順6.1で確認したHerokuのURL)
を実行すると、冒頭のWebブラウザの写真のように表示されます。
(ここまでの手順では、データを受信してないので、各値はオール0になります。)
<h4>6.温度・湿度・照度、CO2、人感ノードのデータをクラウド(Heroku)で見る</h4>
Armadillo-IoTから各ノードのデータをクラウドに送信するスクリプト<br/>
<a href=https://users.atmark-techno.com/system/files/blogs/send_seiko_nodes.sh>send_seiko_nodes.sh</a>
を添付します。
このスクリプトをArmadillo-IoTの/rootディレクトリに置いて、実行権限をつけてください。
サンプルプログラムserial_seiko_nodesもArmadillo-IoTの/rootディレクトリに置いて実行します。
[armadillo ~]# chmod +x send_seiko_nodes.sh [armadillo ~]# ls /root send_seiko_nodes.sh serial_seiko_nodes
send_seiko_nodes.shは、下記のように使用します。
send_seiko_nodes.sh <HerokuのURL> 引数 device:デバイスファイル(手順2で確認した"/dev/ttyUSB0") HerokuのURL:手順5.1で確認したHerokuのURL
例)USBベース(無線親機)のデバイスファイルが/dev/ttyUSB0で、Herokuのアカウントが***.herokuapp.comの場合、
[armadillo ~]# ./send_seiko_nodes.sh /dev/ttyUSB0 https://***.herokuapp.com/series
上記のスクリプトを実行すると、Armadillo-IoTは
各ノードのID、湿度、温度、照度、CO2、人感の検出回数のデータを<br/>
・log_tmp.txt:温・湿・照度ノードのログファイル<br/>
・log_co2.txt:CO2ノードのログファイル<br/>
・log_human.txt:人感ノードのログファイル<br/>
から読みだして、クラウド(Herokuのhttps://\*\*\*.herokuapp.com/series)に約10秒ごとに送信します。
Webブラウザで、https://\*\*\*.herokuapp.comにアクセスすると、Armadillo-IoTが送信したIoTスマートモジュールのデータが
冒頭のWebブラウザの写真のように見ることができます。<br/>
補足)<br/>
Webブラウザの表示の更新には再読み込みが必要です。<br/>
上記のスクリプトでは10秒毎にクラウド(Heroku)に送信していますが、Webブラウザで表示されるデータの更新間隔は、
各ノードのデータ更新間隔(1分/5分/10分から選択)に依存します。
クラウド(Heroku)側のアプリがデータを受信した場合は、"Received"という文字をArmadillo-IoTに送信するので、
クラウド(Heroku)側が受け取ったかどうかを、Armadillo-IoTの標準出力で確認することができます。