ブログ

Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得して、Herokuに送信してWebブラウザで確認

at_kazutaka.bito
2016年2月21日 20時42分

2016.11.2更新
・サンプルプログラム:serial_rn4020_ism_case3の地磁気、加速度の計算方法に誤りがありましたので、  計算方法を修正したserial_rn4020_ism_case3_20161102.tar.gzに更新しました。

Armadillo-IoT+RN4020アドオンモジュール

アルプス電気株式会社様のセンサネットワークモジュール(IoT Smart Module)

を使って、 Armadillo-IoTからBLEで、センサネットワークモジュール(IoT Smart Module)の 温度、湿度、気圧、照度等のデータを読み取って、クラウド(Heroku)経由で見てみました。

(ブラウザのURLの部分は、後述の手順でHerokuから割り当てられたURLになりますので、伏字(***.herokuapp.com)にしてます。)

参考)本内容に関連するBLE通信のセンサー(IoT Smart Module)を使った動作手順に下記のブログもあります。
Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得
Armadillo-IoT+BLE無線USBドングル:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得して、Herokuに送信してWebブラウザで確認

当方で確認した手順、サンプルプログラムを下記に説明します。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
注意)
ここでは、当方が確認した簡易的な手順を示しているに過ぎません。(エラー処理等は考慮されていません。)
本格的には、RN4020、IoT Smart Moduleとの対話的な通信により、設定、エラー処理、フェイルセーフなどを行う必要があります。

備考)
本説明内にて、IoT Smart ModuleのMACアドレスは、今回確認したIoT Smart ModuleのMACアドレスではなく、ダミーのMACアドレス(01:23:45:67:89:ABまたはFE:DC:BA:98:76:54)に置き換えて記述しています。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

以下、 RN4020アドオンモジュールは、「RN4020アドオン」 センサネットワークモジュール(IoT Smart Module)を「IoTスマートモジュール」 と呼称します。

今回の動作確認は下図のような構成です。

手順の概要は下記のようになります。
 1.機材、資料
 2.IoTスマートモジュールからのデータ受信方法の検討
 3.Armadillo-IoTからRN4020アドオンの設定と運用開始
 4.Armadillo-IoTからIoTスマートモジュールにBLEで接続
 5.IoTスマートモジュールのセンサー設定と、センサーデータの取得
 6.クラウド(Heroku)側のアプリの準備
 7.IoTスマートモジュールのデータをクラウド(Heroku)で見る
 Appendix.複数のIoTスマートモジュールについて、接続を切り替えながら、センサーデータを取得

1.機材、資料

機材は下記のもの使用しました。
・Armadillo-IoT+RN4020アドオンモジュール
IoTスマートモジュール

今回の動作確認において、下記の資料を参考にしました。 ・RN4020モジュールユーザガイド
IoT Smart Moduleコマンドガイド

備考)
今回は、Armadillo-IoTのアドオンインタフェースのコネクタ"CON1"にRN4020アドオンモジュールを接続しました。 下記説明内のデバイスファイル"/dev/ttymxc3"の箇所は、アドオンモジュールを接続するコネクタに応じて、
 CON1使用時:/dev/ttymxc3
 CON2使用時:/dev/ttymxc0
と読み替える必要があります。

2.IoTスマートモジュールからのデータ受信方法の検討

IoTスマートモジュールは、センサーデータの送信方法に
・Notificationで通知
・Beaconのアドバタイジングパケットで通知
が選択できます。

・Notificationで通知

ここでは、この方法でセンサーデータを取得しました。 ただ、RN4020アドオンの[仕様]に記載されているとおり、
同時接続数: 1
であるので、RN4020アドオンを使って、複数のIoTスマートモジュールからデータを取得する場合は、接続を切り替える運用になります。

・Beaconのアドバタイジングパケットで通知

IoTスマートモジュールのアドバタイジングパケットを確認したところ、RN4020アドオンでは、読み取れないタイプのようでしたので、この方法は断念しました。
 Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得内にある 
 参考)IoTスマートモジュールのBeaconモードで、RN4020アドオンで受信できるかの確認
をご参考ください。

参考)複数のIoTスマートモジュールからデータを取得する方法として、
・RN4020アドオンモジュールで、接続(同時接続数: 1)を切り替えながら取得する方法は、 末尾のAppendix.複数のIoTスマートモジュールについて、接続を切り替えながら、センサーデータを取得をご参考ください。

・同時に複数のIoTスマートモジュールを接続して取得する方法は、
 Armadillo-IoT+BLE無線USBドングル:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得して、Herokuに送信してWebブラウザで確認
をご参考ください。

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
以下、サンプルプログラムについては、
 Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得
で確認したコマンドとレスポンスに基づいて作成しています。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

3.Armadillo-IoTからRN4020アドオンの設定と運用開始

IoTスマートモジュールからのデータを受信するにあたり、RN4020アドオンを
RN4020モジュールユーザガイド
 3.2.1 1 つ目のデバイス ( モジュールA) の設定
を参考にセントラルロールに設定します。

SF,1 // factory reset
SS,C0000000 // Support Device Info and Battery as server
SR,92000000 // Set device as central, support MLDP and enable UART flow control
R,1 // reboot to make changes effective

Armadillo-IoTとRN4020アドオンは、シリアルで通信します。

そこで、Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー をベースに、シリアル通信で上記のRN4020の設定を行うサンプルプログラムを作成しました。
serial_rn4020_set.tar.gz

<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_rn4020_setディレクトリ内でmakeすると、serial_rn4020_setという実行ファイルができます。

この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。

serial_rn4020_set <device>
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")

下記はRN4020アドオンをArmadillo-IoTのアドオンインタフェースのCON1(/dev/ttymxc3)に 接続した例です。

[root@armadillo-iotg (ttymxc1) ~]# ./serial_rn4020_set /dev/ttymxc3
 
****************************************************
-------- Command: SF,1
AOK
-------- Receive: AOK
 
****************************************************
-------- Command: SS,C0000000
AOK
-------- Receive: AOK
 
****************************************************
-------- Command: SR,92000000
AOK
-------- Receive: AOK
 
****************************************************
-------- Command: R,1
Reboot
CMD
-------- Receive: Reboot and CMD
 
######## Finish RN4020 Setting ########

末尾が、 ######## Finish RN4020 Setting ######## であれば、正常終了です。 違う場合は、設定が正常に行われず、タイムアウトしています。

<サンプルプログラムの補足>
serial_rn4020_set.c
Armadillo実践開発ガイド第2部 6.5.1. シリアルエコーサーバーをベースに今回のサンプル特有の箇所を抜粋します。)

/**** sample: interval timer :begin ****/
// タイマー関連。RN4020と対話的に通信を行う際、RN4020から期待通りのレスポンスがない場合のタイムアウト。
/**** sample: interval timer: end ****/
/**** sample: RN4020 command: begin ****/
// RN4020をセントラルロールに設定するコマンド
static unsigned char cmd_sf[] = "SF,1\n";
static unsigned char cmd_ss[] = "SS,C0000000\n";
static unsigned char cmd_sr[] = "SR,92000000\n";
static unsigned char cmd_r[] = "R,1\n";
/**** sample: RN4020 command: begin ****/
 
/**** sample: RN4020 response: begin ****/
// RN4020からのレスポンスのパターン
static unsigned char res_aok[] = "AOK";
static unsigned char res_reboot[] = "Reboot";
static unsigned char res_cmd[] = "CMD";
/**** sample: RN4020 response: end ****/
/**** sample: variable: begin ****/
// RN4020からのレスポンスを受信したかのフラグ
    int flag_aok, flag_reboot, flag_cmd;
/**** sample: variable: end ****/
/**** sample: RN4020 command(SF): begin ****/
// SFコマンドの送信と、レスポンス(AOK)の確認
/**** sample: RN4020 command(SF): end ****/
 
/**** sample: RN4020 command(SS): begin ****/
// SSコマンドの送信と、レスポンス(AOK)の確認
/**** sample: RN4020 command(SS): end ****/
 
/**** sample: RN4020 command(SR): begin ****/
// SRコマンドの送信と、レスポンス(AOK)の確認
/**** sample: RN4020 command(SR): end ****/
 
/**** sample: RN4020 command(R): begin ****/
// Rコマンドの送信と、レスポンス(Reboot、CMD)の確認
/**** sample: RN4020 command(R): end ****/

4.Armadillo-IoTからIoTスマートモジュールにBLEで接続

IoTスマートモジュールの電源をONにしておきます。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
(下記手順において、異常終了する場合は、IoTスマートモジュールの電源をOFF->ONにして、この手順の最初からやりなおします。)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

RN4020モジュールユーザガイド
 Chapter2. RN4020 OEN モジュールインタフェース
  「E」コマンド:接続
  「CHW」コマンド:ハンドルを指定して、文字を書く
IoT Smart Moduleコマンドガイド
 1.2 Bluetooth Smartサービス
 Appendix1 Service Database
  0x0013:センサーデータの通知のNotification設定用のハンドル
  0x0016:コマンド応答、接続パラメータ更新通知のNotification設定用のハンドル
を参考に、この手順で使用するコマンドを整理すると下記のようになります。

// IoTスマートモジュールに接続して、Notificationを設定
E,0,0123456789AB // IoTスマートモジュールのMACアドレス:0123456789ABに接続
CHW,0013,0100 // センサーデータ通知用のNotificationを有効。
CHW,0016,0100 // コマンド応答用のNotificationを有効。

Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー をベースに、シリアル通信でIoTスマートモジュールへの接続と Notificationの設定を行うサンプルプログラムを作成しました。
serial_rn4020_ism_connect.tar.gz

<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_rn4020_ism_connectディレクトリ内でmakeすると、 serial_rn4020_ism_connectという実行ファイルができます。

この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。

serial_rn4020_set <device> <id>
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")
 id:BLEのMACアドレス(":"は抜く)

下記はRN4020アドオンをArmadillo-IoTのアドオンインタフェース CON1(/dev/ttymxc3)に接続し、IoTスマートモジュールのMACアドレスが"01:23:45:67:89:AB"の例です。

[root@armadillo-iotg (ttymxc1) ~]# ./serial_rn4020_ism_connect /dev/ttymxc3 0123456789AB
 
****************************************************
-------- Command: E,0,0123456789AB
AOK
ConnParam: 00A0,0004,0258
Connected
-------- Receive: Connected
 
****************************************************
-------- Command: CHW,0013,0100
AOK
-------- Receive: AOK
 
****************************************************
-------- Command: CHW,0016,0100
AOK
-------- Receive: AOK
 
######## Connected: IoT Smart ########

末尾が、 ######## Connected: IoT Smart ######## であれば、正常終了です。 違う場合は、設定が正常に行われず、タイムアウトしています。

正常終了時は、log_ble_connect.txtファイルに、接続したBLEのMACアドレスが、

id=0123456789AB

のように出力されています。

<サンプルプログラムの補足>
serial_rn4020_ism_connect.c
Armadillo実践開発ガイド第2部 6.5.1. シリアルエコーサーバーをベースに今回のサンプル特有の箇所を抜粋します。)

/**** sample: interval timer :begin ****/
// タイマー関連。RN4020と対話的に通信を行う際、期待通りのレスポンスがない場合のタイムアウト。
/**** sample: interval timer: end ****/
// IoTスマートモジュールに接続して、Notificationを設定するためのコマンド
/**** sample: RN4020 command: begin ****/
static char iotsmart_id[] = "112233445566"; /* id(112233445566 is dummy) */
static unsigned char cmd_e_iotsmart[] = "E,0,112233445566\n"; /* connect iot smart */
static unsigned char cmd_chw_notify1[] = "CHW,0013,0100\n"; /* set notify iot smart custom1 */
static unsigned char cmd_chw_notify2[] = "CHW,0016,0100\n"; /* set notify iot smart custom2 */
/**** sample: RN4020 command: end ****/
 
// RN4020からのレスポンスのパターン
/**** sample: RN4020 response: begin ****/
static unsigned char res_aok[] = "AOK"; /* response: AOK */
static unsigned char res_connect[] = "Connected"; /* response: connect */
/**** sample: RN4020 response: end ****/
/**** sample: variable: begin ****/
// RN4020からのレスポンスを受信したかのフラグ
    int flag_connect, flag_aok;
/**** sample: variable: end ****/
 
/**** sample: ble id: begin ****/
// 引数からIoTスマートモジュールのMACアドレスを取得
/**** sample: ble id: end ****/
/**** sample: RN4020 command(E to connect IoT Smart): begin ****/
// IoTスマートモジュールの接続と、レスポンス(Connected)の確認
/**** sample: RN4020 command(E to connect IoT Smart): end ****/
 
/**** sample: RN4020 command(CHW to set IoT Smart: Custom1 Notify): begin ****/
// IoTスマートモジュールのCustom1のNotificatio設定と、レスポンス(AOK)の確認
/**** sample: RN4020 command(CHW to set IoT Smart: Custom1 Notify): end ****/
 
/**** sample: RN4020 command(CHW to set IoT Smart: Custom2 Notify): begin ****/
// IoTスマートモジュールのCustom2のNotificatio設定と、レスポンス(AOK)の確認
/**** sample: RN4020 command(CHW to set IoT Smart: Custom2 Notify): end ****/

5.IoTスマートモジュールのセンサー設定と、センサーデータの取得

RN4020モジュールユーザガイド
 Chapter2. RN4020 OEN モジュールインタフェース
  「CHW」コマンド:ハンドルを指定して、文字を書く
  「K」コマンド:切断
IoT Smart Moduleコマンドガイド
 1.2 Bluetooth Smartサービス
 Appendix1 Service Database
  0x0018:コマンド制御用のハンドル
および
 2.2 コマンドによる設定例
 2.2.4 Case3:モーション(動き)100ms/環境1分間隔(Hybridモード)
を参考に、この手順で使用するコマンドを整理すると下記のようになります。

// IoTスマートモジュールのセンサー設定と測定開始
CHW,0018,2F0303 // 設定の初期化
CHW,0018,01037F // 全センサーを選択
CHW,0018,040304 // モーション/環境計測(Hybridモード)を選択
CHW,0018,06046400 // モーション(動き等)の計測間隔(100ms)
CHW,0018,05040A00 // 環境(温度、湿度等)の計測間隔(10秒)
CHW,0018,200301 // 計測開始
 
// IoTスマートモジュールと接続停止
CHW,0018,200300 // 計測停止
K // 接続停止

Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー をベースに、シリアル通信でIoTスマートモジュールのセンサー設定とセンサーデータの取得を行うサンプルプログラムを作成しました。
serial_rn4020_ism_case3_20161102.tar.gz

<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_rn4020_ism_case3_20161102ディレクトリ内でmakeすると、serial_rn4020_ism_case3という実行ファイルができます。

この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。

serial_rn4020_ism_case3 <device> <id> [0,1]
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")
 id:BLEのMACアドレス(":"は抜く)
 [0,1]:先頭文字が0なら永久ループでセンサーデータを取得。それ以外は、環境(温度、湿度等)を取得した時点で接続停止。

下記はRN4020アドオンをArmadillo-IoTのアドオンインタフェース CON1(/dev/ttymxc3)に接続し、IoTスマートモジュールがMACアドレス"01:23:45:67:89:AB"で、永久ループでセンサーデータを取得する例です。

[root@armadillo-iotg (ttymxc1) ~]# ./serial_rn4020_ism_case3 /dev/ttymxc3 0123456789AB 0
 
****************************************************
-------- Command: CHW,0018,2F0303
AOK
Notify,0012,E01400000000D7470B0001000000000000000000.
-------- Receive: Notify,0012,E0
 
****************************************************
-------- Command: CHW,0018,01037F
AOK
Notify,0012,E01400000000D7470B0001000000000000000000.
-------- Receive: Notify,0012,E0
 
****************************************************
-------- Command: CHW,0018,040304
AOK
Notify,0012,E01400000000D7470B0001000000000000000000.
-------- Receive: Notify,0012,E0
 
****************************************************
-------- Command: CHW,0018,06046400
Notify,0015,810301.
Notify,0015,810300.
ConnParam: 0028,0004,0258
AOK
Notify,0012,E01400000000D7470B0001000000000000000000.
-------- Receive: Notify,0012,E0
 
****************************************************
-------- Command: CHW,0018,05040A00
Notify,0015,810301.
Notify,0015,810300.
ConnParam: 0028,0004,0258
AOK
Notify,0012,E01400000000D6450B0001000000000000000000.
-------- Receive: Notify,0012,E0
 
****************************************************
-------- Command: CHW,0018,200301
 
****************************************************
 
****************************************************
 
---------[0123456789AB] sensor data(env) --------
Notify,0012,F3140000000000000000000000000000010A0F5B.
Pressure[hPa]: not selected
Humidity[%RH]: -14.00
Temparature[degC]: -41.92
UV[mW/cm^2]: 0.00
Ambient[Lx]: 0.00
Date: 15.10.1
 
---------[0123456789AB] sensor data(motion) --------
Magnetic[uT]: (x, y, z) = (13.95, 9821.55, 45.75)
Acceleration[G]: (x, y, z) = (0.03, 0.01, 14.96)
Time Stamp: 0:2:26 (200[ms])
 
****************************************************
 
---------[0123456789AB] sensor data(env) --------
Notify,0012,F314E9E2F409D90C0200000000000000010A0FBF.
Pressure[hPa]: 1012.29
Humidity[%RH]: 25.81
Temparature[degC]: 23.86
UV[mW/cm^2]: 0.05
Ambient[Lx]: 0.00
Date: 15.10.1
 
---------[0123456789AB] sensor data(motion) --------
Magnetic[uT]: (x, y, z) = (13.95, 9821.55, 46.50)
Acceleration[G]: (x, y, z) = (0.03, 0.01, 14.96)
Time Stamp: 0:2:36 (200[ms])
 
****************************************************
 
---------[0123456789AB] sensor data(env) --------
Notify,0012,F314EFE2EE09D90C0000030000000000010A0F23.
Pressure[hPa]: 1012.37
Humidity[%RH]: 25.72
Temparature[degC]: 23.86
UV[mW/cm^2]: 0.00
Ambient[Lx]: 75.84
Date: 15.10.1
 
---------[0123456789AB] sensor data(motion) --------
Magnetic[uT]: (x, y, z) = (14.10, 9820.05, 46.20)
Acceleration[G]: (x, y, z) = (0.03, 0.01, 14.95)
Time Stamp: 0:2:46 (200[ms])
.
.
.
(と、取得したセンサーデータを出力し続ける。)

備考)計測開始直後は、上記ログの
Humidity[%RH]: -14.00
Temparature[degC]: -41.92
のように、異常な値が見えることがあるようです。

正常動作時は、10秒ごとにlog_ism_env_0123456789AB.txtファイルに、 気圧[hPa](pres)、湿度[%RH](hum)、温度[degC](tmp)、紫外線量[mW/cm^2](uvi)、照度[Lx](lux)、日付が、

pres=1012.41&hum=25.47&tmp=23.80&uvi=0.00&lux=25.28&date=15.10.1

log_ism_motion_0123456789AB.txtファイルに 10秒分のタイムスタンプ、地磁気(X,Y,Z)[uT](mag)、加速度(X,Y,Z)[G](acc)が、

time=0:4:6(300[ms])&mag=(13.65, 9822.60, 46.05)&acc=(0.03, 0.01, 14.95)
time=0:4:6(400[ms])&mag=(13.35, 9820.80, 46.35)&acc=(0.03, 0.01, 14.96)
.
.
.
time=0:4:16(100[ms])&mag=(13.80, 9820.80, 45.90)&acc=(0.03, 0.01, 14.96)
time=0:4:16(200[ms])&mag=(13.95, 9820.65, 46.05)&acc=(0.03, 0.00, 14.96)

のように出力されます。

<サンプルプログラムの補足>
serial_rn4020_ism_case3.c
Armadillo実践開発ガイド第2部 6.5.1. シリアルエコーサーバーをベースに今回のサンプル特有の箇所を抜粋します。)

/**** sample: interval timer :begin ****/
// タイマー関連。RN4020/IoTスマートモジュールと通信を行う際、期待通りのレスポンスがない場合のタイムアウト。
/**** sample: interval timer: end ****/
// IoTスマートモジュールのセンサー設定、計測開始、停止および接続停止のコマンド
/**** sample: RN4020 command for IoT Smart: begin ****/
static unsigned char cmd_ism_init[] = "CHW,0018,2F0303\n"; /* set iot smart: init */
static unsigned char cmd_ism_select_sensor[] = "CHW,0018,01037F\n"; /* set iot smart: select sensor */
static unsigned char cmd_ism_measure_mode[] = "CHW,0018,040304\n"; /* set iot smart: measure mode */
static unsigned char cmd_ism_fast_interval[] = "CHW,0018,06046400\n"; /* set iot smart: fast interval */
static unsigned char cmd_ism_slow_interval[] = "CHW,0018,05040A00\n"; /* set iot smart: slow interval */
//static unsigned char cmd_ism_save[] = "CHW,0018,2F0301\n"; /* set iot smart: save setting */
static unsigned char cmd_ism_start[] = "CHW,0018,200301\n"; /* set iot smart: start */
static unsigned char cmd_ism_stop[] = "CHW,0018,200300\n"; /* set iot smart: stop */
static unsigned char cmd_disconnect[] = "K\n"; /* disconnect */
/**** sample: RN4020 command for IoT Smart: end ****/
 
/**** sample: RN4020/IoT Smart response: begin ****/
// IoTスマートモジュールのセンサーデータ通知とRN4020のレスポンス
/*static unsigned char res_connect[] = "Connected"; *//* rn4020 response: connect */
static unsigned char res_disconnect[] = "Connection End"; /* rn4020 response: disconnect */
static unsigned char res_notify[] = "Notify,0012"; /* iot smart response: notify from custom1*/
static unsigned char res_notify_status[] = "Notify,0012,E0"; /* iot smart response: notify from custom1 and staus */
/**** sample: RN4020/IoT Smart response: end ****/
/**** sample: IoT Smart motion data: begin ****/
// モーションセンサーのデータ(タイムスタンプ、地磁気、加速度)用の構造体
/**** sample: IoT Smart motion data: end ****/
 
/**** sample: char(HEX) to int: begin ****/ 
// テキストの16進数を10進数に変える関数
/**** sample: char(HEX) to int: end ****/ 
 
/**** sample: variable: begin ****/ 
// ログファイル名
    char env_file[100];
    char motion_file[100];
// コマンドレスポンス、データ通知に対するフラグ
    int flag_notify, flag_period, flag_1shot, flag_disconnect;
/**** sample: variable: end ****/
 
/**** sample: variable for senseor data: begin ****/
// 変数定義:気圧、湿度、温度、紫外線量、照度、地磁気、加速度、日付、タイムスタンプ
/**** sample: for senseor data: end ****/
 
/**** sample: log file name: begin ****/
// ログファイル名
/**** sample: log file name: end ****/
/**** sample: RN4020 command(CHW to set IoT Smart: Init): begin ****/
// センサー設定の初期化と、レスポンス(Notify,0012,E0)の確認
/**** sample: RN4020 command(CHW to set IoT Smart: Init): end ****/
 
/**** sample: RN4020 command(CHW to set IoT Smart: Select Sensor): begin ****/
// センサー選択と、レスポンス(Notify,0012,E0)の確認
/**** sample: RN4020 command(CHW to set IoT Smart: Select Sensor): end ****/
 
/**** sample: RN4020 command(CHW to set IoT Smart: Mesure Mode): begin ****/
// 測定モードの選択と、レスポンス(Notify,0012,E0)の確認
// ※)測定モードの切り替え用に10秒ウェイト。
    sleep(10); /* wait for IoT Smart changes mesure mode*/
/**** sample: RN4020 command(CHW to set IoT Smart: Mesure Mode): end ****/
 
/**** sample: RN4020 command(CHW to set IoT Smart: Fast Interval): begin ****/
// モーションセンサーの測定間隔の設定と、レスポンス(Notify,0012,E0)の確認
// ※)測定モードの切り替え用に10秒ウェイト。
    sleep(10); /* wait for IoT Smart changes mesure mode*/
/**** sample: RN4020 command(CHW to set IoT Smart: Fast Interval): end ****/
 
/**** sample: RN4020 command(CHW to set IoT Smart: Slow Interval): begin ****/
// 環境系センサーの測定間隔の設定と、レスポンス(Notify,0012,E0)の確認
// ※)測定モードの切り替え用に10秒ウェイト。
    sleep(10); /* wait for IoT Smart changes mesure mode*/
/**** sample: RN4020 command(CHW to set IoT Smart: Slow Interval): end ****/
 
/**** sample: RN4020 command(CHW to set IoT Smart: Start): begin ****/
// IoTスマートモジュールの測定開始とセンサーデータの取得
// プログラム実行時の
// serial_rn4020_case3 <device> <id> [0,1]
// の末尾の引数の頭の文字が'0'なら永久ループ。それ以外は、環境系センサーのデータ取得時点でループを抜ける。
/**** sample: analize sensor data(motion): begin ****/
// モーションセンサーのデータ(地磁気、加速度、タイムスタンプ)の取得。詳細は後述。
/**** sample: analize sensor data(motion): end ****/
 
/**** sample: sensor data(motion) to buffer: begin ****/
// モーションセンサーのデータ(地磁気、加速度、タイムスタンプ)を配列に格納。
// 100msごとに取得して、10秒ごとに100回分をファイルに書き込む。
/**** sample: sensor data(motion) to buffer: end ****/
 
/**** sample: analize sensor data(env): begin ****/
// 環境系センサーのデータ(気圧、湿度、温度、紫外線量、照度、日付)の取得。詳細は後述。
/**** sample: analize sensor data(env): end ****/
 
/**** output sensor data(env) to stdout: begin ****/
// 環境系センサーのデータ(気圧、湿度、温度、紫外線量、照度、日付)を標準出力。
/**** output sensor data(env) to stdout: end ****/
 
/**** sample: sensor data(env) to log file for post to heroku: begin ****/
// 環境系センサーのデータ(気圧、湿度、温度、紫外線量、照度、日付)をファイルに出力。
/**** sample: sensor data(env) to log file for post to heroku: end ****/
 
/**** sample: output latest sensor data(motion) to stdout: begin ****/
// モーションセンサーのデータ(地磁気、加速度、タイムスタンプ)を標準出力。
/**** sample: output latest sensor data(motion) to stdout: end ****/
 
/**** sample: sensor data(motion) to log file: begin ****/
// モーションセンサーのデータ(地磁気、加速度、タイムスタンプ)をファイルに出力。
/**** sample: sensor data(motion) to log file: end ****/
/**** sample: RN4020 command(CHW to set IoT Smart: Start): end ****/
 
/**** sample: RN4020 command(CHW to set IoT Smart: Stop): begin ****/
// IoTスマートモジュールの計測停止
/**** sample: RN4020 command(CHW to set IoT Smart: Stop): end ****/
 
/**** sample: RN4020 command(K to disconnect IoT Smart): begin ****/
// BLEの接続停止
/**** sample: RN4020 command(K to disconnect IoT Smart): end ****/

補足1)
// ※)測定モードの切り替え用に10秒ウェイト。
は、
 Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の
 温度、湿度、気圧、照度等を取得

 5.IoTスマートモジュールのコマンドレスポンスについて気になったこと
より、接続パラメータ更新に数秒かかることから、10秒のウェイトをいれています。

補足2)上記の
/**** sample: analize sensor data(motion): begin ****/
/**** sample: analize sensor data(motion): end ****/
/**** sample: analize sensor data(env): begin ****/
/**** sample: analize sensor data(env): end ****/
にて行われている、
 モーションセンサーのデータ(地磁気、加速度、タイムスタンプ)
 環境系センサーのデータ(気圧、湿度、温度、紫外線量、照度、日付)
は、
Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の
 温度、湿度、気圧、照度等を取得

 6.IoTスマートモジュールのセンサーデータの確認
に基づいて、Notificationのデータから抽出し、計算を行っています。

モーションセンサーのデータ(地磁気、加速度、タイムスタンプ)が、IoTスマートモジュールからのNorfificationのログ
例)
Notify,0012,F21469FFE8016C016F0000007DEF00000C150001. の何バイト目にあるかは下記のとおりです。(MSB、LSBの順に並び替え済みです。)

######################################################
Notify: 0-5
,: 6
0012: 7-10
,: 11
EventCode: 12,13
Length: 14,15
MagneticX: 18,19,16,17
MagneticY: 22,23,20,21
MagneticZ: 26,27,24,25
AccelerationX: 30,31,28,29
AccelerationY: 34,35,32,33
AccelerationZ: 38,39,36,37
TimeStampMs: 42,43,40,41
TimeStampS: 44,4512
TimeStampM: 46,47
TimeStmapH: 48,49
DataIndex: 50,51
######################################################

環境系センサーのデータ(気圧、湿度、温度、紫外線量、照度、日付)が、IoTスマートモジュールからのNorfificationのログ
例)
Notify,0012,F314EEE19C0A940D0200100000000000010A0F01. の何バイト目にあるかは下記のとおりです。(MSB、LSBの順に並び替え済みです。)

######################################################
Notify: 0-5
,: 6
0012: 7-10
,: 11
EventCode: 12,13
Length: 14,15
Pressure: 18,19,16,17
Humidity: 22,23,20,21
Temparature: 26,27,24,25
UV: 30,31,28,29
AmbientLight: 34,35,32,33
Reserve: 38,39,36,37
Reserve: 42,43,40,41
DataStampDay: 44,45
DataStampMonth: 46,47
DataStampYear: 48,49
DataIndex: 50,51
######################################################

上記の方法で各センサーデータを抽出した後、 IoT Smart Moduleコマンドガイドより、
 5.通知データ構造
 5.1 データパケット1
 5.2 データパケット2
の計算方法で計算しています。

6.クラウド(Heroku)側のアプリの準備

6.1.準備
まず、Armadillo-IoT + Heroku(Node.js)でHello World のとおり、Armadillo側からのデータ送信と動作確認まで行ってください。
以下、この手順を実行したことをベースに説明します。
よって以下では、ATDE5の ~/temp/myapp がクラウド(Heroku)側のアプリ用のディレクトリとします。

6.2.サンプル

クラウド(Heroku)側のアプリのサンプルソースを添付します。
myapp_iotsmart_20160221.tar.gz を解凍して、myapp_iotsmart_20160221ディレクトリの中身を ~/temp/myapp ディレクトリの下にコピーしてください。

<サンプルソースの説明>
今回のサンプル特有の部分のみ説明します。

app.js

・HerokuのURL(***.herokuapp.com)にアクセスした際、index.ejsを表示するようにします。
 表示の際、index.ejsにid、気圧、湿度、温度、紫外線量、照度、日付、地磁気、加速度、タイムスタンプを与えています。

app.get('/', function(req, res){
  res.render('index', {id: id, pres: pres, hum: hum, tmp: tmp, uvi: uvi, lux: lux, mag: mag, acc: acc, date: date, time: time,
id2: id2, pres2: pres2, hum2: hum2, tmp2: tmp2, uvi2: uvi2, lux2: lux2, mag2: mag2, acc2: acc2, date2: date2, time2: time2});
});

備考)末尾に'2'がついている変数は、今回使用していません。

・HerokuのURL(***.herokuapp.com/series)にポストされたデータ(※)をパースして、上記のindex.ejsに渡す変数に代入しています。
※)上記サンプルアプリ(serial_rn4020_ism_case3)を実行時のログファイル
log_ble_connect.txt
log_ism_env_[MACアドレス].txt
log_ism_motion_[MACアドレス].txt
の内容をスクリプトで合成して、生成される

id=0123456789AB&pres=1012.41&hum=25.47&tmp=23.80&uvi=0.00&lux=25.28&date=15.10.1&time=0:4:16(200[ms])&mag=(13.95, 9820.65, 46.05)&acc=(0.03, 0.00, 14.96)

という形式のデータです。"&"で温度、湿度等の各データを区切っています。

app.post('/series', function(req, res) {
    console.log('post:/series');
 
    id = req.body.id;        // 識別子
    pres = req.body.pres;    // 気圧
    hum = req.body.hum;        // 湿度
    tmp = req.body.tmp;        // 温度
    uvi = req.body.uvi;        // 紫外線量
    lux = req.body.lux;        // 照度
    date = req.body.date;    // 日付
 
    mag = req.body.mag;        // 地磁気
    acc = req.body.acc;        // 加速度
    time = req.body.time;    // タイムスタンプ
 
    id2 = req.body.id2;        // 識別子(今回は未使用)
    pres2 = req.body.pres2;    // 気圧(今回は未使用)
    hum2 = req.body.hum2;    // 湿度(今回は未使用)
    tmp2 = req.body.tmp2;    // 温度(今回は未使用)
    uvi2 = req.body.uvi2;    // 紫外線量(今回は未使用)
    lux2 = req.body.lux2;    // 照度(今回は未使用)
    date2 = req.body.date2;    // 日付(今回は未使用)
 
    mag2 = req.body.mag2;    // 地磁気(今回は未使用)
    acc2 = req.body.acc2;    // 加速度(今回は未使用)
    time2 = req.body.time2;    // タイムスタンプ(今回は未使用)
 
    res.send("Received\n");
});
view/index.ejs

・上記app.get('/', function(req, res)により、受け取ったIoTスマートモジュールのセンサーデータを表示するhtmlです。

6.3.サンプルの実行

下記のコマンドで、クラウド(Heroku)にアップロードします。

[atde ~/temp/myapp]$ git add --all
[atde ~/temp/myapp]$ git commit -m "iotsmart"
[atde ~/temp/myapp]$ git push heroku master:master

6.4.アプリの動作確認

Webブラウザで https://***.herokuapp.com (***.herokuapp.comの部分は、手順6.1で確認したHerokuのURL) を実行すると、冒頭のWebブラウザの写真のように表示されます。 (ここまでの手順では、データを受信してないので、各値はオール0になります。)

7.IoTスマートモジュールのデータをクラウド(Heroku)で見る

Armadillo-IoTからIoTスマートモジュールのデータをクラウドに送信するスクリプト x1_send_rn4020_iotsmart.sh を添付します。

このスクリプトをArmadillo-IoTの/rootディレクトリに置いて、実行権限をつけてください。 サンプルプログラムserial_rn4020_set、serial_rn4020_ism_connectserial_rn4020_ism_case3もArmadillo-IoTの/rootディレクトリに置いて実行します。

[armadillo ~]# ls /root
x1_send_rn4020_iotsmart.sh
[armadillo ~]# chmod +x x1_send_rn4020_iotsmart.sh
[armadillo ~]# ls /root
serial_rn4020_set
serial_rn4020_ism_case3
serial_rn4020_ism_connect
x1_send_rn4020_iotsmart.sh

x1_send_rn4020_iotsmart.shは、下記のように使用します。

x1_send_rn4020_iotsmart.sh <device> <id> <HerokuのURL>
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")
 id:IoTスマートモジュールのMACアドレス
 HerokuのURL:手順6.1で確認したHerokuのURL

例)RN4020アドオンをArmadillo-IoTのアドオンインタフェースのCON1(/dev/ttymxc3)に接続し、 IoTスマートモジュールのMACアドレスが"01:23:45:67:89:AB"で、HerokuのURLが***.herokuapp.comの場合、 下記のように実行します。

[armadillo ~]# ./x1_send_rn4020_iotsmart.sh /dev/ttymxc3 0123456789AB https://***.herokuapp.com/series

上記のスクリプトを実行すると、Armadillo-IoTはIoTスマートモジュールの ID(MACアドレス)、気圧、湿度、温度、紫外線量、照度、日付、地磁気、加速度、タイムスタンプのデータを
log_ble_connect.txt
log_ism_env_[MACアドレス].txt
log_ism_motion_[MACアドレス].txt
から読みだして、クラウド(Herokuのhttps://***.herokuapp.com/series)に約7秒ごとに送信します。

補足)モーションセンサー(地磁気、加速度、タイムスタンプは、log_ism_motion_[MACアドレス].txtの末尾(最新)のデータのみを送信しています。

Webブラウザで、https://***.herokuapp.comにアクセスすると、Armadillo-IoTが送信したIoTスマートモジュールのデータが冒頭のWebブラウザの写真のように見ることができます。

補足)
Webブラウザの表示の更新には再読み込みが必要です。 今回の設定の場合は、IoTスマートモジュールの環境系センサーの通信間隔(10秒)に合わせてデータが更新されるので、Webブラウザの表示の更新間隔は10-20秒程度になります。
クラウド(Heroku)側のアプリがデータを受信した場合は、"Received"という文字 Armadillo-IoTに送信するので、クラウド(Heroku)側が受け取ったかどうかを、Armadillo-IoTの標準出力で確認することができます。

Appendix.複数のIoTスマートモジュールについて、接続を切り替えながら、センサーデータを取得

手順
 2.IoTスマートモジュールからのデータ受信方法の検討
にて説明しましたとおり、RN4020は
同時接続数:1
なので、複数のIoTスマートモジュールを同時に接続することはできません。

ただ、接続の切り替えが許容される(センサーデータの取得間隔が長くてもいい等)ならば、 複数のIoTスマートモジュールの接続を切り替えながら、センサーデータを取得する方法があります。

ここでは、2つのIoTスマートモジュールの接続を切り替えながら、センサーデータを取得して、 クラウド(Heroku)に送信するようにしてみます。

ここでの動作確認は下図のような構成です。

上記手順のサンプルプログラムの
serial_rn4020_set
serial_rn4020_ism_case3
serial_rn4020_ism_connect
とクラウド側のアプリ(myapp)は、同じものを使用します。

Armadillo-IoTからIoTスマートモジュールのデータをクラウドに送信するスクリプト x2_send_rn4020_iotsmart.sh を添付します。

このスクリプトをArmadillo-IoTの/rootディレクトリに置いて、実行権限をつけてください。
サンプルプログラムserial_rn4020_set、serial_rn4020_ism_connect serial_rn4020_ism_case3も Armadillo-IoTの/rootディレクトリに置いて実行します。

[armadillo ~]# ls /root
x1_send_rn4020_iotsmart.sh
[armadillo ~]# chmod +x x2_send_rn4020_iotsmart.sh
[armadillo ~]# ls /root
serial_rn4020_set
serial_rn4020_ism_case3
serial_rn4020_ism_connect
x2_send_rn4020_iotsmart.sh

x2_send_rn4020_iotsmart.shは、下記のように使用します。

x2_send_rn4020_iotsmart.sh <device> <id> <id2> <HerokuのURL>
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")
 id:IoTスマートモジュールのMACアドレス(1つ目)
 id2:IoTスマートモジュールのMACアドレス(2つ目)
 HerokuのURL:手順6.1で確認したHerokuのURL

例)RN4020アドオンをArmadillo-IoTのアドオンインタフェースのCON1(/dev/ttymxc3)に接続し、 IoTスマートモジュールのMACアドレスが"01:23:45:67:89:AB" IoTスマートモジュールのMACアドレスが"FE:DC:BA:98:76:54" で、HerokuのURLが***.herokuapp.comの場合、 下記のように実行します。

[armadillo ~]# ./x2_send_rn4020_iotsmart.sh /dev/ttymxc3 0123456789AB FEDCBA987654 https://***.herokuapp.com/series

上記のスクリプトを実行すると、Armadillo-IoTは2つのIoTスマートモジュールに交互に接続して、 ID(MACアドレス)、気圧、湿度、温度、紫外線量、照度、日付、地磁気、加速度、タイムスタンプのデータを
log_ble_connect.txt
log_ism_env_[MACアドレス(1つ目)].txt
log_ism_motion_[MACアドレス(1つ目)].txt
log_ism_env_[MACアドレス(2つ目)].txt
log_ism_motion_[MACアドレス(2つ目)].txt
から読みだして、クラウド(Herokuのhttps://***.herokuapp.com/series)に交互に送信します。

補足1)接続の切り替えは、サンプルプログラム

serial_rn4020_case3 <device> <id> [0,1]
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")
 id:BLEのMACアドレス(":"は抜く)
 [0,1]:先頭文字が0なら永久ループでセンサーデータを取得。それ以外は、環境(温度、湿度等)を取得した時点で接続停止。

の末尾の引数を"1"にすることによって、環境系センサー(温度、湿度等)のデータを取得(10秒毎)すると、接続を停止させて、
id:BLEのMACアドレス(":"は抜く)
を変更して再実行することによって実現しています。
(log_ble_connect.txtには、接続している側のMACアドレスが書き込まれます。)

補足2)
x2_send_rn4020_iotsmart.shでは、接続の切り替えをsleepで簡易的にしています。 また、モーションセンサーの通知(100ms)が生きているため、頻繁に通信しています。 そのためか、時々データが正常に取得できないことがあります。

接続の切り替えの条件をログで判断したり、 serial_rn4020_ism_case3で、

CHW,0018,01037F // 全センサーを選択
CHW,0018,040304 // モーション/環境計測(Hybridモード)を選択
CHW,0018,06046400 // モーション(動き等)の計測間隔(100ms)

に該当する設定で、モーションセンサーを停止するか、計測間隔を広げることで、安定するかと思いますが、ここでは割愛します。