ブログ

Armadillo-IoT+RS232Cアドオン:土壌水分センサー(WD-3-WET-5Y)のデータをクラウド(Heroku)経由で見る

at_kazutaka.bito
2016年3月2日 18時44分

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

と 株式会社A・R・P様の土壌水分センサー(WD-3-WET-5Y)

を使って、 Armadillo-IoTからシリアル通信(RS232C)で、土壌水分センサー(WD-3-WET-5Y)の 体積含水率、電気伝導率、温度のデータを読み取って、クラウド(Heroku)経由で見てみました。

(ブラウザのURLの部分は、後述の手順でHerokuから割り当てられたURLになりますので、伏字(***.herokuapp.com)にしてます。)

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

以下、
RS232Cアドオンモジュールは、「RS232Cアドオン」
土壌水分センサー(WD-3-WET-5Y)は、「土壌水分センサー」
と呼称します。

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

手順の概要は下記のようになります。
 1.機材、資料
 2.土壌水分センサーとRS232Cアドオンの接続
 3.土壌水分センサーとの通信確認
 Appendix.土壌水分センサーとの通信確認で気になったこと
 4.土壌水分センサーからデータを取得するサンプルプログラム
 5.クラウド(Heroku)側のアプリの準備
 6.土壌水分センサーのデータをクラウド(Heroku)経由で見る

1.機材、資料

機材は下記のもの使用しました。
・Armadillo-IoT+RS232Cアドオンモジュール
土壌水分センサー(WD-3-WET-5Y)

今回の動作確認において、下記の資料を参考にしました。
土壌水分センサー(WD-3-WET-5Y)の取扱説明書
(詳細なご質問については、株式会社A・R・P様にお問い合わせ願います。)

備考)
今回は、Armadillo-IoTのアドオンインタフェースのコネクタ"CON1"にRS232Cアドオンを接続しました。
下記説明内のデバイスファイル"/dev/ttymxc3"の箇所は、RS232Cアドオンを接続するコネクタに応じて、
 CON1使用時:/dev/ttymxc3
 CON2使用時:/dev/ttymxc0
と読み替える必要があります。

2.土壌水分センサーとRS232Cアドオンの接続

土壌水分センサーは、体積含水率、電気伝導度、温度をアナログ出力またはデジタルI/Fで取得することが可能です。
ここでは、デジタルI/Fでシリアル通信を行います。

土壌水分センサーのデジタルI/Fは、7本の信号線のうち、
赤 :電源
赤白:データ線
灰 :GND
の3本を使います。

取扱説明書より、

2線調歩同期方式(通信速度9600bps)※<br/>
※)半2重通信のオリジナル方式で、専用のI/F回路が必要です。詳しくは当社までお問い合わせください。

とのことなので、実際のI/F回路の設計では株式会社A・R・P様にご相談が必要かと思います。

ここでは、同取扱説明書内の参考回路をアレンジして、RS232CのI/F回路を作成しました。
(なお、取扱説明書の参考回路は、USBに変換する回路になっています。)

回路図風に記述すると、下記のようになります。

上記の回路を経由して、Armadillo-IoT+RS232Cアドオンと土壌水分センサーを接続します。
下の写真は、実際に上記回路をブレッドボードで作って接続した状態です。

備考1)ブレッドボードへの5V電源は、RS232CアドオンのテストI/F(CON3)の30pin(5V)で供給しました。
備考2)ブレッドボードの部品は回路図と同じものではなく、当方で入手可能な部品で代替しました。

3.土壌水分センサーとの通信確認

手順2にて、Armadillo-IoT+RS232Cアドオンと土壌水分センサーを接続した状態で、Armadillo-IoTに電源を投入します。

取扱説明書より、下記のようなシリアル通信で、土壌水分センサーのデータが取得できます。

P を送信する。(開始要求)
O を受信するのを待つ。(正常応答)
A を送信する。(パスワード"ARP."の1文字目)
R を送信する。(パスワード"ARP."の2文字目)
P を送信する。(パスワード"ARP."の3文字目)
. を送信する。(パスワード"ARP."の4文字目)
O を受信するのを待つ。(正常応答)
M を送信する。(特殊モード要求)
O を受信するのを待つ。(正常応答)
D を送信する。(デジタルデータ要求)
W=x.xxx,E=x.xxx,T=x.xxxyyCRLF(※)のようにセンサーのデータが受信できる。

※)データの意味は下記の通り。算出式は取扱説明書のグラフを参考にしています。
W=x.xxx: 体積含水率(0.000-1.000): [%]にするには、100倍する
E=x.xxx: 電気伝導度(0.000-1.000): [mS/cm]にするには、7倍する
T=x.xxx: 温度(0.000-1.200): [℃]にするには、1.2で割って、50倍する
yy: チェックサム
CRLF: 改行コード

シリアル通信を行うtipコマンドを使って、実際に通信すると下記のようなログになります。
補足)土壌水分センサーの仕様より、ボーレートは9600に設定しています。

[root@armadillo-iotg (ttymxc1) ~]# tip -l /dev/ttymxc3 -s 9600
Connected.
POARP.OMODW=0.000,E=0.000,T=0.738DB
DW=0.000,E=0.000,T=0.738DB
DW=0.601,E=0.213,T=0.739E9
DW=0.601,E=0.219,T=0.740E7
DW=0.042,E=0.000,T=0.741DB
( ~. と、2文字入力するとシリアル通信が終了します。)

補足)改行されていないため、見づらいですが、
"P"、"ARP."、"M"、"D"が入力した文字で、
"O"、"W=0.000,E=0.000,T=0.738DB"が土壌水分センサーから受信した文字です。

Appendix.土壌水分センサーとの通信確認で気になったこと

手順3にて、送信する文字を間違えると、"N"が返信されたり、返信がなかったり、通信が異常になる状態になります。
この異常状態から、コマンドで復帰する方法はなく、土壌水分センサーの電源をOFF->ONする必要があるようです。

下記の手順にて、通信異常がみられる場合は、土壌水分センサーの電源をOFF->ONして確認してください。
補足)取扱説明書によると、土壌水分センサーとの通信は、電源ONから1秒以上待ってから行います。

4.土壌水分センサーからデータを取得するサンプルプログラム

土壌水分センサーの設定とデータ取得を行うサンプルプログラムを作成しました。
Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバーをベースに、 手順3で説明しましたシリアル通信を行うサンプルプログラムになっています。
・設定のプログラム:serial_rs232c_wd3_set.tar.gz
・データ取得のプログラムserial_rs232c_wd3_data.tar.gz

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

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

4.1.土壌水分センサーの設定
土壌水分センサーに電源投入後、1秒以上経過してから、serial_rs232c_wd3_setを実行します。

serial_rs232c_wd3_set <device>
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")

下記は実行例です。(シリアルインタフェースのデバイスファイルが"/dev/ttymxc3"の場合)

[root@armadillo-iotg (ttymxc1) ~]# ./serial_rs232c_wd3_set /dev/ttymxc3
 
****************************************************
-------- Command: PPO
-------- Receive: O
 
****************************************************
-------- Command: ARP.ARP.O
-------- Receive: O
 
****************************************************
-------- Command: MMO
-------- Receive: O
 
######## Finish setting WD-3 #########

末尾に ######## Finish setting WD-3 ######### と表示されれば設定が正常終了です。
それ以外は異常終了になりますので、土壌水分センサーの電源をOFF->ONして再度実行します。

4.2.土壌水分センサーのデータ取得
serial_rs232c_wd3_dataを実行すると、取得したデータのログ表示と、 log_wd3.txt というファイルへ、体積含水率、電気伝導度、温度の算出値を書き込みます。

serial_rs232c_wd3_data <device>
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")

下記は実行例です。(シリアルインタフェースのデバイスファイルが"/dev/ttymxc3"の場合)

[root@armadillo-iotg (ttymxc1) ~]# ./serial_rs232c_wd3_data /dev/ttymxc3
 
****************************************************
-------- Command: D
****************************************************
 
---------  sensor data --------
W=0.592,E=0.150,T=0.745EF
 
VMC[%]=59.2 (= 0.592 * 100)
EC[mS/cm]=1.050 (= 0.150 * 7)
TMP[degC]=31.042 (= 0.745 / 1.2 * 50)

このとき、 log_wd3.txt には、下記のように体積含水率、電気伝導度、温度の算出値が書き込まれます。

vmc=59.2&ec=1.050&tmp=31.042

補足)下記、手順5のクラウド側のアプリに合わせて、各データを&で区切っています。

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

/**** sample: interval timer :begin ****/
// タイマー関連。土壌水分センサーとの通信で期待通りのレスポンスがない場合のタイムアウト。
/**** sample: interval timer: end ****/
/**** sample: WD-3 serial setting: begin ****/
// 土壌水分センサーの仕様に合わせて、ボーレートを9600に設定。
#define SERIAL_BAUDRATE B9600
/**** sample: WD-3 serial setting: end ****/
 
/**** sample: WD-3 command: begin ****/
// 手順3の土壌水分センサーの設定のコマンド
static unsigned char cmd_start[] = "P"; /* set WD-3: start request*/
static unsigned char cmd_pwd[] = "ARP."; /* set WD-3: password */
static unsigned char cmd_mode[] = "M"; /* set WD-3: mode request*/
/**** sample: WD-3 command: end ****/
 
/**** sample: WD-3 response: begin ****/
// 手順3の土壌水分センサーからのレスポンス(今回はOKの場合のみ使用)
static unsigned char res_ok[] = "O"; /* WD-3 response: ok */
/*static unsigned char res_ng[] = "N"; *//* WD-3 response: ng */
/**** sample: WD-3 response: end ****/
 
/**** sample: variable: begin ****/
// 土壌水分センサーからの応答がOKかどうかのフラグ
    int flag_ok;
/**** sample: variable: end ****/
 
/**** sample: interval timer: begin ****/
// 土壌水分センサーからの応答待ちのタイマー。5秒でタイムアウトに設定。
/**** sample: interval timer: end ****/
 
/**** sample: WD-3 start request: begin ****/
// 開始要求。"P"を送信して、"O"を受信するのを待つ。
/**** sample: WD-3 start request: end ****/
 
/**** sample: WD-3 password: begin ****/
// パスワード。"ARP."を送信して、"O"を受信するのを待つ。
/**** sample: WD-3 password: end ****/
 
/**** sample: WD-3 mode request: begin ****/
// 特殊モード要求。"M"を送信して、"O"を受信するのを待つ。
/**** sample: WD-3 mode request: end ****/

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

/**** sample: interval timer :begin ****/
// タイマー関連。土壌水分センサーとの通信で期待通りのレスポンスがない場合のタイムアウト。
/**** sample: interval timer: end ****/
/**** sample: WD-3 serial setting: begin ****/
// 土壌水分センサーの仕様に合わせて、ボーレートを9600に設定。
#define SERIAL_BAUDRATE B9600
/**** sample: WD-3 serial setting: end ****/
 
/**** sample: WD-3 command: begin ****/
// 手順3の土壌水分センサーへのデータ要求のコマンド
static unsigned char cmd_data[] = "D"; /* set WD-3: data request */
/**** sample: WD-3 command: end ****/
 
/**** sample: WD-3 response: begin ****/
// 手順3の土壌水分センサーからのレスポンス(データの頭2文字"W="で判別)
static unsigned char res_data[] = "W="; /* WD-3 response: data */
/**** sample: WD-3 response: end ****/
 
/**** sample: char(HEX) to int: begin ****/ 
// テキストの16進数を10進数に変える関数
/**** sample: char(HEX) to int: end ****/ 
 
/**** sample: variable: begin ****/
// データ先頭("W=")かどうかのフラグ。データ終了("\n")かどうかのフラグ。
    int flag_data, flag_lf;
/**** sample: variable: end ****/
 
/**** sample: variable for senseor data: begin ****/
// vmc_v, ec_v, tmp_v:シリアル通信で取得した体積含水率、電気伝導度、温度
// vmc, ec, tmp:算出式を適用した体積含水率、電気伝導度、温度
    float vmc_v, ec_v, tmp_v;
    float vmc, ec, tmp;
/**** sample: for senseor data: end ****/
 
/**** sample: interval timer: begin ****/
// 土壌水分センサーからの応答待ちのタイマー。5秒でタイムアウトに設定。
/**** sample: interval timer: end ****/
 
/**** sample: WD-3 data request: begin ****/
// 土壌水分センサーへのデータ要求とデータ取得
/**** sample: analize sensor data: begin ****/
// "W=x.xxx,E=x.xxx,T=x.xxxyyCRLF"の文字列から、体積含水率、電気伝導度、温度を抽出し、算出。
// 文字の配置と算出方法は手順3を参照。
/**** sample: analize sensor data: end ****/
 
/**** output sensor data to stdout: begin ****/
// 体積含水率、電気伝導度、温度を標準出力にログ表示。
/**** output sensor data to stdout: end ****/
 
/**** sample: sensor data to log file for post to heroku: begin ****/
// 体積含水率、電気伝導度、温度をlog_wd3.txtファイルに出力。
/**** sample: sensor data to log file for post to heroku: end ****/
/**** sample: WD-3 data request: end ****/

補足)本プログラムでは、データのチェックサムの確認は行っていません。

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

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

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

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

app.js

・HerokuのURL(***.herokuapp.com)にアクセスした際、index.ejsを表示するようにします。
 表示の際、index.ejsに体積含水率、電気伝導度、温度を与えています。

app.get('/', function(req, res){
  res.render('index', {vmc: vmc, ec: ec, tmp: tmp});
});

・HerokuのURL(***.herokuapp.com/series)にポストされたデータ(※)をパースして、上記のindex.ejsに渡す変数に代入しています。
※)上記サンプルアプリ(serial_rs232c_wd3_data)を実行時のログファイル
log_wd3.txt の

vmc=59.2&ec=1.050&tmp=31.042

という形式のデータです。"&"で体積含水率、電気伝導度、温度の各データを区切っています。

app.post('/series', function(req, res) {
    console.log('post:/series');
 
    vmc = req.body.vmc;        // 体積含水率
    ec = req.body.ec;        // 電気伝導度
    tmp = req.body.tmp;        // 温度
 
    res.send("Received\n");
});
view/index.ejs

・上記app.get('/', function(req, res)により、受け取った土壌水分センサーのセンサーデータを表示するhtmlです。

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

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

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

6.土壌水分センサーのデータをクラウド(Heroku)で見る

Armadillo-IoTから土壌水分センサーのデータをクラウドに送信するスクリプト send_wd3.sh を添付します。

このスクリプトをArmadillo-IoTの/rootディレクトリに置いて、実行権限をつけてください。 サンプルプログラムserial_rs232c_wd3_set、serial_rs232c_wd3_dataも Armadillo-IoTの/rootディレクトリに置いて実行します。

[armadillo ~]# chmod +x send_wd3.sh
[armadillo ~]# ls /root
send_wd3.sh
serial_rs232c_wd3_set
serial_rs232c_wd3_data

土壌水分センサーの電源ON後、serial_rs232c_wd3_setを未実行の場合のみ、手順4.1のようにserial_rs232c_wd3_setを実行します。 send_wd3.shは、下記のように使用します。

send_wd3.sh <device> <HerokuのURL>
引数
 device:シリアルインタフェースのデバイスファイル("/dev/ttymxc3"または、"/dev/ttymxc0")
 HerokuのURL:手順5.1で確認したHerokuのURL

例)RS232CアドオンをArmadillo-IoTのアドオンインタフェースのCON1(/dev/ttymxc3)に接続し、 HerokuのURLが***.herokuapp.comの場合、下記のように実行します。

[armadillo ~]# ./send_wd3.sh /dev/ttymxc3 https://***.herokuapp.com/series

上記のスクリプトを実行すると、Armadillo-IoTは土壌水分センサーから 体積含水率、電気伝導度、温度のデータを約10秒ごとに取得し、算出値を書き込んだログファイル log_wd3.txt から読みだして、クラウド(Herokuのhttps://***.herokuapp.com/series)に送信します。

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