Armadillo-IoT(G2/G3)
とアルプス電気株式会社様の環境センサモジュール 開発キット
を使って、温度、湿度、気圧、照度等を読み取って、クラウド(Heroku)経由で見てみました。
(ブラウザのURLの部分は、後述の手順でHerokuから割り当てられたURLになりますので、伏字(***.herokuapp.com)にしてます。) (画面の表内のIDの列は、下記手順の方法ではセンサーのIDが表示されますが、上図ではダミーに置き換えています。)
当方で確認した手順、サンプルプログラムを下記に説明します。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
注意)
ここでは、当方が確認した簡易的な手順を示しているに過ぎません。(エラー処理等は考慮されていません。)
本格的には、環境センサモジュール との対話的な通信により、設定、エラー処理、フェイルセーフなどを行う必要があります。
備考)
本説明内にて、環境センサのIDは、今回確認した環境センサのIDではなく、
ダミーのID(12345678等)に置き換えて記述しています。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
以下、
環境センサモジュール 開発キット内の名称について、
USB受信モジュール(親機)は、そのまま「USB受信モジュール(親機)」
ソーラーパネル式子機、電池式子機を、「環境センサ(子機)」
と呼称しています。
今回の動作確認は下図のような構成です。
手順の概要は下記のようになります。
●1.機材
●2.Armadillo-IoTでUSB受信モジュール(親機)を使えるようにする
●3.USB受信モジュール(親機)との通信方式の設定
●4.環境センサ(子機)からのセンサーデータの確認
●5.環境センサ(子機)からのセンサーデータを取得するためのサンプルプログラム
●6.クラウド(Heroku)側のアプリの準備
●7.環境センサ(子機)のデータをクラウド(Heroku)で見る
●1.機材
機材は下記のものを使用しました。
・Armadillo-IoT(G2/G3)
・環境センサモジュール 開発キット
●2.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 full-speed USB device number 3 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"の場合で説明します。
●3.USB受信モジュール(親機)との通信方式の設定
環境センサモジュール開発キットの操作マニュアルに応じて設定を行います。
・シリアル通信設定:Baudrate:115200、Data:8bit、Parity:No、Stop:1bit、Flow control:No
・表示モード設定:asciiモード(シリアル通信で"set1"と設定します。)
Armadillo-IoTでは下記のように設定します。
[root@armadillo-iotg (ttymxc1) ~]# stty -F /dev/ttyUSB0 115200 [root@armadillo-iotg (ttymxc1) ~]# echo "set1" > /dev/ttyUSB0
●4.環境センサ(子機)からのセンサーデータの確認
Armadillo-IoTで環境センサ(子機)のデータを確認します。
環境センサ(子機)の電源がONになっていると、
Armadillo-IoT(G2)では、tipコマンドを実行すると、シリアル通信でデータを取得できます。
Armadillo-IoT(G3)では、cuコマンドを実行すると、シリアル通信でデータを取得できます。
Armadillo-IoT(G2)の場合は、下記のようになります。
(Armadillo-IoT(G3)の場合は、"tip -l /dev/ttyUSB0 -s 115200"の代わりに、"cu -l /dev/ttyUSB0 -s 115200"で実行します。
また、環境センサ(子機)のデータについては、IDは伏字"********"にしています。)
[root@armadillo-iotg (ttymxc1) ~]# tip -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
備考)tipコマンド、cuコマンドを実行するとシリアル通信中になります。"~."と入力すると終了します。("~."は、表示されません。)
環境センサ(子機)からのデータは、
No.:データのインデックス
TxID:環境センサ(子機)のID
TEMP:温度
HUMI:湿度
PRES:気圧
LIGHT:照度
DOOR:開閉
VBAT:バッテリ電圧
RSSI:RSSI
を意味しています。
●5.環境センサ(子機)からのセンサーデータを取得するためのサンプルプログラム
手順4で確認しました、シリアル通信をつかって環境センサ(子機)のデータを取得するためのサンプルプログラムを作成しました。
serial_wr_act1.tar.gz
<サンプルプログラムのビルド方法>
Armadillo-IoT(G2)とArmadillo-IoT(G3)ではビルド方法が異なります。
Armadillo-IoT(G2)の場合
添付のサンプルプログラムをATDEに解凍して、serial_wr_act1ディレクトリ内でmakeすると、 serial_wr_act1という実行ファイルが生成されます。 serial_wr_act1をArmadillo-IoTに置いて、実行権限をつけます。
[root@armadillo-iotg (ttymxc1) ~]# ls serial_wr_act1 serial_wr_act1 [root@armadillo-iotg (ttymxc1) ~]# chmod +x serial_wr_act1
Armadillo-IoT(G3)の場合
まず、Armadillo-IoT(G3)上で、サンプルプログラムをビルドするための準備を行います。
Armadillo-IoT ゲートウェイ G3製品マニュアル 12.5. C言語による開発環境
より、Armadillo-IoT(G3)をインターネットに接続できるネットワークに接続して、パッケージ情報の更新して、
build-essentialをインストールします。
(下記は、日付を2016.11.2、16:04に設定した場合)
root@armadillo-iotg:~# date 110216042016.00 root@armadillo-iotg:~# apt-get update root@armadillo-iotg:~# apt-get upgrade root@armadillo-iotg:~# apt-get install build-essential
添付のサンプルプログラムをArmadillo-IoT(G3)に解凍します。
serial_wr_act1ディレクトリ内のMakefileの1行目
CROSS := arm-linux-gnueabi
を
CROSS := arm-linux-gnueabihf
に変更します。
serial_wr_act1ディレクトリ内でmakeすると、serial_wr_act1という実行ファイルが生成されます。
ここでは、実行ファイル"serial_wr_act1"を/rootディレクトリにコピーして使用することにしています。
(下記は、serial_wr_act1ディレクトリを/root/srcディレクトリに移動しています。)
root@armadillo-iotg:~# ls serial_wr_act1.tar.gz serial_wr_act1.tar.gz root@armadillo-iotg:~# tar zxvf serial_wr_act1.tar.gz root@armadillo-iotg:~# mkdir src root@armadillo-iotg:~# mv serial_wr_act1 src/ root@armadillo-iotg:~# cd src/serial_wr_act1 root@armadillo-iotg:~# vi serial_wr_act1 (viエディタで、Makefileの1行目をCROSS := arm-linux-gnueabihfに変更。) root@armadillo-iotg:~/src/serial_wr_act1# make root@armadillo-iotg:~/src/serial_wr_act1# cp serial_wr_act1 /root/ root@armadillo-iotg:~/src/serial_wr_act1# cd root@armadillo-iotg:~# ls serial_wr_act1 serial_wr_act1
<サンプルプログラムの用法>
serial_wr_act1は、下記の引数で実行します。
serial_wr_act1 <dev> <string> 引数 dev:シリアルインタフェースのデバイスファイル名(手順2より、ここでは、"/dev/ttyUSB0") string:文字列(手順4より、ここでは、"set1")
下記は実行例(serial_wr_act1を/root/ディレクトリに置いた場合)です。 "set1"コマンドの送信後、環境センサ(子機)からデータ(asciiコードのセンサーデータ)を受信する毎(初期設定は20秒毎)に 標準出力への表示と、/root/log_serial.txtファイルへの出力を行います。
[root@armadillo-iotg (ttymxc1) ~]# /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-iotg (ttymxc1) ~]# 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で説明します。
●6.クラウド(Heroku)側のアプリの準備
6.1.準備
まず、Armadillo-IoT + Heroku(Node.js)でHello World のとおり、 Armadillo側からのデータ送信と動作確認まで行ってください。 以下、この手順を実行したことをベースに説明します。
よって以下では、ATDE5の ~/temp/myapp がクラウド(Heroku)側のアプリ用のディレクトリとします。
6.2.サンプル
クラウド(Heroku)側のアプリのサンプルソースを添付します。 myapp_ism_subg_20161031.tar.gz を解凍して、myapp_ism_subg_20161031ディレクトリの中身を ~/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 < 2) { 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);
をコメントアウトすると、グラフの更新はできませんが、表の更新は行われます。
6.3.サンプルの実行
下記のコマンドで、クラウド(Heroku)にアップロードします。
[atde ~/temp/myapp]$ git add --all [atde ~/temp/myapp]$ git commit -m "ism-subg" [atde ~/temp/myapp]$ git push heroku master:master
6.4.アプリの動作確認
Webブラウザで https://***.herokuapp.com (***.herokuapp.comの部分は、手順6.1で確認したHerokuのURL) にアクセスすると、冒頭のWebブラウザの写真のうち、表の部分がデフォルト値"-"で埋められて表示されます。
●7.環境センサ(子機)のデータをクラウド(Heroku)経由で見る
Armadillo-IoTから環境センサ(子機)のデータをクラウドに送信するためのスクリプト ism_subg_script_20161102.tar.gz を添付します。
<サンプルスクリプトの用法>
ism_subg_script_20161102.tar.gz内のスクリプトをArmadillo-IoT/rootディレクトリに置いて、実行権限を付けます。
(下記は、ism_subg_script_20161102.tar.gzを/rootディレクトリに置いた場合)
root@armadillo-iotg:~# ls ism_subg_script_20161102.tar.gz ism_subg_script_20161102.tar.gz root@armadillo-iotg:~# tar zxvf ism_subg_script_20161102.tar.gz root@armadillo-iotg:~# mv ism_subg_script_20161102/* /root/ root@armadillo-iotg:~# chmod +x sample_action.sh root@armadillo-iotg:~# chmod +x send_ism_subg.sh
sample_action.shファイル内の
DEV_ID0=*** DEV_ID1=***
の***の部分は、環境センサ(子機)のIDを設定します。
ここでは、環境センサモジュール 開発キットに含まれている、2つの環境センサ(子機)のIDを設定します。
例えば、2つの環境センサ(子機)のIDが、"12345678"、"87654321"の場合は、
DEV_ID0=12345678 DEV_ID1=87654321
のように設定します。
SEND_URL=***
の***の部分は、手順6.1で確認したHerokuのURL(***.herokuapp.com/series)に置き換えてください。
手順5と同様に、serial_wr_act1を実行します。
上記手順で追加したsample_action.shとsend_ism_subg.sh(説明は後述)により、
sample_action.shに設定した環境センサ(子機)のIDのデータを受信すると、手順6のHeroku上のアプリにセンサーデータを送信します。
(下記ログの環境センサ(子機)のID(TxIDの箇所)は、上記sample_action.shの設定例の"12345678"、"87654321"に置き換えています。)
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_wr_act1 /dev/ttyUSB0 "set1" **************************************************** -------- Write: set1 sh: No.: unknown operand SET OK No.58, TxID=12345678, 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=2016/10/31 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=87654321, 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=2016/10/31 13:55:21&temp0=23.4&hum0=57.7&press0=1018.00&amb0=936&door0=1(Open)&vbat0=0.1&rssi0=-78 Received No.59, TxID=12345678, TEMP=+ 25.5[degC], HUMI= 52.0[%RH], PRES=1018.44[hPa], LIGHT= 112[Lx]/1.2, DOOR=1(Open), VBAT=2.6[V], RSSI=-38 num0=0&name0=IoT Smart Module&no0=59&id0=12345678&date0=2016/10/31 13:55:31&temp0=25.5&hum0=52.0&press0=1018.44&amb0=112&door0=1(Open)&vbat0=2.6&rssi0=-38 Received No.60, TxID=87654321, 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 num0=1&name0=IoT Smart Module&no0=60&id0=87654321&date0=2016/10/31 13:55:41&temp0=23.5&hum0=57.8&press0=1017.93&amb0=864&door0=1(Open)&vbat0=0.1&rssi0=-77 Received
serial_wr_act1が実行されている状態で、 Webブラウザで、https://***.herokuapp.comにアクセスすると、 冒頭のWebブラウザの写真のように環境センサ(子機)のデータを見ることができます。
<サンプルスクリプトの補足>
sample_action.sh: 手順5のサンプルプログラムserial_wr_act1で実行されます。
serial_wr_act1実行中にシリアル通信で改行文字を受信したときに実行されます。
後述のsend_ism_subg.shを、2つの環境センサ(子機)のID(DEV_ID0、DEV_ID1)と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> <url> 引数 id0: 環境センサ(子機)のID id1: 環境センサ(子機)のID url: 手順6のHerokuのURL
log_serial.txtの内容
No.60, TxID=12345678, 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
を手順6のHerokuのアプリに合わせて、
num0=1&name0=IoT Smart Module&no0=60&id0=12345678&date0=2016/10/31 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(日付)は、環境センサ(子機)のデータではなく、
スクリプト内で付加しています。)