ブログ

Armadillo-IoT(G2)+RS232Cアドオン:放射線量測定計(AGRISENSE-RD-TYPE1)から取得したデータをクラウド(Heroku)経由で見る

at_kazutaka.bito
2016年7月23日 16時21分

Armadillo-IoT+RS232Cアドオンモジュール

を使って、 株式会社ジョイ・ワールド・パシフィック様の放射線量測定計(AGRISENSE-RD-TYPE1

のデータを読み取って、クラウド(Heroku)経由で見てみました。

(ブラウザのURLの部分は、後述の手順でHerokuから割り当てられたURLになりますので、伏字(***.herokuapp.com)にしてます。  FireFox、Chrome、Safariでは、上記画面のように表示できました。  InternetExplorerではグラフ表示できませんでしたので、グラフ表示を外す必要がありました。(後述))

当方で確認した手順、サンプルプログラムを下記に説明します。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
注意)
ここでは、当方が確認した簡易的な手順を示しているに過ぎません。(エラー処理等は考慮されていません。)
本格的には、電気的特性、ノイズ等を考慮した回路設計、エラー処理、フェイルセーフ等のソフト設計を行う必要があります。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

以下、
RS232Cアドオンモジュールは、「RS232Cアドオン」
放射線量測定計(AGRISENSE-RD-TYPE1)は、「放射線量測定計」
と呼称します。

今回の動作確認は下図のような構成です。

手順の概要は下記のようになります。
●1.機材、資料
●2.Armadillo-IoT、RS232Cアドオン、放射線量測定計の接続
●3.放射線量測定計との通信確認
●4.放射線量測定計からデータを取得するサンプルプログラム
●5.クラウド(Heroku)側のアプリの準備
●6.放射線量測定計のデータをクラウド(Heroku)経由で見る

●1.機材、資料

機材は下記のものを使用しました。
・Armadillo-IoT(G2)
・RS232Cアドオン(OP-AGA-RS00-00
・放射線量測定計(AGRISENSE-RD-TYPE1

今回の動作確認において、下記の資料を使用しました。
・放射線量測定計(AGRISENSE-RD-TYPE1)に同梱の仕様書

●2.Armadillo-IoT、RS232Cアドオン、放射線量測定計の接続

今回は、Armadillo-IoTのアドオンインタフェースのコネクタ"CON1"に RS232Cアドオンを接続しました。(冒頭の写真)

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

放射線量測定計は、RS232Cで通信可能です。
仕様書より、5本の信号線のうち、
赤:DC5V電源
白:TXD
黒:GND
を使用します。

Armadillo-IoT+RS232Cアドオン、放射線量測定計を下図のように接続します。

実際に接続した写真です。(DV5V電源は、ACアダプタから供給するようにDCジャックを接続しています。)

●3.放射線量測定計との通信確認

手順2のように接続して、Armadilo-IoTと放射線量測定計に電源を投入します。

Armadillo-IoTで放射線量測定計のデータが受信できることを確認します。 仕様書より、放射線量測定計は、30秒毎に"Q,[CPT値],[CPM値],[USV値]"というデータフォーマットで出力しています。

シリアル通信を行うtipコマンドを使うと、 下記のように30秒毎に"Q,[CPT値],[CPM値],[USV値]"というデータを受信できていることが確認できます。
補足)放射線量測定計の仕様より、ボーレートは9600に設定しています。

[root@armadillo-iotg (ttymxc1) ~]# tip -s 9600 -l /dev/ttymxc3
Connected.
Q,0003,006.0,00.113
Q,0005,005.0,00.094
Q,0006,004.0,00.075
Q,0007,003.5,00.066
( ~. と、2文字入力するとシリアル通信が終了します。)

●4.放射線量測定計からデータを取得するサンプルプログラム

手順3のとおり、Armadillo-IoTと放射線量測定計は、シリアルで通信します。

そこで、Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー をベースに、手順3で確認したシリアル通信で取得したデータをログファイルに出力し、 sample_action.sh(後述)というスクリプトファイルを実行するサンプルプログラムを作成しました。
serial_rs232c_agri_rd.tar.gz

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

この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。

serial_rs232c_agri_rdを実行すると、取得したデータのログ表示と、 log_rd.txt というファイルへ、放射線量測定計から取得したデータを書き込みます。 また、sample_action.shというスクリプトファイルが存在すれば実行します。

serial_rs232c_agri_rd <device>
引数
 device:デバイスファイル(手順2でRS232Cアドオンを接続したコネクタによる。ここでは、"/dev/ttymxc3")

下記は実行例です。(シリアルインタフェースのデバイスファイルが"/dev/ttymxc3"で、sample_action.shが存在しない場合)

[root@armadillo-iotg (ttymxc1) ~]# ./serial_rs232c_agri_rd /dev/ttymxc3
******************************
Q,0024,002.4,00.045
Mark: Q
CPT: 24
CPM: 2.4
Radiation: 0.045 [uSv/h]
(以降、放射線量測定計からデータを受信する毎(30秒毎)にログが追記。)

このとき、 log_rd.txt には、下記のように放射線量測定計のデータが書き込まれます。

Q,0022,002.2,00.041

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

/**** sample: AGRI-RD serial setting: begin ****/
// シリアル通信のボーレートを9600に設定
/**** sample: AGRI-RD serial setting: end ****/

/**** sample: AGRI-RD response: begin ****/
// 放射線量測定計のデータは"Q,"で始まる
/**** sample: AGRI-RD response: end ****/

/**** sample: variable for senseor data: begin ****/
// 放射線量測定計のデータ用の変数
/**** sample: for senseor data: end ****/

/**** sample: AGRI-RD data read: begin ****/
// データ受信処理
// "Q,"から改行コードまでを放射線量測定計のデータとして取得

/**** sample: sensor data to log file: begin ****/
// 取得したデータをログファイルに出力
/**** sample: sensor data to log file: end ****/

/**** sample: execute "sample_action.sh" if it's exist: begin ****/
//  "sample_action.sh"というファイルがあれば実行
/**** sample: execute "sample_action.sh" if it's exist: end ****/

/**** sample: sensor data to console: begin ****/
// 取得したデータを標準出力
/**** sample: sensor data to console: end ****/

/**** sample: AGRI-RD data request: end ****/

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

5.1.準備
まず、Armadillo-IoT + Heroku(Node.js)でHello World のとおり、 Armadillo側からのデータ送信と動作確認まで行ってください。
以下、この手順を実行したことをベースに説明します。

よって以下では、ATDE5の ~/temp/myapp がクラウド(Heroku)側のアプリ用のディレクトリとします。

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

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

app.js

・HerokuのURL(***.herokuapp.com)にアクセスした際、index.ejsを表示します。
・HerokuのURL(***.herokuapp.com/series)にポストされたデータ(※)をパースして、index.ejsに渡す変数に代入しています。
※)Armadillo-IoTから受信した放射線量測定計のデータ
 name0: センサーの名前
 id0: センサーのID
 data00: センサーの種類、値、単位、最大値、最小値、その他
 time0: 時刻
 memo0: メモ

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

// text = req.body.text;
 name0 = req.body.name0;       // センサーの名前
 id0 = req.body.id0;                 // センサーのID
 data00 = req.body.data00;      //  センサーの種類、値、単位、最大値、最小値、その他
 time0 = req.body.time0;          //  時刻
 memo0 = req.body.memo0;     //  メモ

 text_all = JSON.stringify(
  [
//   {text: text},
   {name0: name0,
   id0: id0,
   data00: data00, 
   time0: time0,
   memo0: memo0}
  ]
 );

 io.sockets.emit('returnData', text_all);
 res.send("Received\n");
});
view/index.ejs

・Armadillo-IoTから受け取った放射線量測定計のセンサーデータを表示します。
・Armadillo-IoTからデータを受信するごとに、表、グラフが更新されます。
・表:最後に受信したデータを表示します。
 NAME(0): センサーの名前
 ID(0): センサーのID
 DATA(00): センサーの種類、値、単位、最大値、最小値、その他
 TIME(0): 時刻
 MEMO(0): メモ
・グラフ:センサーの値(表のDATA(00)の値の項目)の遷移を表示します。
補足) InternetExplorerで閲覧する場合は、このソースコードでは正常に表、グラフの更新ができません。
chart.push(series); をコメントアウトすると、グラフの更新はできませんが、表の更新は行われます。

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

[atde ~/temp/myapp]$ git add --all
[atde ~/temp/myapp]$ git commit -m "agri-rd"
[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から放射線量測定計のデータをクラウドに送信するためのスクリプト
send_agri_rd.sh
sample_action.sh
を添付します。

これらのスクリプトを手順4のサンプルプログラムserial_rs232c_agri_rdと同じディレクトリに置いて、実行権限をつけてください。
(下記例では、/rootディレクトリに置いた場合です。)

[root@armadillo-iotg (ttymxc1) ~]# chmod +x send_agri_rd.sh
[root@armadillo-iotg (ttymxc1) ~]# chmod +x sample_action.sh
[root@armadillo-iotg (ttymxc1) ~]# ls /root
sample_action.sh send_agri_rd.sh serial_rs232c_agri_rd

sample_action.shについては、

./send_agri_rd.sh  https://***.herokuapp.com/series

の行の"***.herokuapp.com"の部分を、手順5.1で確認したHerokuのURLに変更してください。

この状態で、手順4と同じくサンプルプログラムserial_rs232c_agri_rdを実行します。

[root@armadillo-iotg (ttymxc1) ~]# ./serial_rs232c_agri_rd /dev/ttymxc3
Sat Jan  1 11:37:51 JST 2000

Received
******************************
Q,0017,001.7,00.032
Mark: Q
CPT: 17
CPM: 1.7
Radiation: 0.032 [uSv/h]

Sat Jan  1 11:38:21 JST 2000

Received
******************************
Q,0017,001.7,00.032
Mark: Q
CPT: 17
CPM: 1.7
Radiation: 0.032 [uSv/h]

Sat Jan  1 11:38:51 JST 2000

Received

ここで追加したsample_action.shでは、放射線量測定計のデータをHerokuに送信するスクリプトsend_agri_rd.shを 実行するようになっています。
サンプルプログラムserial_rs232c_agri_rdは、放射線量測定計からデータを受信(30秒毎)すると、 sample_action.shを実行(→Herokuに送信するスクリプトsend_agri_rd.shを実行)します。 (上記ログの"Received"は、Herokuのアプリからの返信です。)

serial_rs232c_agri_rdが実行されている状態で、 Webブラウザで、https://***.herokuapp.comにアクセスすると、 冒頭のWebブラウザの写真のように放射線量測定計のデータを見ることができます。
・表
 DATA(00)の黄色の箇所に、センサー種類、USV値、単位を表示しています。
 MEMO(00)の黄色の箇所に、放射線量測定計の出力データがそのまま表示されます。
・グラフ
 DATA(00)のUSV値に応じたグラフが表示されます。

<スクリプトの説明>

sample_action.sh

手順4のサンプルプログラムserial_rs232c_agri_rdで、放射線量測定計のデータを取得した際に実行されるスクリプトです。 内容は任意に記述できますが、ここでは、時刻表示(dateコマンド)と、放射線量測定計のデータをHerokuに送信する スクリプトsend_agri_rd.shを実行しています。

send_agri_rd.sh

放射線量測定計のデータを手順5のクラウド側のアプリに合わせたデータ形式にして、Herokuに送信します。
下記のように実行します。

send_agri_rd.sh  <HerokuのURL>
引数
 HerokuのURL:手順5.1で確認したHerokuのURL

下記の箇所はHerokuに送信するデータのデフォルト値を設定しています。
(補足:MIN00、MAX00については、放射線量測定計の測定値の最小値、最大値ではありません。  グラフの変化がわかりやすいように、グラフの最小値、最大値を設定しています。)

NAME0=AGRISENSE-RD // センサー名前
ID0=1234 // センサーID
KIND00=Radiation // センサーの種類
VAL00=00.000 // センサーの値
UNIT00=uSv/h // センサーの値の単位
MIN00=00.000 // グラフの最小値
MAX00=00.400 // グラフの最大値
ETC00=none // その他
DATA00="${KIND00},${VAL00},${UNIT00},${MIN00},${MAX00},${ETC00}"
TIME0=`date +"%Y/%m/%d %H:%M:%S"` // 時刻
MEMO0="not available" // メモ

下記の箇所は、log_rd.txt(serial_rs232c_agri_rdが出力した放射線量測定計のデータのログファイル)の 内容に応じて、Herokuに送信するデータを更新して、Herokuに送信しています。
ここでは、
 VAL00:放射線量測定計のデータのうち、USVの値
 TIME0:時刻
 MEMO0:放射線量測定計からの受信データ
を更新しています。(他のデータはデフォルトのまま。)

if [ -e $LOG_FILE ] ; then
  VAL00=`cat $LOG_FILE | cut -d "," -f4`
  DATA00="${KIND00},${VAL00},${UNIT00},${MIN00},${MAX00},${ETC00}"

  TIME0=`date +"%Y/%m/%d %H:%M:%S"`
  MEMO0=`cat $LOG_FILE`

  OBJ0="name0=$NAME0&id0=$ID0&data00=$DATA00&time0=$TIME0&memo0=$MEMO0"

  echo
  echo 1 > /sys/class/leds/led3/brightness
  wget -O- -q --post-data="$OBJ0" $SEND_URL
  echo 0 > /sys/class/leds/led3/brightness
fi