ブログ

Armadillo-IoT:OKI製920MHz帯無線+土壌水分センサー(WD-3-WET-5Y)から受信したデータをクラウド(Heroku)で見る

at_kazutaka.bito
2016年3月6日 15時26分

Armadillo-IoT+920MHz帯マルチホップ無線通信アドオンモジュール

920MHz帯マルチホップ無線ユニット(MH920-Node-232(S))

を使って、 Armadillo-IoTから920MHz帯無線経由で、株式会社A・R・P様の土壌水分センサー(WD-3-WET-5Y)

の体積含水率、電気伝導率、温度のデータを読み取って、クラウド(Heroku)経由で見てみました。

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

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

以下、
920MHz帯マルチホップ無線通信アドオンモジュールは、「920MHz無線(親機)」
920MHz帯マルチホップ無線ユニット(MH920-Node-232(S))は、「920MHz無線(子機)RS232Cタイプ」
土壌水分センサー(WD-3-WET-5Y)は、「土壌水分センサー」
と呼称します。

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

手順の概要は下記のようになります。
 1.機材、資料、ツール
 2.土壌水分センサーと920MHz無線(子機)RS232Cタイプの接続
 3.Armadillo-IoTのアドオンインタフェースの設定
 4.Armadillo-IoTから920MHz無線(親機)の設定
 5.Armadillo-IoTから920MHz無線(親機)の運用開始
 6.920MHz無線(子機)RS232Cタイプの設定
 7.土壌水分センサーとの通信仕様の確認
 Appendix.土壌水分センサーとの通信仕様の確認で気になったこと
 8.土壌水分センサーを設定するサンプルプログラム
 9.土壌水分センサーからデータを取得するサンプルプログラム
 10.クラウド(Heroku)側のアプリの準備
 11.土壌水分センサーのデータをクラウド(Heroku)経由で見る

1.機材、資料、ツール

機材は下記のものを使用しました。
・Armadillo-IoT+920MHz帯マルチホップ無線通信アドオンモジュール

今回は、Armadillo-IoTのアドオンインタフェースのコネクタ"CON2"に 920MHz帯マルチホップ無線通信アドオンモジュールを接続しました。(冒頭の写真)

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

土壌水分センサー(WD-3-WET-5Y)

今回の動作確認において、下記の資料、ツールを使用しました。
・OKI製の920MHz帯無線通信モジュール(親機)および後述の920MHz帯無線ユニット(子機)に関するドキュメント、ソフトウェア
 これらは、沖電気工業株式会社様のWebサイトから入手可能です。
 http://www.oki.com/jp/920M/support/
土壌水分センサー(WD-3-WET-5Y)の取扱説明書
(詳細なご質問については、株式会社A・R・P様にお問い合わせ願います。)

2.土壌水分センサーと920MHz無線(子機)RS232Cタイプの接続

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

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

取扱説明書より、

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

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

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

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

上記の回路を経由して、Armadillo-IoT+920MHz無線(子機)RS232Cタイプと土壌水分センサーを接続します。
下の写真は、実際に上記回路をブレッドボードで作って接続した状態です。
上記回路と920MHz無線(子機)RS232Cタイプの接続

上記回路と920MHz無線(子機)RS232Cタイプと土壌水分センサーの接続

備考1)ブレッドボードへの5V電源は、DC5V出力のACアダプタで供給しました。
備考2)ブレッドボードの部品は回路図と同じものではなく、当方で入手可能な部品で代替しました。

3.Armadillo-IoTのアドオンインタフェースの設定

今回確認した手順では、Armadillo-IoTと920MHz帯マルチホップ無線通信アドオンモジュールとは単純にシリアル通信しました。

補足)
<a href=http://conexio-m2m.jp/product/armadillo.html>920MHz帯マルチホップ無線通信アドオンモジュール</a>の正式な導入手順については、
下記コネクシオ株式会社様にお問い合わせください。
 
〒160 -6137
東京都新宿区西8-17-1 新宿グランドタワー37 階
TEL:03-5331-3677
コネクシオ株式会社
法人事業本部 法人営業第6部 システム開発課
m2m@conexio.co.jp

Armadillo-IoT ゲートウェイスタンダードモデル製品マニュアル 8.3.3. UARTより、 今回使用するアドオンインタフェースは、CON2の/dev/ttymxc0なので、 UART1:/dev/ttymxc0 を有効にします。

アドオンインタフェース(CON2)のシリアル通信(UART1)を有効にするために カーネルコンフィギュレーションで下記のように設定します。

Kernel Configuration
System Type  --->
      [*] Freescale i.MX family                                              <ARCH_MXC>
            Freescale i.MX support  --->
              [*] Support Armadillo-IoTG Std Base board       <MACH_ARMADILLO_IOTG_STD>
              [ ]   Add-On Module Auto Detect             <AIOTG_STD_ADDON_AUTO_DETECT>
                    Extension I/F Options  --->
                        [*] Enable UART1 at CON1/CON2                 <AIOTG_STD_UART1>
                        [ ]   Enable UART1 HW flow control at CON1/CON2
                                                              <AIOTG_STD_UART1_HW_FLOW> 

上記のコンフィギュレーション後、ビルドを行い、イメージをArmadillo-IoTに書き込みます。

4.Armadillo-IoTから920MHz無線(親機)の設定

下記手順において、920MHz無線のコマンド、設定はAPI仕様書等のドキュメントを参考にしています。

補足)
OKI製の920MHz帯無線通信モジュール(親機)および後述の920MHz帯無線ユニット(子機)に関する
ドキュメント、ソフトウェアは、沖電気工業株式会社様のWebサイトから入手可能です。
<a href=http://www.oki.com/jp/920M/support/>http://www.oki.com/jp/920M/support/</a>

920MHz無線(親機)の運用開始までのシーケンスは下記のとおりです。

920MHz無線(親機)-> Armadillo-IoT:起動完了通知
Armadillo-IoT -> 920MHz無線(親機):基本設定
920MHz無線(親機)-> Armadillo-IoT:基本設定応答
Armadillo-IoT -> 920MHz無線(親機):初期コンフィギュレーション設定(暗号化鍵等)
920MHz無線(親機)-> Armadillo-IoT:初期コンフィギュレーション設定応答
Armadillo-IoT -> 920MHz無線(親機):運用開始要求
<無線起動->子機ネットワーク接続開始>
920MHz無線(親機)-> Armadillo-IoT:運用開始応答
(無線起動後、子機ネットワーク接続完了することで通信可能)

今回は、Armadillo-IoTから920MHz無線(親機)の設定、確認を行いました。

補足)
920MHz無線(親機)にはマイクロUSBコネクタが搭載されているので、PCと直接接続して設定することが可能です。
この場合は、沖電気工業株式会社様の保守コンソールのソフトウェア「MH920 Console for Module」を使用します。

920MHz無線(親機)とArmadillo-IoTとの通信のデータ構造は下記のとおりです。 ・Armadillo-IoTから920MHz無線(親機)への設定、確認

・920MHz無線(親機)からArmadillo-IoTへの応答、通知

(Data内で"0x7e"を使う場合は、エスケープシーケンスで補完します。ここでは説明を割愛します。)

上記のデータ構造を参考に、Armadillo-IoTから920MHz無線(親機)の設定、確認を行うサンプルプログラムを添付します。
serial_oki920_set_rs232c.tar.gz
プログラム内では、各コマンドはcmd_***という名称の配列で設定しています。 また、各コマンドに対する920MHz無線(親機)の応答が標準出力されるようにしています。

各コマンドの用途を説明します。
・基本設定確認のコマンド(cmdid=0x01)

static unsigned char cmd_01[15] = {0x7e, 0x10, 0x00, 0x0a, 
0x10, 0x8f, 0x8f, 0x01, 0x01, 0x12, 0x34, 0x00, 0x01, 0x02, 0x7e};

今回は、このコマンドに対する応答でPAN-ID、ネットワークID、chリストを確認しました。 PAN-ID、ネットワークID、chリストを、後述の920MHz無線(子機)RS232Cタイプに設定します。

・MACアドレスリスト確認のコマンド(cmdid=0x11)

static unsigned char cmd_11[15] = {0x7e, 0x10, 0x00, 0x0a, 
0x10, 0x8f, 0x8f, 0x01, 0x11, 0x13, 0x57, 0x00, 0x01, 0x02, 0x7e};

今回は、このコマンドに対する応答で「MACアドレス認証しない」に設定になっていることを確認しました。

・暗号化鍵確認のコマンド(cmdid=0x10)

static unsigned char cmd_10[78] = {0x7e, 0x10, 0x00, 0x49, 
0x10, 0x8f, 0x8f, 0x01, 0x10, 0x12, 0x34, 0x00, 0x40, 
/* 略 */
0x7e};

このコマンドに対する応答で確認した暗号化鍵を後述の920MHz無線(子機)RS232Cタイプに設定します。 (暗号化鍵設定のコマンドは割愛します。)

・パケットフィルタリング確認のコマンド(cmdid=0x23)

static unsigned char cmd_23[15] = {0x7e, 0x10, 0x00, 0x0a, 
0x10, 0x8f, 0x8f, 0x01, 0x23, 0x24, 0x68, 0x00, 0x01, 0x02, 0x7e};

このコマンドに対する応答で確認したパケットフィルタリングの設定を後述の920MHz無線(子機)RS232Cタイプに設定します。

・局番号解析用データ確認のコマンド(cmdid=0x06)

static unsigned char cmd_06[15] = {0x7e, 0x10, 0x00, 0x0a, 
0x10, 0x8f, 0x8f, 0x01, 0x06, 0x24, 0x68, 0x00, 0x01, 0x02, 0x7e};

このコマンドに対する応答で、下記の局番号解析用データ設定コマンドが反映されたかを確認しました。

・局番号解析用データ設定のコマンド(cmdid=0x06)

static unsigned char cmd_06w[41] = {0x7e, 0x10, 0x00, 0x24, 
0x10, 0x8f, 0x8f, 0x01, 0x06, 0x12, 0x34, 0x00, 0x1b, 
0x01, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
0x00, 0x00, 0x00, 0x00, 
0x00,
0x7e};

このコマンドでプロトコルとデバイス接続数or局番解析の設定ができます。
今回は、土壌水分センサーを1台接続し、プロトコルは使わないので、
 デバイス接続数:1
 プロトコル種別:指定なし
に設定しました。

<サンプルプログラムの補足>
・Armadillo-IoTと920MHz無線(親機)とはシリアル通信であることから、
 Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー
 をベースに、シリアル通信で受信したデータを、今回の920MHz無線のAPI仕様(注)に基づいて通信するように改造したものです。

注)今回使用したコマンドは、上記のように静的に設定しているので、任意のAPI仕様には対応していません。
 また、受信データについては、ヘッダサーチ、CRC計算などは有していません。

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

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

[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_set_rs232c /dev/ttymxc0

コマンド実行後、920MHz無線(親機)からの応答がコンソールに出力されますので、 PAN-ID、ネットワークID、chリスト、暗号化鍵等を確認します。 応答待ちの状態が継続するので、Ctr+Cでプログラムを終了してください。

5.Armadillo-IoTから920MHz無線(親機)の運用開始

無線を起動するため、運用開始のコマンドを発行します。 Armadillo-IoTから920MHz無線(親機)の運用開始のコマンドを発行するサンプルプログラムを添付します。
serial_oki920_start_20151115.tar.gz
上記3と同様に運用開始のコマンドを配列に設定して、シリアル通信で920MHz無線(親機)に設定しています。

・運用開始のコマンド(cmdid=0xd3)

static unsigned char cmd_d3[14] = {0x7e, 0x10, 0x00, 0x09, 
0x10, 0x8f, 0x8f, 0x01, 0xd3, 0x56, 0x78, 0x00, 0x00, 0x7e};

このコマンド実行により無線が起動します。

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

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

[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_start /dev/ttymxc0

応答待ちの状態が継続するので、Ctr+Cでプログラムを終了してください。
(単に応答待ちの状態を終了しているだけなので、プログラムは終了しても、  920MHz無線(親機)の無線は起動したままになっています。)

5.920MHz無線(子機)RS232Cタイプの設定

920MHz無線(子機)RS232CタイプとPCをUSBで接続してください。
沖電気工業株式会社様の保守コンソールのソフトウェア「MH920 Console Lite」を使用して設定を行います。
設定方法は製品マニュアル等のドキュメントを参照してください。

下記の説明の設定項目については、各タグの「詳細表示」をチェックしないと表示されないものがありますので、 「詳細表示」をチェックして設定してください。

・「基本設定」のタグでは、上記3で設定、確認したPAN-ID、ネットワーク-ID、チャネル番号、暗号鍵を設定します。
 ショートアドレスは、0000ではない値(今回は、0001)を設定します。

・「シリアル通信」のタグでは、土壌水分センサー(の取扱説明書の記載内容)に合わせて設定します。
 インタフェース種別:RS232C
 端末接続:あり
 ビットレート:9600bps
 ビット長:8bit
 ストップビット:1bit
 パリティ:none(なし)

・「プロトコル設定」のタグでは、下記のように設定しました。
  終了検出方法:終了文字コード
  終了文字コード1:あり:0A
  終了文字コード2:なし
  パケットフィルタリング:920MHz無線(親機)の設定(今回は「なし」)に合わせます。

・「経路固定設定」のタグでは、経路固定を「無効」に設定しました。

上記を設定後、「無線機に設定」ボタンを押して、920MHz無線(子機)RS232Cタイプに設定します。
設定が反映されるのは再起動後なので、設定を変更した場合は、電源をON->OFFします。

手順5で、920MHz無線(親機)の運用を開始していると、920MHz無線(親機)とネットワーク接続されます。 (接続に20秒くらいかかります。)
接続が成功すると、920MHz無線(子機)RS232CタイプのLEDのうち、STS2の箇所が点灯し、RSSIの箇所は強さに応じて点灯(3つまで)します。

7.土壌水分センサーとの通信仕様の確認

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

(土壌水分センサーの電源投入後、1秒以上待つ。)
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: 改行コード

今回の動作確認に先だって、 Armadillo-IoT+RS232Cアドオン:土壌水分センサー(WD-3-WET-5Y)のデータをクラウド(Heroku)経由で見る の方法で、シリアル通信を行うtipコマンドを使って、実際に通信すると下記のようなログになります。

[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.土壌水分センサーとの通信仕様の確認で気になったこと

Armadillo-IoT+RS232Cアドオン:土壌水分センサー(WD-3-WET-5Y)のデータをクラウド(Heroku)経由で見る に記載のとおり、送信する文字を間違えると、"N"が返信されたり、返信がなかったり、通信が異常になる状態になります。 この異常状態から、コマンドで復帰する方法はなく、土壌水分センサーの電源をOFF->ONする必要があるようです。

今回の手順では、920MHz無線(子機)RS232Cタイプと土壌水分センサーは、RS232C通信の信号線のみで接続されているため、無線通信で土壌水分センサーの電源をOFF->ON可能なようにはなっていませんので、土壌水分センサーの通信が異常状態になった場合は、土壌水分センサーの電源を手動でOFF->ONする必要があります。

8.土壌水分センサーを設定するサンプルプログラム

Armadillo-IoTから920MHz無線を経由して土壌水分センサーと通信するには、920MHz無線(親機)と透過データというデータ構造で通信します。 透過データの構造は下記のようになっています。

このデータ構造において、Dataの箇所に手順7の土壌水分センサーのコマンドを埋めることで、土壌水分センサーと通信できます。

手順7のコマンドを920MHz無線(親機)への透過データに埋め込むと下記のようになります。

・P を送信する。(開始要求)
0x7e, 0x11, 0x00, 0x01, 0x50, 0x7e

・A を送信する。(パスワード"ARP."の1文字目)
・R を送信する。(パスワード"ARP."の2文字目)
・P を送信する。(パスワード"ARP."の3文字目)
・. を送信する。(パスワード"ARP."の4文字目)
0x7e, 0x11, 0x00, 0x04, 0x41, 0x52, 0x50, 0x2e, 0x7e

・M を送信する。(特殊モード要求)
0x7e, 0x11, 0x00, 0x01, 0x4d, 0x7e

・D を送信する。(デジタルデータ要求)
0x7e, 0x11, 0x00, 0x01, 0x44, 0x7e

上記の方法で、920MHz無線経由で土壌水分センサーの設定を行うサンプルプログラムを作成しました。
serial_oki920_wd3_set.tar.gz

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

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

これまでの手順で、920MHz無線(親機)、920MHz無線(子機)RS232Cタイプの設定および、920MHz無線の運用が開始されている状態で、かつ、土壌水分センサーの電源投入から1秒以上経過している状態で、serial_oki920_wd3_setを実行します。

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

下記は実行例です。
(Armadillo-IoTのCON2に920MHz(親機)を接続している(シリアルインタフェースのデバイスファイルが"/dev/ttymxc0")の場合)

[root@armadillo-iotg (ttymxc1) ~]# ./serial_oki920_wd3_set /dev/ttymxc0
 
****************************************************
-------- Command: WD-3 start
 
****************************************************
-------- Command: WD-3 password
 
****************************************************
-------- Command: WD-3 mode
 
****************************************************
-------- Command: WD-3 sensor
0x7e 0x11 0x00 0x25 0x50 0x4f 0x41 0x52 0x50 0x2e 0x4f 0x4d 0x4f 0x44 0x57 0x3d 0x30 0x2e 0x30 0x30 0x30 0x2c 0x45 0x3d 0x30 0x2e 0x30 0x30 0x30 0x2c 0x54 0x3d 0x30 0x2e 0x37 0x32 0x34 0x44 0x36 0x0d 0x0a 0x7e
######## Finish WD-3 setting ########

末尾に ######## Finish WD-3 setting ######## が表示されていれば、正常に設定されています。 失敗している場合は、土壌水分センサーの電源をOFF->ON後、1秒以上経過してから再度実行してください。

備考)
######## Finish WD-3 setting ########直前の16進数は、920MHz無線(子機)RS232Cタイプから取得した透過データです。
5番目(上記のログの場合、0x50)から、ASCIIコードでキャラクタに変換すると、手順7で確認した 土壌水分センサーの設定とデータ取得の文字列 POARP.OMODW=0.000,E=0.000,T=0.738DB のようになっていることがわかると思います。

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

/**** sample: interval timer :begin ****/
// タイマー関連。期待通りのレスポンスがない場合のタイムアウト。
/**** sample: interval timer: end ****/
 
/**** sample: oki920/WD-3 command: begin ****/
// 土壌水分センサーへのコマンドを920MHz無線の透過データに埋め込んだもの
static unsigned char cmd_toka_wd3_start[] = {0x7e, 0x11, 0x00, 0x01, 
0x50, /* P */
0x7e};
 
static unsigned char cmd_toka_wd3_pwd[] = {0x7e, 0x11, 0x00, 0x04, 
0x41, 0x52, 0x50, 0x2e, /* ARP. */
0x7e};
 
static unsigned char cmd_toka_wd3_mode[] = {0x7e, 0x11, 0x00, 0x01, 
0x4d, /* M */
0x7e};
 
static unsigned char cmd_toka_wd3_sensor[] = {0x7e, 0x11, 0x00, 0x01, 
0x44, /* D */
0x7e};
/**** sample: oki920/WD-3 command: end ****/
 
/**** sample: set WD-3: begin ****/
// 920MHz(子機)RS232Cタイプへ、土壌水分センサーのコマンドの透過データを送信
/**** sample: set WD-3: end ****/
 
/**** sample: receive: begin ****/
// 920MHz(子機)RS232Cタイプからの応答処理。
/**** sample: receive: end ****/

補足)今回は手順5で、920MHz無線(子機)RS232Cタイプのシリアル通信プロトコルの設定で、
  終了検出方法:終了文字コード
  終了文字コード1:あり:0A
しています。
/**** sample: oki920/WD-3 command: begin ****/
/**** sample: oki920/WD-3 command: end ****/
で実行しているコマンドのうち、土壌水分センサーから0A(改行文字:LF)の応答があるのは、最後の
・D を送信する。(デジタルデータ要求)
だけですので、途中の設定コマンドに対する応答は確認せず(sleepのみ)、 最後の
・D を送信する。(デジタルデータ要求)
で、データを取得できることで設定完了を判断しています。

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

手順8のサンプルプログラムの
・D を送信する。(デジタルデータ要求)
0x7e, 0x11, 0x00, 0x01, 0x44, 0x7e の部分を流用して、920MHz無線の透過データから、土壌水分センサーの体積含水率、電気伝導度、温度の抽出と算出、 ログ表示とログファイルへの書き込みを行うサンプルプログラムを作成しました。
serial_oki920_wd3_data.tar.gz

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

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

手順8を実行済みの状態で、serial_oki920_wd3_dataを実行します。

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

下記は実行例です。
(Armadillo-IoTのCON2に920MHz(親機)を接続している(シリアルインタフェースのデバイスファイルが"/dev/ttymxc0")の場合)

[root@armadillo-iotg (ttymxc1) ~]# ./serial_oki920_wd3_data /dev/ttymxc0
 
****************************************************
-------- Command: WD-3 sensor
0x7e 0x11 0x00 0x1c 0x44 0x57 0x3d 0x30 0x2e 0x36 0x33 0x31 0x2c 0x45 0x3d 0x30 0x2e 0x32 0x30 0x34 0x2c 0x54 0x3d 0x30 0x2e 0x36 0x39 0x38 0x46 0x30 0x0d 0x0a 0x7e
######## Finish WD-3 data ########
DW=0.631,E=0.204,T=0.698
****************************************************
 
---------  sensor data --------
~
VMC[%]=63.1 (= 0.631 * 100)
EC[mS/cm]=1.428 (= 0.204 * 7)
TMP[degC]=29.083 (= 0.698 / 1.2 * 50)

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

vmc=59.2&ec=1.050&tmp=31.042

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

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

/**** sample: interval timer :begin ****/
// タイマー関連。期待通りのレスポンスがない場合のタイムアウト。
/**** sample: interval timer: end ****/
 
/**** sample: oki920/WD-3 command: begin ****/
// 土壌水分センサーへのデータ要求のコマンドを920MHz無線の透過データに埋め込んだもの
static unsigned char cmd_toka_wd3_sensor[] = {0x7e, 0x11, 0x00, 0x01, 
0x44, /* D */
0x7e};
/**** sample: oki920/WD-3 command: end ****/
 
/**** sample: char(HEX) to int: begin ****/ 
// テキストの16進数を10進数に変える関数
/**** sample: char(HEX) to int: 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: set WD-3: begin ****/
// 920MHz(子機)RS232Cタイプへ、土壌水分センサーのコマンドの透過データを送信
/**** sample: set WD-3: end ****/
 
/**** sample: receive: begin ****/
// 920MHz(子機)RS232Cタイプからの応答処理。
/**** sample: analize sensor data: begin ****/
// ※)920MHz無線の透過データから、体積含水率、電気伝導度、温度を抽出し、算出。
/**** 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: receive: end ****/

※)上記実行例のログ

[root@armadillo-iotg (ttymxc1) ~]# ./serial_oki920_wd3_data /dev/ttymxc0
 
****************************************************
-------- Command: WD-3 sensor
0x7e 0x11 0x00 0x1c 0x44 0x57 0x3d 0x30 0x2e 0x36 0x33 0x31 0x2c 0x45 0x3d 0x30 0x2e 0x32 0x30 0x34 0x2c 0x54 0x3d 0x30 0x2e 0x36 0x39 0x38 0x46 0x30 0x0d 0x0a 0x7e

-------- Command: WD-3 sensorの下の16進数は、920MHz無線(子機)RS232Cタイプから受信した透過データです。 5番目(上記のログの場合、0x44)から、ASCIIコードでキャラクタに変換すると、手順7で確認した 土壌水分センサーのデータ要求のコマンド(Dを送信)以降の文字列
DW=0.000,E=0.000,T=0.738DB
のようになっていることがわかると思います。
/**** sample: analize sensor data: begin ****/
/**** sample: analize sensor data: end ****/
では、
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倍する
に該当するデータが、透過データの何番目にあるかを指定して、土壌水分センサーのデータの抽出を行っています。

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

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

10.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です。

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

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

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

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

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

このスクリプトをArmadillo-IoTの/rootディレクトリに置いて、実行権限をつけてください。 このスクリプトを使うにあたり、手順9まで実行済みとします。 Armadillo-IoTの/rootディレクトリに置いて実行します。

[root@armadillo-iotg (ttymxc1) ~]# chmod +x send_wd3_via_oki920.sh
[root@armadillo-iotg (ttymxc1) ~]# ls /root
send_wd3_via_oki920.sh
serial_oki920_wd3_data

send_wd3_via_oki920.shは、下記のように使用します。

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

例)Armadillo-IoTのCON2に920MHz(親機)を接続(シリアルインタフェースのデバイスファイルが"/dev/ttymxc0")し、 HerokuのURLが***.herokuapp.comの場合、下記のように実行します。

[root@armadillo-iotg (ttymxc1) ~]# ./send_wd3_via_oki920.sh /dev/ttymxc0 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の標準出力で確認することができます。