ブログ

Armadillo-IoT(G3L): 920MHz無線通信の環境センサモジュール 開発キットを使って、温度、湿度、気圧、照度等のデータをクラウド(Heroku)経由で見る

at_kazutaka.bito
2017年8月7日 18時46分

Armadillo-IoT(G3L)

とアルプス電気株式会社様の環境センサモジュール 開発キット

を使って、温度、湿度、気圧、照度等を読み取って、クラウド(Heroku)経由で見てみました。

(ブラウザのURLの部分は、後述の手順でHerokuから割り当てられたURLになりますので、伏字(***.herokuapp.com)にしてます。)
(画面の表内のIDの列は、下記手順の方法ではセンサーのIDが表示されますが、上図ではダミーに置き換えています。)

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

備考)
本説明内にて、環境センサのIDは、今回確認した環境センサのIDではなく、
ダミーのID(11111111等)に置き換えて記述しています。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

以下、
環境センサモジュール 開発キット内の名称について、
USB受信モジュール(親機)は、そのまま「USB受信モジュール(親機)」
ソーラーパネル式子機、電池式子機を、「環境センサ(子機)」
と呼称しています。

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

手順の概要は下記のようになります。
●1.機材
●2.USB受信モジュール(親機)との通信方式の設定
●3.環境センサ(子機)からのセンサーデータの確認
●4.環境センサ(子機)からのセンサーデータを取得するためのサンプルプログラム
●5.クラウド(Heroku)側のアプリの準備
●6.環境センサ(子機)のデータをクラウド(Heroku)で見る

●1.機材

機材は下記のものを使用しました。
・Armadillo-IoT(G3L)
環境センサモジュール 開発キット
 ここでは、環境センサ(子機)は、開発セットに同梱の2個とは別に3個追加して、5個使用しました。

Armadillo-IoT(G3L)にUSB受信モジュール(親機)を接続します。
下記のように認識されているログが表示されます。

root@armadillo:~# 
usb 1-1: new full-speed USB device number 2 using ci_hdrc
ftdi_sio 1-1:1.0: FTDI USB Serial Device converter detected
usb 1-1: Detected FT232RL
usb 1-1: Number of endpoints 2
usb 1-1: Endpoint 1 MaxPacketSize 64
usb 1-1: Endpoint 2 MaxPacketSize 64
usb 1-1: Setting MaxPacketSize 64
usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0

上記のログより、USBシリアルコンバーターはttyUSB0として認識されています。
以降の説明において、USB受信モジュール(親機)のデバイスファイルは、"/dev/ttyUSB0"の場合で説明します。

●2.USB受信モジュール(親機)との通信方式の設定

環境センサモジュール開発キットの操作マニュアルに応じて設定を行います。
・シリアル通信設定:Baudrate:115200、Data:8bit、Parity:No、Stop:1bit、Flow control:No
・表示モード設定:asciiモード(シリアル通信で"set1"と設定します。)

Armadillo-IoT(G3L)では下記のように設定します。

root@armadillo:~# stty -F /dev/ttyUSB0 115200
root@armadillo:~# echo "set1" > /dev/ttyUSB0

●3.環境センサ(子機)からのセンサーデータの確認

Armadillo-IoTで環境センサ(子機)のデータを確認します。
環境センサ(子機)の電源がONのとき、下記のようにcuコマンドを実行すると、シリアル通信でデータを確認できます。
(環境センサ(子機)のデータについては、IDは伏字"********"にしています。)

root@armadillo:~# cu -l /dev/ttyUSB0 -s 115200
Connected.
No.8,   TxID=********, TEMP=+ 25.4[degC], HUMI= 52.3[%RH], PRES=1018.66[hPa], LIGHT=  316[Lx]/1.2, DOOR=1(Open),  VBAT=2.6[V], RSSI=-48

備考)cuコマンドを実行するとシリアル通信中になります。"~."と入力すると終了します。("~."は、表示されません。)

環境センサ(子機)からのデータは、
 No.:データのインデックス
 TxID:環境センサ(子機)のID
 TEMP:温度
 HUMI:湿度
 PRES:気圧
 LIGHT:照度
 DOOR:開閉
 VBAT:バッテリ電圧
 RSSI:RSSI
を意味しています。

●4.環境センサ(子機)からのセンサーデータを取得するためのサンプルプログラム

手順3で確認しました、シリアル通信をつかって環境センサ(子機)のデータを取得するためのサンプルプログラムを作成しました。
serial_wr_act1_20170802.tar.gz

<サンプルプログラムのビルド方法>
まず、Armadillo-IoT(G3L)上で、サンプルプログラムをビルドするための準備を行います。
Armadillo-IoT ゲートウェイ G3L製品マニュアル 12.5. C言語による開発環境
より、Armadillo-IoT(G3L)をインターネットに接続できるネットワークに接続して、パッケージ情報の更新して、 build-essentialをインストールします。
(下記は、日付を2017.8.2、16:04に設定した場合)

root@armadillo:~# date 080216042017.00
root@armadillo:~# apt-get update
root@armadillo:~# apt-get upgrade
root@armadillo:~# apt-get install build-essential

添付のサンプルプログラムをArmadillo-IoT(G3L)に解凍します。

serial_wr_act1_20170802ディレクトリ内でmakeすると、serial_wr_act1という実行ファイルが生成されます。

ここでは、実行ファイル"serial_wr_act1"を/rootディレクトリにコピーして使用することにしています。
(下記は、serial_wr_act1_20170802ディレクトリを/root/srcディレクトリに移動しています。)

root@armadillo:~# ls serial_wr_act1_20170802.tar.gz
serial_wr_act1_20170802.tar.gz
root@armadillo:~# tar zxvf serial_wr_act1_20170802.tar.gz
root@armadillo:~# mkdir src
root@armadillo:~# mv serial_wr_act1_20170802 src/
root@armadillo:~# cd src/serial_wr_act1_20170802
root@armadillo-iotg:~/src/serial_wr_act1_20170802# make
root@armadillo-iotg:~/src/serial_wr_act1_20170802# cp serial_wr_act1 /root/
root@armadillo-iotg:~/src/serial_wr_act1_20170802# cd
root@armadillo:~# ls serial_wr_act1
serial_wr_act1

<サンプルプログラムの用法>
serial_wr_act1は、下記の引数で実行します。

serial_wr_act1 <dev> <string>
引数
 dev:シリアルインタフェースのデバイスファイル名(手順1より、ここでは、"/dev/ttyUSB0")
 string:文字列(手順4より、ここでは、"set1")

下記は実行例(serial_wr_act1を/root/ディレクトリに置いた場合)です。
"set1"コマンドの送信後、環境センサ(子機)からデータ(asciiコードのセンサーデータ)を受信する毎(初期設定は20秒毎)に
標準出力への表示と、/root/log_serial.txtファイルへの出力を行います。

root@armadillo:~# /root/serial_wr_act1 /dev/ttyUSB0 "set1"
 
****************************************************
-------- Write: set1
set1
SET OK
No.6,   TxID=********, TEMP=+ 24.6[degC], HUMI= 57.6[%RH], PRES=1015.83[hPa], LIGHT=  288[Lx]/1.2, DOOR=1(Open),  VBAT=2.6[V], RSSI=-42
(以降、環境センサ(子機)からデータを受信するごと(20秒毎)に追加されます。)

/root/log_serial.txtファイルには、シリアル通信の内容が出力されます。
環境センサ(子機)からデータを取得した際は下記のような内容になっています。

root@armadillo:~# cat log_serial.txt
No.6,   TxID=********, TEMP=+ 24.6[degC], HUMI= 57.6[%RH], PRES=1015.83[hPa], LIGHT=  288[Lx]/1.2, DOOR=1(Open),  VBAT=2.6[V], RSSI=-42

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

/**** sample: write data: begin ****/
// シリアル通信の送信データ(ここでは、環境センサ(子機)からのデータ形式をasciiコードに設定するため、"set1"になる。)
/**** sample: write data: end ****/
/**** sample: Write data and Read response: begin ****/
// シリアル通信で文字列を送信(ここでは、環境センサ(子機)からのデータ形式をasciiコードに設定するため、"set1"になる。)
/**** sample: Read Serial Data:: begin ****/
// シリアル通信で受信
// 改行文字を受信した場合、
// 1行分の受信データを標準出力に表示。
// 1行分の受信データを/root/log_serial.txtファイルに出力。
/**** sample: execute "sample_action.sh" if it's exist: begin ****/
// /root/sample_action.shファイルが存在すれば、実行。
/**** sample: execute "sample_action.sh" if it's exist: end ****/
/**** sample: Read Serial Data:: end ****/
/**** sample: Write data and Read response: end ****/

補足)
上記のプログラム内で実行することが可能な/root/sample_action.shの用法については、手順7で説明します。

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

5.1.準備
まず、Armadillo-IoT + Heroku(Node.js)でHello World のとおり、
Armadillo側からのデータ送信と動作確認まで行ってください。
以下、この手順を実行したことをベースに説明します。

よって以下では、ATDE5の
~/temp/myapp
がクラウド(Heroku)側のアプリ用のディレクトリとします。

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

<サンプルソースの説明>
今回のサンプル特有の部分のみ説明します。
app.js
・HerokuのURL(***.herokuapp.com)にアクセスした際、index.ejsを表示します。
・HerokuのURL(***.herokuapp.com/series)にポストされたデータ(※)をパースして、index.ejsに渡す変数に代入しています。
※)Armadillo-IoTから下記のようなデータを受信することを想定しています。

 num0  // センサーの番号(ここでは、環境センサ(子機)を2個使用するので、0または、1)
 name0  // センサーの名前(ここでは、"IoT Smart Module"という名前)
 id0  // ID(環境センサ(子機)から受信したID)
 date0  // 日付 (Armadillo-IoTのdateコマンドで取得)
 no0 // データのインデックス(環境センサ(子機)から受信したデータのインデックス)
 press0 // 温度(環境センサ(子機)から受信した温度)
 hum0  // 湿度(環境センサ(子機)から受信した湿度)
 temp0 // 気圧(環境センサ(子機)から受信した気圧)
 amb0 // 照度(環境センサ(子機)から受信した照度)
 door0 // 開閉(環境センサ(子機)から受信した開閉)
 vbat0 // バッテリ電圧(環境センサ(子機)から受信したバッテリ電圧)
 rssi0  // RSSI(環境センサ(子機)から受信したRSSI)
app.post('/series', function(req, res) {
 console.log('post:/series');
 
 var obj_num = Number(req.body.num0);
 
 if(obj_num >=0 && obj_num < 5) {
  text_all = JSON.stringify(
   [
    {
     num0: req.body.num0,
     name0: req.body.name0,
     id0: req.body.id0,
     date0: req.body.date0,
     no0: req.body.no0,
     press0: req.body.press0,
     hum0: req.body.hum0,
     temp0: req.body.temp0,
     amb0: req.body.amb0,
     door0: req.body.door0,
     vbat0: req.body.vbat0,
     rssi0: req.body.rssi0,
    }
   ]
  );
 io.sockets.emit('returnData', text_all);
 }
 
 res.send("Received\n");
});

view/index.ejs
・Armadillo-IoTから受け取った環境センサ(子機)のセンサーデータを表示します。
・Armadillo-IoTからデータを受信するごとに、表、グラフが更新されます。
・表:最後に受信したデータを表示します。
・グラフ:0番目の環境センサ(子機)の照度の値(黄色の箇所)の遷移を表示します。
補足) InternetExplorerで閲覧する場合は、このソースコードでは正常に表、グラフの更新ができません。
chart.push(series);
をコメントアウトすると、グラフの更新はできませんが、表の更新は行われます。

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

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

5.4.アプリの動作確認
Webブラウザで
https://***.herokuapp.com
***.herokuapp.comの部分は、手順5.1で確認したHerokuのURL)
にアクセスすると、冒頭のWebブラウザの写真のうち、表の部分がデフォルト値"-"で埋められて表示されます。

●6.環境センサ(子機)のデータをクラウド(Heroku)経由で見る

Armadillo-IoTから環境センサ(子機)のデータをクラウドに送信するためのスクリプト
ism_subg_script_20170802.tar.gz
を添付します。

<サンプルスクリプトの用法>
ism_subg_script_20170802.tar.gz内のスクリプトをArmadillo-IoTの/rootディレクトリに置いて、実行権限を付けます。
(下記は、ism_subg_script_20170802.tar.gzを/rootディレクトリに置いた場合)

root@armadillo:~# ls ism_subg_script_20170802.tar.gz
ism_subg_script_20170802.tar.gz
root@armadillo:~# tar zxvf ism_subg_script_20170802.tar.gz
root@armadillo:~# mv ism_subg_script_20170802/* /root/
root@armadillo:~# chmod +x sample_action.sh
root@armadillo:~# chmod +x send_ism_subg.sh

sample_action.shファイル内の

DEV_ID0=***
DEV_ID1=***
DEV_ID2=***
DEV_ID3=***
DEV_ID4=***

***の部分は、環境センサ(子機)のIDを設定します。
ここでは、5つの環境センサ(子機)のIDを設定します。
例えば、5つの環境センサ(子機)のIDが、"11111111"、"22222222"、"33333333"、"44444444"、"55555555"の場合は、

DEV_ID0=11111111
DEV_ID1=22222222
DEV_ID2=33333333
DEV_ID3=44444444
DEV_ID4=55555555

のように設定します。

SEND_URL=***

***の部分は、手順5.1で確認したHerokuのURL(***.herokuapp.com/series)に置き換えてください。

手順4と同様に、serial_wr_act1を実行します。
上記手順で追加したsample_action.shとsend_ism_subg.sh(説明は後述)により、
sample_action.shに設定した環境センサ(子機)のIDのデータを受信すると、
手順6のHeroku上のアプリにセンサーデータを送信します。
(下記ログの環境センサ(子機)のID(TxIDの箇所)は、上記sample_action.shの設定例の"11111111"、"22222222"に置き換えています。)

root@armadillo:~# /root/serial_wr_act1 /dev/ttyUSB0 "set1"
****************************************************
-------- Write: set1
sh: No.: unknown operand
SET OK
No.58,  TxID=11111111, TEMP=+ 25.4[degC], HUMI= 52.1[%RH], PRES=1018.49[hPa], LIGHT=  116[Lx]/1.2, DOOR=1(Open),  VBAT=2.6[V], RSSI=-39
num0=0&name0=IoT Smart Module&no0=58&id0=12345678&date0=2017/08/02 13:55:11&temp0=25.4&hum0=52.1&press0=1018.49&amb0=116&door0=1(Open)&vbat0=2.6&rssi0=-39
Received
No.59,  TxID=22222222, TEMP=+ 23.4[degC], HUMI= 57.7[%RH], PRES=1018.00[hPa], LIGHT=  936[Lx]/1.2, DOOR=1(Open),  VBAT=0.1[V], RSSI=-78
num0=1&name0=IoT Smart Module&no0=59&id0=87654321&date0=2017/08/02 13:55:21&temp0=23.4&hum0=57.7&press0=1018.00&amb0=936&door0=1(Open)&vbat0=0.1&rssi0=-78
Received

serial_wr_act1が実行されている状態で、
Webブラウザで、https://***.herokuapp.comにアクセスすると、
冒頭のWebブラウザの写真のように環境センサ(子機)のデータを見ることができます。

<サンプルスクリプトの補足>
sample_action.sh: 手順5のサンプルプログラムserial_wr_act1で実行されます。
 serial_wr_act1実行中にシリアル通信で改行文字を受信したときに実行されます。
 後述のsend_ism_subg.shを、5つの環境センサ(子機)のID(DEV_ID0~5)とHerokuのURL(SEND_URL)を引数として実行します。

send_ism_subg.sh: 上記のsample_action.shで実行されます。
 serial_wr_act1によって生成されるログファイルlog_serial.txtより、環境センサ(子機)のIDを検出して、
 Herokuにセンサーデータを送信します。

send_ism_subg.sh <id0> <id1> <id2> <id3> <id4> <url>
引数
 id0: 環境センサ(子機)のID
 id1: 環境センサ(子機)のID
 id2: 環境センサ(子機)のID
 id3: 環境センサ(子機)のID
 id4: 環境センサ(子機)のID
 url: 手順5のHerokuのURL

log_serial.txtの内容

No.60,  TxID=11111111, TEMP=+ 23.5[degC], HUMI= 57.8[%RH], PRES=1017.93[hPa], LIGHT=  864[Lx]/1.2, DOOR=1(Open),  VBAT=0.1[V], RSSI=-77

を手順5のHerokuのアプリに合わせて、

num0=1&name0=IoT Smart Module&no0=60&id0=11111111&date0=2017/08/02 13:55:41&temp0=23.5&hum0=57.8&press0=1017.93&amb0=864&door0=1(Open)&vbat0=0.1&rssi0=-77

のように変換して、Herokuに送信します。
(num0(センサー番号)、name0(センサーの名前)、date0(日付)は、環境センサ(子機)のデータではなく、
 スクリプト内で付加しています。)