ブログ

Armadillo-IoT:OKI製920MHz帯無線ユニット経由で、RS485(Modbus)のCO2コントローラーと通信してみました。

at_kazutaka.bito
2015年11月15日 17時11分
Armadillo-IoT+920MHz帯マルチホップ無線通信アドオンモジュール920MHz帯マルチホップ無線ユニット(MH920-Node-485(S))CO2コントローラー(NMA-VRC-II)
を使って、

Armadillo-IoTから920MHz帯無線で、RS485(Modbus)通信のCO2コントローラーのCO2濃度のデータを読み取ってみました。
当方で確認した手順、サンプルプログラムを下記に説明します。
(サンプルプログラムで取得したCO2濃度データを、簡易的にHerokuに送信してWebブラウザで確認する方法も記載しました。)

なお、下記手順内で、パラメータ、設定等を説明していますが、当方の確認手順に沿った簡易的なものです。
詳細の仕様は各メーカー様へお問い合わせください。

1.機材の準備

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

 下記説明内のデバイスファイル"/dev/ttymxc0"の箇所は、アドオンモジュールを接続するコネクタ(CON1、CON2)に応じて、   CON1使用時:/dev/ttymxc3   CON2使用時:/dev/ttymxc0  と読み替える必要があります。 ・920MHz帯マルチホップ無線ユニット(MH920-Node-485(S))CO2コントローラー(NMA-VRC-II)  これらの装置の接続はRS485です。下記写真では、青がD+、白がD-です。

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

今回確認した手順では、Armadillo-IoTと920MHz帯マルチホップ無線通信アドオンモジュールとは単純にシリアル通信しました。 ------------------------------------------------------------------------------------ 補足) 920MHz帯マルチホップ無線通信アドオンモジュールの正式な導入手順については、 下記コネクシオ株式会社様にお問い合わせください。 〒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に書き込みます。 注)以降の説明では、
920MHz帯マルチホップ無線通信アドオンモジュールは、「920MHz無線(親機)」
920MHz帯マルチホップ無線ユニット(MH920-Node-485(S))は、「920MHz無線(子機)」
CO2コントローラー(NMA-VRC-II)は、「CO2センサー」
と略します。

3.Armadillo-IoTから920MHz無線(親機)の設定と運用開始

下記手順において、920MHz無線のコマンド、設定はAPI仕様書等のドキュメントを参考にしています。 ------------------------------------------------------------------------------------ 補足) OKI製の920MHz帯無線通信モジュール(親機)および後述の920MHz帯無線ユニット(子機)に関する ドキュメント、ソフトウェアは、沖電気工業株式会社様のWebサイトから入手可能です。 http://www.oki.com/jp/920M/support/ ------------------------------------------------------------------------------------ 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_20151117.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無線(子機)に設定します。 ・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無線(子機)に設定します。 (暗号化鍵設定のコマンドは割愛します。) ・パケットフィルタリング確認のコマンド(cmdid=0x23)
static unsigned char cmd_23[15] = {0x7e, 0x10, 0x00, 0x0a, 
0x10, 0x8f, 0x8f, 0x01, 0x23, 0x24, 0x68, 0x00, 0x01, 0x02, 0x7e};
このコマンドに対する応答で確認したパケットフィルタリングの設定を後述の920MHz無線(子機)に設定します。 ・局番号解析用データ確認のコマンド(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, 0xff, 0x01, 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};
このコマンドでプロトコルと局番解析の設定ができます。 今回は、Modbus(RTU)、局番解析あり、に設定しました。 ・局番リストの確認のコマンド(cmdid=0x88)
static unsigned char cmd_88[15] = {0x7e, 0x10, 0x00, 0x0a, 
0x10, 0x8f, 0x8f, 0x01, 0x88, 0x12, 0x34, 0x00, 0x01, 0x02, 0x7e};
このコマンドに対する応答で、下記の局番リスト設定コマンドが反映されたかを確認しました。 ・局番リストの確認、設定のコマンド(cmdid=0x88)
static unsigned char cmd_88w1[919] = /* 略 */
static unsigned char cmd_88w2[919] = /* 略 */
このコマンドで、920MHz無線(子機)のショートアドレス(0001)と、CO2センサーの局番(1)を登録しました。 ここで設定したショートアドレス0001は、後述の920MHz無線(子機)に設定します。 CO2センサーの局番は、本体内のロータリースイッチで設定できます。 <サンプルプログラムの補足> ・Armadillo-IoTと920MHz無線(親機)とはシリアル通信であることから、  Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー  をベースに、シリアル通信で受信したデータを、今回の920MHz無線のAPI仕様(注)に基づいて通信するように改造したものです。 注)今回使用したコマンドは、上記のように静的に設定しているので、任意のAPI仕様には対応していません。  また、受信データについては、ヘッダサーチ、CRC計算などは有していません。 <サンプルプログラムの用法> 添付のサンプルプログラムをATDE上に解凍して、serial_oki920_set_20151117ディレクトリ内でmakeすると、 serial_oki920_setという実行ファイルができます。 この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。 (下記は920MHz無線(親機)をArmadillo-IoTのアドオンインタフェースのCON2に接続した場合のため、/dev/ttymxc0を指定。)
[root@armadillo-iotg (ttymxc1) ~]# stty -F /dev/ttymxc0 115200 raw
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_set /dev/ttymxc0
コマンド実行後、920MHz無線(親機)からの応答がコンソールに出力されますので、 PAN-ID、ネットワークID、chリスト、暗号化鍵等を確認します。 応答待ちの状態が継続するので、Ctr+Cでプログラムを終了してください。

4.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無線(子機)の設定

920MHz無線(子機)とPCをUSBで接続してください。 沖電気工業株式会社様の保守コンソールのソフトウェア「MH920 Console Lite」を使用して設定を行います。 設定方法は製品マニュアル等のドキュメントを参照してください。 下記の説明の設定項目については、各タグの「詳細表示」をチェックしないと表示されないものがありますので、 「詳細表示」をチェックして設定してください。 ・「基本設定」のタグでは、上記3で設定、確認したPAN-ID、ネットワーク-ID、チャネル番号、暗号鍵、ショートアドレスを設定します。 ・「シリアル通信」のタグでは、CO2センサーに合わせて設定します。  インタフェース種別:RS485  端末接続:あり  ビットレート:19200bps  ビット長:8bit  ストップビット:1bit  パリティ:odd(奇数) ・「プロトコル設定」のタグでは、終了検出方法を「無通信状態の時間」に設定しました。  パケットフィルタリングは、920MHz無線(親機)の設定に合わせます。 ・「経路固定設定」のタグでは、経路固定を「無効」に設定しました。 上記を設定後、「無線機に設定」ボタンを押して、920MHz無線(子機)に設定すると、920MHz無線(親機)とネットワーク接続されます。 (接続に20秒くらいかかります。) 接続が成功すると、920MHz無線(子機)のLEDのうち、STS2の箇所が点灯し、RSSIの箇所は強さに応じて点灯(3つまで)します。

6.CO2センサーからCO2データを読む

CO2センサーはRS-485 Modbusで通信します。 取扱説明書より、CO2、温度、湿度データを読むコマンドは下記のとおりです。  CO2濃度:01 03 00 44 00 01 c4 1f  温度 :01 03 00 45 00 01 95 df  湿度 :01 03 00 46 00 01 65 df Modbusプロトコルで解釈すると、上記コマンドは、 ・局番:0x01 ・下記レジスタから1byteをリード  0x44:CO2濃度  0x45:温度  0x46:湿度 ・末尾の2ByteはCRC となっているようです。 今回使用しているCO2センサーは本体内のロータリースイッチで局番を0x01に設定しているので、上記のコマンドをそのまま使用できます。 (局番が違う場合は、先頭の1Byteを変更の上、末尾のCRCを計算しなおした値にする必要があります。) CO2センサーは上記のコマンドを受信すると、  CO2濃度:01 03 02 04 F6 3A C2 のように返信します。 取扱説明書よると、01 03 02に続く2Byte(04 F6)を10進数にした値が、CO2濃度(0x04F6=1270[ppm])になります。 Armadillo-IoTから920MHz無線を経由してCO2センサーと通信するには、920MHz無線(親機)と透過データというデータ構造で通信します。 透過データの構造は下記のようになっています。

このデータ構造において、Dataの箇所に上記のCO2センサーのコマンドを埋めることで、CO2センサーと通信できます。 ・CO2センサーからCO2濃度のデータを読む際に、Armadillo-IoTから920MHz無線(親機)に送信するデータは下記のようになります。
7e 11 00 08 01 03 00 44 00 01 c4 1f 7e
・上記データに対して920MHz無線(子機)経由でCO2センサーと通信が成功すると、920MHz無線(親機)から下記のような透過データが 返信されます。
7e 11 00 07 01 03 02 02 76 38 c2 7e
透過データのData部がCO2センサーからの応答(CO2濃度のデータ)になります。
 01 03 02 02 76 38 c2
上述のとおり、CO2センサーのCO2濃度のデータは01 03 02に続く2Byte(02 76)を10進数にした値(0x0276=630[ppm])になります。 Armadillo-IoTから920MHz無線経由でCO2センサーのCO2濃度データを取得するサンプルプログラムを添付します。 serial_oki920_co2read_20151117.tar.gz ・CO2センサーへCO2濃度のデータを要求するコマンドを透過データとして送信するコマンド
static unsigned char cmd_toka_co2[13] = {0x7e, 0x11, 0x00, 0x08, 
0x01, 0x03, 0x00, 0x44, 0x00, 0x01, 0xc4, 0x1f, 
0x7e};
このコマンドをArmadillo-IoTから920MHz無線(親機)に送信しています。 920MHz無線(子機)からの受信データは、
0x7e 0x11 0x00 0x07 0x01 0x03 0x02 0x02 0x76 0x38 0xc2 0x7e
のような透過データの構造になっているので、透過データのData部
0x01 0x03 0x02 0x02 0x76 0x38 0xc2
の0x01 0x03 0x02に続く2ByteをCO2濃度のデータとして計算します。 <サンプルプログラムの用法> 添付のサンプルプログラムをATDE上に解凍して、serial_oki920_co2read_20151117ディレクトリ内でmakeすると、 serial_oki920_co2readという実行ファイルができます。 この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。 (下記は920MHz無線(親機)をArmadillo-IoTのアドオンインタフェースのCON2に接続した場合のため、/dev/ttymxc0を指定。)
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_co2read /dev/ttymxc0
このコマンドを実行して、CO2センサーから応答があると、/root/log_oki920co2.txtファイルに
630[ppm]
のようにCO2濃度のデータが出力されます。

7.OKI製920MHz帯無線通信で取得したセンサーのデータをHerokuに送って、Webブラウザで確認

上記のサンプルプログラムを使って、CO2センサーのデータを出力したファイル"log_oki920co2.txt"の内容を Herokuに送信という仕組みを追加してみました。 Herokuへの送信は5秒間隔で"log_oki920co2.txt"の内容を送信します。 また、Herokuへの送信中はArmadillo-IoTの側面の緑LED(led3)を点灯するようにもしています。 まず、 Armadillo-IoTからHerokuに送信した文字をWebブラウザで見るを一通り実行して Armadillo-IoTからHerokuに送信した文字がWebブラウザで見えることを確認してください。 (下記文中の"***.herokuapp.com"は自分で作成したHerokuのURLに読み替えてください。) Armadillo-IoTに下記スクリプトを作成します。(ここでは、send_oki920_co2というファイル名とします。) send_oki920_co2
#!/bin/sh
 
stty -F /dev/ttymxc0 115200 raw
 
echo "CO2 sensor is not exist" > /root/log_oki920co2.txt
 
VAR1=0
 
while :
do
  /root/serial_oki920_co2read /dev/ttymxc0
  sleep 2
  VAR1=`cat /root/log_oki920co2.txt`
  echo
  echo 1 > /sys/class/leds/led3/brightness
  wget -O- -q --post-data="data=$VAR1" https://***.herokuapp.com/series
  echo 0 > /sys/class/leds/led3/brightness
  sleep 3
done
補足) 上記スクリプトにおいて
stty -F /dev/ttymxc0 115200 raw
/root/serial_oki920_co2read /dev/ttymxc0 &
の箇所は、 ・Armadillo-IoTのCON2に920MHz無線(親機)を接続 ・"serial_oki920_co2read"を/rootディレクトリに置いた 場合を想定しています。 Armadillo-IoTのCON1に920MHz無線(親機)を接続した場合は、/dev/ttymxc0を/dev/ttymxc3に変更してください。 "serial_oki920_co2read"を/root以外に置いた場合は、/root/serial_oki920_co2readの箇所を変更してください。 上記スクリプト(send_oki920_co2)に実行権限を付けて実行します。
[root@armadillo-iotg (ttymxc1) ~]#  chmod +x send_oki920_co2
[root@armadillo-iotg (ttymxc1) ~]#  ./send_oki920_co2
Webブラウザで、https://***.herokuapp.comにアクセスすると、Armadillo-IoTが送信したCO2センサーのデータが表示されます。 注意)Webブラウザの表示の更新には再読み込みが必要です。。 補足)Armadillo-IoTからHerokuに送信した文字をWebブラウザで見るのHerokuで動作しているアプリ(app.js)により、 Armadillo-IoTにはHerokuが受け取った文字列が返信されて、標準出力に見えます。