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(日付)は、環境センサ(子機)のデータではなく、
スクリプト内で付加しています。)