以前に XBee を使ったことがあったのですが、簡単な評価しかしていませんでしたし、ほとんど忘れてしまったので、初めからやり直しです。
事前準備
まず最初に、XBee を ZigBee ノードとして使う場合、ダウンロードするファームウェアによって動作モードを切り替えることになります。今回は、PC (あるいは Raspberry Pi)に繋ぐほうを Coordinator、センサを繋ぐ Arduino Fio 側を End Device にしたいと思います。(しかし後で書きますが、End Device ではスリープモードでの動作が前提となり、評価が厄介なので、最初は Router モードで動作させ、スリープしないように設定したほうが無難です。スリープモードの動作については、XBee のメーカーである Digi International 社からマニュアルをダウンロードすると詳細が記述されており、特に XBee End Device Configuration というセクションが有用です。)
ツールのダウンロード
閑話休題。次に、ファームウェアのダウンロードやオプション設定に必要な XCTU というソフトを、やはり Digi International 社のウェブサイトからダウンロードします。最新版は Mac でも動作するバイナリがあり、また、よくできた GUI になっていて感心しました。
設定項目
XCTU でファームウェアの最新版をダウンロードします。方法の詳細は、
などが丁寧で参考になります。最初、動作モード(Coordinator, Router など)の設定が分からなかったのですが、これはファームウェアのダウンロード機能で選択します。なお、ファームウェアをダウンロードすると、動作オプションが工場出荷と異なる値になることがありますが、これはとりあえず工場出荷値に戻して使用しました。
必要となる項目は以下の通りです。
- PAN ID
これは、Coordinator をトップノードとする ZigBee のネットワーク(PAN)インスタンスを、他のインスタンスから区別するための ID で、通常は 16ビットです。XBee では、拡張 PAN ID として、64ビットの ID を設定することもできます。長いアドレスは、ネットワークの衝突防止に有効のようです。
この数字ですが、ランダムな値を一意に決め、ネットワーク内で共通に使用します。Mac OS や Linux であれば、
$ dd if=/dev/urandom bs=8 count=1 | od -txL 1+0 records in 1+0 records out 8 bytes transferred in 0.000012 secs (671089 bytes/sec) 0000000 c6b559db2f84d9fa
などのように得るのが簡単だと思います。ここでは、例として c6b559db2f84d9fa になってます。/dev/urandom はランダムデバイスなので、サイコロのように毎回異なる値が得られます。
- Sleep Mode
ここではとりあえず、スリープしない設定にしておきます。なお、End Device にすると Pin Sleep というモードがありますが、Arduino Fio では SLEEP RQ がレベル H になっているので、常にスリープ要求となってしまい、うまくありません。最初は End Device ではなくて Router モードを使うのが簡単のようです。(なお、End Device で SM=0(スリープなし)モードに設定しようとするとエラーになります。この辺はちょっと分かりにくいのですが、設定できない、ということのようです。私もマニュアルをちゃんと読み切れてませんが、できたら XCTU ソフトで明解なエラー説明をしてくれたら、1時間ほどの無為な時間を潰さずに済んだのにな、と思いました。)
- Destination Address
DH, DL という項目で、通信相手の MAC アドレスを設定できます。常に必要な設定ではないようですが、PAN 内で一対一の通信しかしないのであれば、設定しておくと有用のようです。(私も勉強不足ですが、こちら ↓ を参考にさせて頂きました。)
XBee ユニットの MAC アドレスですが、ユニットの裏側(金属シールドにラベルが貼られた部分に 0013A200 で始まる 16桁の 16進数で記載されています。また、XCTU ソフトから読み出すこともできます。) DH に上位 8桁、DL に下位の 8桁を入力します。
この指定ですが、(当たり前ですが)自分のアドレスではなくて相手のアドレスを指定します。ユニット A 側には B の MAC アドレスを、B 側には A の MAC アドレスを指定します。
実験
次に実験です。XBee Explorer が 2台あると簡単なのですが、ない場合には loopback cluster ID (0x12) という機能が便利のようです。(私も以前に試したはずだが、忘れた。)
ユニット A からデータを送信してユニット B でループバックさせたい場合、ユニット B の DOUT -> DIN を結線しなくても、ユニット A 側で ATCI12 というコマンドを実行する(XCTU ソフトであれば、CI という項目に 12 を設定する)ことにより、ユニット B が勝手にデータをループバックして送り返してくれるようです。詳細は、Digi International 社のマニュアルで loopback cluster というキーワードを検索してみてください。
話戻して、今回私は XBee Explorer が 2台あったので、両方を Mac に繋ぎ、シリアルターミナルソフトで実験しました。2つのユニットの間で通信している時には、XBee Explorer 上の(Arduino Fio の場合も同様に) RSSI という LED が点灯します。通信が終わると、自動的に消えます。
Arduino Fio に繋いでみる
最後に、Arduino Fio に Router モードのユニットを載せてみました。
最初の注意点はビットレートです。もし、XBee のデフォルト設定が 9600bps であれば(XCTU ソフトで確認できるようです。詳細未勉強)、Arduino で Serial.begin(9600) しないといけません。
次の注意点は、End Device モードなどでスリープしていると通信できない、ということです。もし、電源投入後に Arduino Fio 上の ON LED がすぐに消えてしまう場合は、スリープモードに入っていることを示します。この場合は、まずは Router モードのファームウェアで実験することをお勧めします。
Arduino からシリアルデータが出ると、RSSI LED が点灯し、相手ユニットの RSSI も点灯し、相手ユニットの DOUT からシリアルデータが出るのが正常動作です。上記 2点に注意し、お試しください。
今日はとりあえず、こんなところです。今度 End Device モードの Cycle Sleep を試したときは、また書きたいと思います。
(8月1日作業)
[siblingso]
[parent]