XBee の評価(実は 2回目)

以前に 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日作業)

  1. 最初の構想
  2. センサ側マイコンの選定
  3. 温度湿度センサを評価する
  4. XBee の評価(実は 2回目)
  5. Arduino のスリープと、Pin Change 割込
  6. 最後に XBee の Cyclic Sleep

コメントを残す