ブログ

Armadillo-IoT+絶縁RS485アドオンモジュール:気象観測センサー(SenSu-1501)のデータをクラウド(Heroku)経由で見る

at_kazutaka.bito
2015年12月9日 17時33分

Armadillo-IoT+絶縁RS485アドオンモジュールデータテクノロジー株式会社のSenSuシリーズの気象観測センサー(SenSu-1501)

を使って、気象観測センサー(SenSu-1501)の温度、湿度等のデータをクラウド(Heroku)経由で見てみました。

(ブラウザのURLの部分は、後述の手順でHerokuから割り当てられたURLになりますので伏字(***.herokuapp.com)にしてます。) 当方で確認した手順、サンプルプログラムを下記に説明します。

1.機材

・Armadillo-IoT+絶縁RS485アドオンモジュール
 今回は、Armadillo-IoTのアドオンインタフェースのコネクタ"CON2"に絶縁RS485アドオンモジュールを接続しました。

下記説明内のデバイスファイル"/dev/ttymxc0"の箇所は、アドオンモジュールを接続するコネクタ(CON1、CON2)に応じて、  CON1使用時:/dev/ttymxc3  CON2使用時:/dev/ttymxc0 と読み替える必要があります。

・気象観測センサー(SenSu-1501)
 本センサーのインタフェースはRS485で、RJ-11プラグ用のケーブルが同梱されています。

以下、

「絶縁RS485アドオンモジュール」を「RS485アドオン」
「気象観測センサー(SenSu-1501)」を「気象観測センサー」

と略します。

2.機材の接続

・気象観測センサーの取扱説明書より、RJ-11プラグの仕様は下記のようになっています。

 1:N.C.
 2:電源入力
 3:TD-
 4:TD+
 5:GND
 6:N.C.

今回、気象観測センサーに電池を入れているので、電源入力は使用しません。
 3:TD-
 4:TD+
のみ使用します。

・RS485アドオンの端子仕様は、表19.20 CON2 信号配列(全二重に設定時)より、下記のようになっています。
 1:GND
 2:RX-
 3:RX+
 4:GND
 5:TX-
 6:TX+

気象観測センサーからのデータを受信するだけですので、全二重通信で、
 2:RX-
 3:RX+
のみ使用します。

・RS485アドオンとRJ-11プラグの中継ケーブル
 RS485アドオンのRS485入力は端子台なので、RJ-11プラグと直結できません。  そこで、中継ケーブルを自作しました。

(手元にRJ-11コネクタがなかったので、家電量販店で入手したモジューラーコネクタを改造しました。)
 写真手前の黄線:気象センサーのTD-
 写真手前の緑線:気象センサーのTD+
となるようにしています。

・Armadillo-IoT+RS485アドオンと気象観測センサーを接続します。
気象観測センサーと上記の中継ケーブルを接続して、
 気象観測センサーのTD-(中継ケーブルの黄線)と絶縁RS485アドオンのRx-(端子台の2ピン)
 気象観測センサーのTD+(中継ケーブルの緑線)と絶縁RS485アドオンのRx+(端子台の3ピン)
を接続します。

3.Armadillo-IoT+RS485アドオンの設定

気象観測センサーからのデータを受信するだけですので、
Armadillo-IoT側のRS485は
 全二重通信
 Rxのみ使用
とします。

3.1.RS485アドオンの設定

表19.24 全二重で使用する場合の設定スイッチ(SW1)を参考にSW1を設定します。
SW1.1、SW1.2:ON -> 全二重
SW1.3、OFF -> Rx終端抵抗有り
SW1.4:Don't care -> Tx終端抵抗有り/無し(今回は未使用)

3.2.Armadillo-IoTの設定
表6.17 Linuxカーネル起動オプションからのRS485設定を参考に設定します。
Armadillo-IoTに電源を投入して、保守モードで

hermit> setenv console=ttymxc1,115200 root=/dev/ram0 imx.rs485_uart1=0x13,0,0

と設定します。

4.気象観測センサーからの受信データを確認

気象観測センサーの取扱説明書を確認すると、
・通信仕様
 ボーレート:9600bps
 データ長:8bit
 ストップビット:1bit
 フロー制御:無し
・データ構造

のように、先頭が0x24で17byteで構成されていることがわかります。
補足)
取扱説明書では4bit毎のニブル単位で説明されていますが、上図はByte単位の表記に変更して説明も簡略してます。

まずは、Armadillo-IoTで気象観測センサーからの受信データをダンプで確認してみます。

Armadillo-IoTを起動して、ログインします。

下記のコマンドでシリアル通信を設定して、受信したデータをダンプで確認します。
(気象観測センサーは電池で動いており、16秒毎にデータを送信し続けていますので、16秒毎にダンプが追加されていきます。)

[root@armadillo-iotg (ttymxc1) ~]# stty -F /dev/ttymxc0 9600 raw
[root@armadillo-iotg (ttymxc1) ~]# hexdump -e '"%07_ax" 16/1 " %02x" "\n"' /dev/ttymxc0
0000000 24 c1 cd 62 9a 1a 00 00 01 4f 00 03 00 00 00 93
0000010 ae 24 c1 cd 62 9a 1a 00 00 01 4f 00 03 00 00 00
0000020 93 ae 24 c1 cd 62 9a 1a 00 00 01 4f 00 03 00 00
0000030 00 93 ae 24 c1 cd 62 99 1a 00 00 01 4f 00 03 00
0000040 00 00 88 a2 24 c1 cd 62 99 1a 00 00 01 4f 00 03
0000050 00 00 00 88 a2 24 c1 cd 62 99 1a 00 00 01 4f 00
0000060 03 00 00 00 88 a2 24 c1 cd 62 99 1a 00 00 01 4f
0000070 00 03 00 00 00 88 a2 24 c1 cd 62 99 1a 00 00 01

上記の気象観測センサーのデータ構造と見比べて、17byte毎に0x24が存在するパターンがあるかどうかで、うまく受信できているかどうか確認できます。

5.気象観測センサーからの受信データを取得するサンプルプログラム

上記のデータ構造を参考に、Armadillo-IoTから気象観測センサーのデータを受信するサンプルプログラムを添付します。 serial_rs485_sensu1501.tar.gz

<サンプルプログラムの補足>
実用途では、RS485の通信であれば、半二重時のread/writeの入出力制御を考慮すべきですが、今回は、全二重通信で受信のみを行うという条件で、Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバーをベースに、気象観測センサーから受信したデータを解析するように改造しています。

注)
本サンプルプログラムは正常なデータがくることを前提としています。
先頭バイト(0x24)サーチ、CRCチェック、エラーリカバリーなどは有していません。

serial_rs485_sensu1501.c

Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバーをベースに今回のサンプル特有の箇所を抜粋します。)

/**** sample: serial setting:begin ****/
#define SERIAL_BAUDRATE B9600 // ボーレートを9600bpsに設定
/**** sample: serial setting:begin ****/
/**** sample: variable: begin ****/
// 気象観測センサーからのデータ用の変数宣言
/**** sample: variable: end ****/

/**** sample: initial value: begin ****/
// 気象観測センサーからのデータ用の変数初期化
/**** sample: initial value: end ****/
/**** sample: get SenSu data: begin ****/
// 気象観測センサーからのデータを解析
/**** sample: get SenSu data: begin ****/
/**** sample: read data to each sensor data: begin ****/
// 手順4で確認した気象観測センサーのデータ構造に合わせて、温度、湿度等の各データに切り分け
/**** sample: read data to each sensor data: end ****/
/**** sample: sensor data to stdout: begin ****/
// 温度、湿度等の各データを標準出力
/**** sample: sensor data to stdout: end ****/
/**** sample: sensor data to log file for post to heroku: begin ****/
// 温度、湿度等の各データをクラウド(Heroku)のアプリ(後述)の受信形式に合わせた文字列にして、log_sensu.txtファイルに出力
/**** sample: sensor data to log file for post to heroku: end ****/
/**** search family code ****/
// 先頭バイト(0x24)の後、17Byte目のチェックサムが一致しない場合、データを破棄
// 実用途では、先頭バイト(0x24)の再サーチ等のリカバリーを行う必要がある

<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_rs485_sensu1501ディレクトリ内でmakeすると、
serial_rs485_sensu1501という実行ファイルができます。

この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。
(下記はRS485アドオンをArmadillo-IoTのアドオンインタフェースのCON2に接続した場合のため、/dev/ttymxc0を指定。)

[root@armadillo-iotg (ttymxc1) ~]# stty -F /dev/ttymxc0 9600 raw
[root@armadillo-iotg (ttymxc1) ~]# ./serial_rs485_sensu1501 /dev/ttymxc0

気象観測センサーからデータを受信すると、 下記のように受信データのダンプ(17Byte)と、 機器のid、風向、温度、湿度、風速、瞬間風速、雨量、紫外線量、照度、チェックサム が標準出力に表示されます。

24 c1 bc 62 8f 1d 00 00 01 4f 00 03 00 00 00 17 19
0xc1
0x0bc, 188[degree]
0x28f, 25.5[degree]
0x1d, 29[%]
0x00, 0.000[m/s]
0x00, 0.000[m/s]
0x014f, 100.5[mm]
0x0003, 3[uw/cm^2]
0x000000, 0.0[lux]
0x19

また、/root/log_sensu.txtには、クラウド(Heroku)のアプリ(後述)の受信形式に合わせた文字列が書き込まれます。

[root@armadillo-iotg (ttymxc1) ~]# cat log_sensu.txt
id=0xc1&w_dir=188&tmp=25.5&hum=29&w_speed=0.000&w_gust=0.000&rain=100.5&uvi=3&lux=0.0

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

6.1.準備

まず、Armadillo-IoT + Heroku(Node.js)でHello World のとおり、Armadillo側からのデータ送信と動作確認まで行ってください。 以下、この手順を実行したことをベースに説明します。 よって以下では、ATDE5の ~/temp/myapp がクラウド(Heroku)側のアプリ用のディレクトリとします。

6.2.サンプル

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

<サンプルソースの説明>
今回のサンプル特有の部分のみ説明します。

app.js

・HerokuのURL(***.herokuapp.com)にアクセスした際、index.ejsを表示するようにします。  表示の際、index.ejsにid、風向、温度、湿度、風速、瞬間風速、雨量、紫外線量、照度を与えています。

app.get('/', function(req, res){
  res.render('index', {id: id, w_dir: w_dir, tmp: tmp, hum: hum, w_speed: w_speed, w_gust: w_gust, rain: rain, uvi: uvi, lux: lux});
});

・HerokuのURL(***.herokuapp.com/series)にポストされたデータ(※)をパースして、上記のindex.ejsに渡す変数に代入しています。 ※)上記5のサンプルアプリを実行した際に生成されるファイルlog_sensu.txtの id=0xc1&w_dir=188&tmp=25.5&hum=29&w_speed=0.000&w_gust=0.000&rain=100.5&uvi=3&lux=0.0 という形式のデータです。"&"で温度、湿度等の各データを区切っています。

app.post('/series', function(req, res) {
    console.log('post:/series');

    id = req.body.id;        // id
    w_dir = req.body.w_dir;    // 風向
    tmp = req.body.tmp;        // 温度
    hum = req.body.hum;        // 湿度
    w_speed = req.body.w_speed;    // 風速
    w_gust = req.body.w_gust;    // 瞬間風速
    rain = req.body.rain;    // 雨量
    uvi = req.body.uvi;        // 紫外線
    lux = req.body.lux;        // 照度

    res.send("Received\n");
});
view/index.ejs

・上記app.get('/', function(req, res)により、受け取った気象観測データを表示するhtmlです。

6.3.サンプルの実行

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

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

6.4.アプリの動作確認

Webブラウザで https://***.herokuapp.com (***.herokuapp.comの部分は、手順6.1で確認したHerokuのURL) を実行すると、冒頭のWebブラウザの写真のように表示されます。 (ここまでの手順では、気象観測データを受信してないので、各値はオール0になります。)

7.気象観測センサーのデータをクラウド(Heroku)で見る

Armadillo-IoTから気象観測センサーのデータをクラウドに送信するスクリプト send_rs485_sensu1501a.sh を添付します。

2016.2.3に修正しました。send_rs485_sensu1501a.shをsend_rs485_sensu1501.shにリネームして使用してください。

このスクリプトをArmadillo-IoTの/rootディレクトリに置いて、実行権限をつけてください。

[armadillo ~]# ls /root
send_rs485_sensu1501.sh
[armadillo ~]# chmod +x send_rs485_sensu1501.sh

また、send_rs485_sensu1501.sh内の***.herokuapp.comの部分を、手順6.1で確認したHerokuのURLに修正してください。

手順5のサンプルプログラムserial_rs485_sensu1501とsend_rs485_sensu1501.shをArmadillo-IoTの/rootディレクトリに置いて実行します。

[armadillo ~]# ls /root
send_rs485_sensu1501.sh serial_rs485_sensu1501
[armadillo ~]# ./send_rs485_sensu1501.sh

上記のスクリプトを実行すると、Armadillo-IoTは気象観測センサーから受信したデータ /root/log_sensu.txt をクラウド(Herokuのhttps://***.herokuapp.com/series)に約3秒ごとに送信します。

Webブラウザで、https://***.herokuapp.comにアクセスすると、Armadillo-IoTが送信した気象観測センサーのデータが 冒頭のWebブラウザの写真のように見ることができます。 補足) Webブラウザの表示の更新には再読み込みが必要です。 気象観測データのデータ送信間隔は16秒毎なので、Webブラウザの表示の更新間隔は約20秒毎になります。 クラウド(Heroku)側のアプリがデータを受信した場合は、"Received"という文字をArmadillo-IoTに送信するので、 クラウド(Heroku)側が受け取ったかどうかを、Armadillo-IoTの標準出力で確認することができます。