« mbedでリニア温度センサーを使う | トップページ | XBeeをAPIモードで使う »

XBeeを使ってみる

MTM06でスイッチサイエンスさんからXBeeを購入しました。前から使ってみたいと思っていたのですが、面白い応用例が思いつかず(電力モニターとか先例があるし)先送りになっていました。「とにかく使ってみるぜ」といじり始めると、すごく機能があり奥が深いです。そのため、設定面では結構ハマってノウハウもたまりました。

XBeeの基本設定については多くの方がブログで解説していますが、最新のZB型(ZigBee対応)でAPIモードを使った設定例はあまりなかったので、この点について記載します。今回は、XBeeモジュールの種別・基本動作の解説とループバックテストを行うまでの基本設定について記載します。


XBeeモジュールの種別

2010年12月時点でスイッチサイエンスさんから購入できるXBeeモジュールには大きく分けて以下の4種類があります。

モジュール名 特徴
XBee ZB (XB24-Z7) ZigBee規格準拠の短距離版(低出力型)
Point-to-Point, Point-to-Multipoint、Mesh通信が可能
XBee-Pro ZB (XBP24-Z7) ZigBee規格準拠の長距離版(高出力型)
XBee (XB24-A) XBee独自規格の短距離版
ZigBeeと共通の無線規格(IEEE802.15.4)上に独自の上位ネットワークプロトコルを載せている。Point-to-Point, Point-to-Multipoint通信が可能
XBee-Pro (XBP24-A) XBee独自規格の長距離版

上記の各バリエーションに対して、アンテナの種別として、1)チップアンテナ、2)ワイヤーアンテナ、3)U.FLコネクタ(外付けアンテナ)の3種があり、合計4 x 3 = 12種類があります。

XBee ZB(ZigBee対応) or XBeeの選択は悩むところですが、Mesh通信(Routerノードを介したマルチホップ中継や、Routerノード故障時に通信経路の再構築=迂回が可能)を試してみたく、ZBモジュールを購入しました。現状はモジュールが2個しかないため、Point-to-Point(1対1)通信になってしまい、Meshネットワークは作れないのですが・・

私が買ったのは、ZBモジュールのチップアンテナ版(XB24-Z7CIT-004)とワイヤーアンテナ版(XB24-Z7WIT-004)です。


シリアルインターフェースの種別

XBee ZBはシリアルインタフェースを使用してホストMCUと通信を行いますが、以下に示す2つのインターフェースに対応しています。

インターフェース種別 概要
透過モード (Transparent Operation) ホストからのデーターを無線リンクに透過するモデムとして動作。
XBeeモジュールの設定はATコマンドで行う。無線リンクを挟んだリモート(遠方)側のXBeeモジュールは操作できない
APIモード (API Operation) ホスト-XBee間でデーターおよびコマンドをAPIフレームでやりとりする。フレームの組み立て・解析処理が必要となるが、リモート側モジュールへのコマンド送信や送達確認などの高度な使い方が可能

透過モード・APIモードをシーケンス図的に描くと以下のようになります。

XBeeOperationMode

■透過モードはいわゆるATモデム(懐かしい!)と同様の動作になります

■APIモードの動作は以下となります

  • 送信データは、APIフレーム形式ででXBeeモジュールに渡します。リモート側で受信したデータもAPIフレーム形式でシリアル回線に出てきます
  • デバイス設定はATコマンドをAPIフレームに入れてXBeeモジュールに送ります。APIフレームには任意の宛先アドレスを設定できるため、リモート側(遠方)のXBeeモジュールを操作することも可能。この機能を使って、リモートモジュールのGPIOをたたいたり、ADCに接続したセンサーの出力を読み取ることができます
  • リモート側モジュールのADCデーターを周期的に送信するように設定した場合、サンプルデータをAPIフレーム形式で送信

先ずは、ループバック試験による動作確認を行うために、透過モードの設定を行います。その後に、APIモードに設定を変更し、リモート側モジュールのGPIOを使ったLチカ(リモートLチカ)やADCポートに接続したセンサーデーターの読み取り(リモートセンシング)を行うことにします。

デバイス種別

XBee ZBモジュールが準拠するZigBee規格では、以下に示す3つのデバイス種別が存在します。

デバイス種別 概要
Coordinator ネットワークID(PAN ID)の広報や無線CHの選択を行うノードで、ZigBeeネットワーク内に必ず1つ必要。ネットワークの立ち上げ後はRouter動作を行う。常時オンでスリープしない。
Router Device間のデーター中継を行う。End Deviceとしての動作も可能。
End Deviceがスリープ中の場合、一時的に受信データーをバッファリングする。常時オンでスリープしない
End Device 末端の端末。中継機能を持たない代わりに、送受信データーが一定時間ない場合はスリープ状態になり消費電力を節減する。そのため、電池で長時間の動作が可能

XBeeの実験を行うためには、最低2個のモジュールが必要ですが、上記の要件から、1個はCoordinatorに設定する必要があります。もう一つは、RouterもしくはEnd Deviceに設定する必要がありますが、今回はEnd Deviceにしています。ZigBeeならではスリープ状態の実験もしたいためですが、設定開始時にデバイスがスリープしているとエラーになる場合があるため注意が必要です(その場合は再度やり直し)。Routerにしておけば常時オンのため、このような問題に遭遇することはなくなります。


設定の準備

XBee ZBの設定には、販売元のDigiが提供するX-CTUと呼ばれる設定ツールを使用します。X-CTUはWindows XP用で、Windows Vista/7はサポートリストにはないのですが、Windows 7でも動いています。ただ、動作モードの変更を行う際にX-CTUが固まることがあるのですが、Windows 7だと強制終了ができず、ログオフが必要になる場合がありました。

X-CTUを使って設定を行うためには、XBee ZBモジュールとPCをシリアル接続する必要があります。PCとの接続には、XBeeのソケットとUSB・シリアル変換チップを乗っけたXBeeエクスプローラUSB(写真左)あたりを使うのがお手軽です。X-CTUで設定中にリセットを要求されることが度々あるため、リセットボタンを追加してあります。

もしくは、スイッチサイエンスさんの2.5mmピッチへの変換基板(写真右)と秋月さんのFT232RLをブレッドボード上で配線する方法もあります。両方を試してみたのですが、XBeeエクスプローラーを使った方が若干動作が安定するように思います。そのため、設定はXBeeエクスプローラーで行うことを前提にします。

XBeeExplorer

変換基板+FT232RLで設定を行う場合は、FT232RLのジャンパー2をオープンにしてXBeeモジュールとFT232RLの電源を共通にする必要があります。当初は、FT232RLの電源はPCのUSB側から取っていたのですが、この場合電源が分かれてしまい、XBeeの電源が落ちているがFT232RLの電源が入っておりシリアル回線にHighが出力される可能性があります。XBeeにしてみると電源電圧(電源切っているので0V)より高い電圧がI/Oに加わるので、最悪ラッチアップを起こしかねない使い方だと思い修正しました。原因は分からないのですが、XBeeモジュールを1個壊してこの点に気がついた次第。これも授業料かな・・


透過モードの基本設定

X-CTUをインストールして起動します。初回起動時は最新ファームウェアをダウンロードするかと聞かれるのでダウンロードしておきます。 PC Settingsのタブにて、Test/Queryボタンを押すと、modem typeの確認ができます。modem typeがXB24-Bと表示されますがこれはX-CTUのバグのようで、XB24-ZBが正解です。

ModemQueryOk

Test/Queryを行う際には、XBee ZBモジュールの設定(透過 or APIモードのどちらか)とX-CTUの設定が一致している必要があります。上の画面では、X-CTUは透過モードです(Enable APIのチェックが外れた状態)。正しくmodem typeが読み取れているということは、XBee ZBモジュールも透過モードで動いているということになります(出荷時は透過モード)。もし、以下のようにmodem typeが正しく読み取れなかった場合は、X-CTUとXBeeモジュールの動作モードが合ってないことが考えられます。

ModemQueryNG

上記の表示となった場合、先ずは何回かリトライします(リセット+リトライも実施)。それでもダメな場合は、Enable APIをチェックして再度Test/Queryを行います。正しい表示が得られた場合はXBee ZBモジュールがAPIモードで動いていることになります。

Modem Configurationタブに移動して、以下の設定を行います:

  • Modem XBEE: XB24-ZB
  • Function Set: ZIGBEE CORDINATOR AT(透過モード)
  • Version(最新:執筆時点は2070)
  • Show Defaultsボタンを押して、デフォルトパラメーターを表示
  • Always update firmwareをチェック

Writeボタンを押して、Coordinator対応ファームウェアの書き込みを行います。以下のダイアログボックスが出現したら、リセットボタンを押してモジュールをリセットします。

RestRequest

続いて、ネットワーク関係の情報を設定します。

  • PAN ID: 0以外の適当な値を設定(0はCoordinatorが空きIDをスキャンして自動設定。0以外の値を設定した場合は手動設定となります。手動設定の場合は、ネットワーク内のデバイス全てに同一のPAN IDを設定します)
  • DH/DL: End Deviceのアドレス(裏面のシリアル番号)を設定。DH=0, DL=FFFFはブロードキャストアドレスですが、ZBモジュールでブロードキャストを行うと、使用に耐えない程遅いです。そのため、ここではループバックテスト用に、End Deviceのアドレスを設定します。次のステップでAPIモードを設定すると通信毎にホストMCUから宛先アドレスを指定できるため、複数デバイスをポーリングするような処理も問題なく行えます
  • SH/SL: 自身のアドレス(=シリアル番号)が表示されています(この値は変更できません)

Writeボタンを押してパラメーターを書き込み。書き込みに成功したら、Readボタンを押して設定を確認します。

End Deviceについても、同様にZIGBEE END DEVICE ATのファームを書き込んで設定を行います。PAN IDについてはCoordinatorと同じ値。DH/DLはCoordinatorのSH/SL(シリアル番号)を設定します。


ループバックテスト

ループバックテストを行うためにはリモート側のXBeeも動作できるようにする必要があります。そこで、スイッチサイエンスさんのピッチ変換基板を使ってブレッドボードに搭載できるようにしました。

この基板は、On/AssociateピンとLED間の配線パターンが引いてあり、抵抗とLEDを追加することによってモジュールの状態をLED表示することが可能です。抵抗は、スルーホールが1/6W抵抗サイズのところに手持ちの1/4W抵抗を押し込んだので部品がはみ出していますがその点はご愛嬌。また、抵抗は消費電流を抑えるために1KΩを使用しています。緑のLEDはデータシートを見るとVf = 3.3Vなので、3.3V電源のXBeeでは本来使えないのですが、ちゃんと光ってます・・このあたりは手持ち部品を使っているので・・

XbeeRemote2

XBee ZBモジュールの結線は以下の通りです。

ピン番号(名称) 接続先
1(Vcc) 3.3V電源
2(Dout) 3(Din) - Loop back
3(Din) 2(Dout)
5(Reset) SWを介してGNDに接続(写真は未実装)
6(RSSI) LEDを接続すると無線リンクが繋がった際にLEDが点灯します。
10(GND) GND

やっとループバックテストに到達です。PCとXBeeエクスプローラーを接続し、X-CTUのRange Testタブを開きStartボタンを押すとテストパターンが送信されループバックが始まります。ループバックを開始した直後は無線リンクがUPしていないためBadのカウントが上がる場合がありますが、RSSI LEDが点灯したあたりからデーターが流れ始めます。

LoopBackTest


おわりに

XBee ZBは設定が難関かもしれません。デバイス種別や動作モードの変更を行うとかなりの確率でX-CTUがエラーを吐きます。自分の環境で発生したエラーと回避方法を書きましたが、使用環境によってエラーの出方が異なるかもしれません。その場合は、X-CTUとXBee本体の動作モードを合わせる、たまにXBeeをリセットし活入れしながらリトライする点を意識して、色んな組み合わせを試してみるしかないかと思います。Point-to-Pointでの使用であれば、XBeeモジュールの方が設定が簡単で使いやすいかも(使っていないのでなんとも言えませんが)。

次回は、設定をAPIモードに変えてホストMCUからの制御方法について記載します。


参考資料

« mbedでリニア温度センサーを使う | トップページ | XBeeをAPIモードで使う »

XBee」カテゴリの記事

コメント

初めまして!
マイコンにつながっているXBeeとパソコンに繋がっているXBeeで送受信テストをしています。
1文字、2文字のRange testは上手くいくのですが、
3文字以上になると、タイムアウトになってしまい、悪い結果しかでません。

何か解決方法は知っていますか?
知っていたらメールアドレスの方にメールいただけるとありがたいです^^

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« mbedでリニア温度センサーを使う | トップページ | XBeeをAPIモードで使う »

2018年5月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ