Armadillo-IoT(G3)/X1+RS485アドオンモジュール
(下記写真はArmadillo-IoT(G3))
(下記写真はArmadillo-X1)
と
株式会社A・R・P様の土壌水分センサーのRS485タイプの製品"WD-3-WT-5Y-485M"
を使って
Armadillo-IoT(G3)/X1からRS485(Modbus通信)で、土壌水分センサー(WD-3-WT-5Y-485M)の体積含水率、温度、電気伝導率のデータを読み取ってみました。
当方で確認した手順、サンプルプログラムを下記に説明します。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
注意)
ここでは、当方が確認した簡易的な手順を示しているに過ぎません。(エラー処理等は考慮されていません。)
本格的には、電気的特性、ノイズ等を考慮した回路設計、エラー処理、フェイルセーフ等のソフト設計を行う必要があります。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
以下、
RS485アドオンモジュールは、「RS485アドオン」
土壌水分センサー(WD-3-WT-5Y-485M)は、「土壌水分センサー」
と呼称します。
手順の概要は下記のようになります。
1.機材、資料
2.土壌水分センサーとRS485アドオンの接続
3.土壌水分センサーとの通信プログラムの作成
4.土壌水分センサーからデータを取得する
1.機材、資料
機材は下記のもの使用しました。
・Armadillo-IoT(G3)/X1+RS485アドオンモジュール
・土壌水分センサーのRS485タイプの製品"WD-3-WT-5Y-485M"
今回の動作確認において、下記の資料を参考にしました。
・土壌水分センサーのRS485タイプの製品"WD-3-WT-5Y-485M"に付属の取り扱い説明書
(詳細な仕様、用法については、株式会社A・R・P様にお問い合わせ願います。)
備考)
今回は、Armadillo-IoT(G3)のアドオンインタフェースのコネクタ"CON1"にRS485アドオンを接続しました。
下記説明内のデバイスファイル"/dev/ttymxc0"の箇所は、RS485アドオンを接続するコネクタに応じて、
Armadillo-IoT(G3)のCON1使用時:/dev/ttymxc0
Armadillo-IoT(G3)のCON2使用時:/dev/ttymxc1
Armadillo-X1のCON7使用時:/dev/ttymxc6
と読み替える必要があります。
2.土壌水分センサーとRS485アドオンの接続
土壌水分センサーとRS485アドオンは半二重通信で接続します。
Armadillo-IoT ゲートウェイ G3製品マニュアル
19.3. Armadillo-IoT 絶縁RS485アドオンモジュール RS02
の
図19.23 半二重で使用する場合の設定スイッチ(SW1)の状態
のようにRS485アドオンのスイッチを設定します。(下記写真は、半二重通信、Tx終端抵抗ON)
図19.24 外部機器との接続例(半二重で使用する場合)
と土壌水分センサーの取り扱い説明書を参考に、下記のように接続します。
土壌水分センサー:電源(+)==スイッチング電源(DC:+24V)
土壌水分センサー:RS485(-)==RS485アドオン:CON2の端子2(Data-)
土壌水分センサー:RS485(+)==RS485アドオン:CON2の端子3(Data+)
土壌水分センサー:電源(-)==RS485アドオン:CON2の端子1(GND_ISO)およびスイッチング電源のGND
(下記写真はArmadillo-IoT(G3))
(下記写真はArmadillo-X1)
3.土壌水分センサーとの通信プログラムの作成
Armadillo-IoT(G3)/X1をインターネットに接続可能なネットワークに接続して、下記コマンドにより、
パッケージの更新、ビルド環境、Modbusライブラリのインストールを実行します。
root@armadillo:~# apt-get update
root@armadillo:~# apt-get upgrade
root@armadillo:~# apt-get install build-essential
root@armadillo:~# apt-get install libmodbus5
root@armadillo:~# apt-get install libmodbus-dev
Howto : Armadillo-400シリーズでModbusの通信をする
のソースコード改造して、土壌水分センサーから体積含水率、温度、電気伝導率を読み出せるようにしたサンプルプログラムを添付します。
wd3_modbus.c
ソースコードの概要は、上記Howtoを参照ください。
以下は、添付のサンプルプログラム(wd3_modbus.c)について、土壌水分センサーに依存する部分を説明します。
(土壌水分センサーの設定、レジスタの内容等は、土壌水分センサーの付属の取扱説明書を参照しています。)
wd3_modbus.c:土壌水分センサー特有の箇所の抜粋
/****************************** include ***************************************/
#include <math.h> // センサーから取得した値の計算で指数関数powを使用するために追加
/****************************** define ***************************************/
#define SLAVE_ID 1 // 土壌水分センサーの取り扱い説明書より
#define REGISTER_ADDRESS_VMC 0x110 // 土壌水分センサーの体積含水率のレジスタアドレス
#define REGISTER_ADDRESS_TEMP 0x112 // 土壌水分センサーの温度のレジスタアドレス
#define REGISTER_ADDRESS_EC 0x114 // 土壌水分センサーの電気伝導率のレジスタアドレス
#define SERIAL_SPEED 9600 // 土壌水分センサーのシリアル通信設定に合わせる
#define SERIAL_PARITY 'N' // 土壌水分センサーのシリアル通信設定に合わせる
#define SERIAL_DATABIT 8 // 土壌水分センサーのシリアル通信設定に合わせる
#define SERIAL_STOPBIT 1 // 土壌水分センサーのシリアル通信設定に合わせる
/****************************** レジスタ読み出し ***************************************/
float wd3_modbus_read(modbus_t *ctx, unsigned int reg_addr)
/* modbus_read_input_registers関数を使用して、 体積含水率、温度、電気伝導率のレジスタを読み出す */
/* 読み出した値(16bit×2レジスタ)を、32bitのfloat型に計算。 */
/****************************** 計算 ***************************************/
vmc = wd3_modbus_read(ctx, REGISTER_ADDRESS_VMC) * 100;
tmp = wd3_modbus_read(ctx, REGISTER_ADDRESS_TEMP) * 50 - 10;
ec = wd3_modbus_read(ctx, REGISTER_ADDRESS_EC) * 7;
/* wd3_modbus_readで読み出したレジスタの値[V]に下記計算を施し、 体積含水率[%]、温度[℃]、電気伝導率[mS/cm]に変換 */
/* vmc: 体積含水率[%] = レジスタの値[V] x 100 */
/* tmp: 温度[℃] = レジスタの値[V] x 50 - 10 */
/* ec: 電気伝導率[mS/cm] = レジスタの値[V] x 7 */
サンプルプログラム(wd3_modbus.c)をArmadillo-IoT(G3)/X1上でビルドします。
root@armadillo:~# gcc wd3_modbus.c -o wd3_modbus -lmodbus -I /usr/include/modbus -lm
ビルドすると
wd3_modbus
という実行ファイルが生成されます。
4.土壌水分センサーからデータを取得する
Armadillo-IoT(G3)/X1+RS485アドオンと土壌水分センサーを接続した状態で、Armadillo-IoT(G3)/X1に電源を投入します。
土壌水分センサーの電源(DC+24V)を投入します。
上記3で生成された実行ファイル"wd3_modbus"を実行します。
引数は、RS485アドオンのシリアルインタフェースのデバイスファイル(/dev/ttymxc*)です。
Armadillo-IoT(G3)のCON1にRS485アドオンを接続した場合(デバイスファイル/dev/ttymxc0)、下記のように実行します。
root@armadillo:~# ./wd3_modbus /dev/ttymxc0
下記は、Armadillo-IoT(G3)のCON1にRS485アドオンを接続した場合(デバイスファイル/dev/ttymxc0)の実行結果です。
1秒毎に、土壌水分センサーから体積含水率、電気伝導率、温度のレジスタを読み出して結果を表示します。
root@armadillo:~# ./wd3_modbus /dev/ttymxc0
Opening /dev/ttymxc0 at 9600 bauds (N, 8, 1)
[01][04][01][10][00][02][71][F2]
Waiting for a confirmation...
<01><04><04><70><A4><3F><1D><71><5E>
val: 1, 126, 1929380
[01][04][01][12][00][02][D0][32]
Waiting for a confirmation...
<01><04><04><B2><2D><3F><3D><9C><D4>
val: 1, 126, 4043309
[01][04][01][14][00][02][30][33]
Waiting for a confirmation...
<01><04><04><B8><52><3E><1E><EE><9D>
val: 1, 124, 2013266
Mon Oct 2 14:59:42 2017
VMC : 61.500000[%]
Temp: 27.049999[deg C]
EC : 1.085000[mS/cm]
上記の実行結果は、下記の内容を意味しています。
==========================================
体積含水率
Modbus通信:マスター(Armadillo-IoT(G3)/X1)→スレーブ(土壌水分センサー)
[01][04][01][10][00][02][71][F2]
Modbus通信:スレーブ(土壌水分センサー)→マスター(Armadillo-IoT(G3)/X1)
<01><04><04><70><A4><3F><1D><71><5E>
体積含水率レジスタの値(16進数):0x3F1D70A4
==========================================
温度
Modbus通信:マスター(Armadillo-IoT(G3)/X1)→スレーブ(土壌水分センサー)
[01][04][01][12][00][02][D0][32]
Modbus通信:スレーブ(土壌水分センサー)→マスター(Armadillo-IoT(G3)/X1)
<01><04><04><B2><2D><3F><3D><9C><D4>
温度レジスタの値(16進数):0x3F3DB22D
==========================================
電気伝導度
Modbus通信:マスター(Armadillo-IoT(G3)/X1)→スレーブ(土壌水分センサー)
[01][04][01][14][00][02][30][33]
Modbus通信:スレーブ(土壌水分センサー)→マスター(Armadillo-IoT(G3)/X1)
<01><04><04><B8><52><3E><1E><EE><9D>
電気伝導度レジスタの値(16進数):0x3E1EB852
==========================================
レジスタから読み出した値[V]を、体積含水率(VMC)[%]、温度(Temp)[℃]、電気伝導度(EC)[mS/cm]に計算して表示。
VMC : 61.500000[%]
Temp: 27.049999[deg C]
EC : 1.085000[mS/cm]