ブログ

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

at_kazutaka.bito
2016年11月2日 11時46分

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