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