DIGI XBEE SENSORを使ってみた

研究室で研究をしていたら教授に「何かに使えるかもしれないから動かしてみてほしい」と言われて古のDIGI製品を渡された。いつもなら「あw僕忙しいんでwww」と言って断るのだが、頼まれた日の前日にとんでもないミスをして教授に迷惑をかけてしまっていたので償いとして今回だけ取り組むことにした。今回だけね。

DIGI XBEE SENSORとは

f:id:dev-moyashi:20181110234425j:plain:w300

2008年にDigi International社から販売されたIoT通信デバイスの1つ。乾電池3本で照度と温度と湿度を測定することが可能で、10~15分に一度センサデータを取得するように設定すると数ヶ月は稼働させることが可能らしい。価格は2018年11月9日現在で1個$154.24(1万7500円)もする。製品カタログはこちら

カタログの例ではConnectPort Xという専用のゲートウェイが使用されており、この製品を使えば全て解決するんだなと思い価格を見たら1台$859.01(9万7850円)と非常にお高い値段だったため、意地でもゲートウェイを使わずにセンサデータを取得してやると心に固く誓った。とはいえ専用ゲートウェイを使用せずにDIGI XBEE SENSORとXBee S2C同士で通信を行うことができるのかこのときまだ分かっていなかったので疑問点を明確にして一つずつ解決していくことにした。

疑問点

  • DIGI XBEE SENSORに内蔵されているXBeeモジュール(恐らくS2B)とXBee S2Cで通信を行うことが可能なのか
  • DIGI XBEE SENSORに内蔵されているXBeeモジュールの設定をどうやって変更するのか
  • 専用ゲートウェイを使用せずにどうやってセンサデータを取得するのか

回答

S2BとS2Bの間で通信ができるのか

ZBシリーズ同士なら通信することが可能らしい。ファームウェアのバージョンを揃えた方が安定動作するらしいが自分の場合は揃えなくても問題なく動作した。

Digi Forum [communication between s2b and s2c]

XBeeモジュールの設定をどうやって変更するのか

コーディネーターとして動作している親機を使用してXCTUでネットワークスキャンを行い、エンドデバイスルーターを検出してリモートで設定変更を行う。 ネットワークスキャンの詳細についてはZigbee入門を参照してほしい。

センサデータの取得方法

リモートのXBeeに対してATコマンドを送信してセンサデータを取得するか、センサデータが垂れ流しに状態になっているので普通にシリアルデータを読み込む。

XCTUでXBeeの設定を変更する

親機の設定

XBee S2C(親機)を接続したシリアルポートからデバイスを読み込み、下記の設定を書き込む。

設定項目
ID: PAN ID 任意
CE: Coordinator Enable 有効
JV: Channel Verification 有効
JN: Join Notification 有効
AP: API Enable 2

※ 親機のAPIモードを2に設定しないと子機デバイスを検知できないので注意

子機の設定

親機を接続した状態でデバイスリストに表示されているこのボタンf:id:dev-moyashi:20181110010224p:plain:w25:h20をクリックしてリモートデバイスを検出する。その後、下記の設定を書き込む。

設定項目
ID: PAN ID 親機に設定したID
JN: JoinNotification 有効
DH: Destination Address High 親機のMACアドレス上位8桁
DL: Destination Address Low 親機のMACアドレス下位8桁
SP: Cyclic Sleep Period スリープさせたい時間

※ SPの設定項目には×10[ms]と書いてあるが実際は入力した時間だけスリープされる。

ATコマンドを送信する

ATコマンドの直打ちはめんどうなのでXBee API Frame Generatorを使用してコマンド の生成を行う。Frame typeを0x17、AT commandの欄にISと入力すれば完成。

ちなみにISコマンド は有効になっている全てのデジタル入力とアナログ入力のピンを読み込むためのコマンドです。

The Force Sample (IS) command forces a read of all enabled digital and analog input pins.

引用: How to obtain data from a sensor

f:id:dev-moyashi:20181111004543p:plain:w500

ATコマンドの生成ができたらOpenと書いてあるボタンを押して親機と子機を接続した状態にする。その後、Send select frameボタンを押してコマンドの送信を行いレスポンスが正常に返ってくることを確認する。

f:id:dev-moyashi:20181111005605p:plain:w500

Arduinoでセンサデータを受信してみる

Arduinoを使うのが一番簡単なので使用した。XBeeを取り付けるためのシールドと、PCとArduino間でシリアル通信を行うためのシリアル変換基板を準備して下記のように接続した。

f:id:dev-moyashi:20181111020029j:plain:w500

DIGI XBEE SENSORと同じネットワークに接続すると親機がFrame type 0x92 (I/O Data Sample Rx Indicator frame)のパケットを受信する。フォーマットはI/O Data Sample Rx Indicator frame - 0x92を参照。

レスポンスのバイナリデータはそのままでは扱えないため正しい値に変換する必要がある。それぞれの変換式を以下に示す。

温度:

mVanalog = (ADC2/1023.0) * 1200
temp = (mVanalog - 500.0)/ 10.0

湿度:

mVanalog = (ADC3/1023.0) * 1200
hum = (((mVanalog * 108.2 / 33.2) / 5000 - 0.16) / 0.0062)

照度:

brightness = (ADC1) /1023.0) * 1200

引用: XBEE sensors Product description

プログラムはXBeeLTHSensor.hを作ってincludeするようにした。受信したシリアルデータを1つずつ読み取るのがめんどくさかったのでxbee-arduinoというライブラリを使用させてもらった。

シリアル変換基板を接続したポートを選択してシリアルモニタを確認すると、DIGI XBEE SENSORのセンサデータの値が表示される。

f:id:dev-moyashi:20181111020253p:plain:w500

最後に

LTH Sensorの他にもWall RouterやSmart Plugといった製品があり、万が一これらの製品を使うことになった場合(たぶんない)はLTH Sensorと同じような流れでセットアップしてRF dataと変換式に対応したプログラムを書くことで専用ゲートウェイなしでオレオレZigbeeネットワークにデバイスを参加させることができる。Digital and analog sampling using XBee radiosが参考になるので興味がある方は拝見してみてください。