このエントリーをはてなブックマークに追加

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

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

製品: 

  • Armadillo-IoT G3L