XBee 通信プログラムについて

4つのXBeeを使い、1つのXBeeノード上のスイッチを押すと、ほかのすべてのXBeeノードのLEDが一斉に作動する、という動作が確認できました。

使い始めてから5日ぐらいでしたが、結構簡単でしたね。シリアルで送受信するプログラムを作ったことがある人なら簡単に使えます。

●構成

今回ブレッドボードで使って作ったのは次の図のようなものです。4つ、それぞれのノードは、XBeeとPIC18F23K20(3V)、汎用I/Oボード(#308)で構成しています。電源は単三アルカリ乾電池 2本にしました。

PICのUARTにXBeeがつながっています。また、スイッチとLEDはPICのPORTBにつながっています。DeviceDigiMesh

●ブロードキャスト送信

ボタンが押されると、PICがそれに応じたフレーム(Transmit request)を生成して、それをXBeeにシリアル送信します。このフレームのRFデータ領域にどのLEDを点消灯するかのコマンドが入っています。

●パケット受信

ブロードキャスト(アドレス指定なし)で送信されたRFデータはすべてのノードで受信されます。これがブロードキャスト(放送)の意味です。

受信したフレーム(Receive Packet)はシリアルでPICへ送信されます。PICはシリアルで受け取ると、それをフレームとして解析して、RFデータを取り出します。ここにLEDをON/OFFするコマンドが入っているのでそれに応じて指定のLEDをONまたはOFFにします。

●プログラム

プログラムの内容については割愛しますが、考え方は簡単で、APIフレームの理屈がわかれば、あとは、XBeeに対してシリアルで送受信するだけです。DigiMeshに関する情報ががあまりなかったのでどうなるかと思っていましたが、DigiMeshのデータシートと、書籍やインターネットのZigBeeなどの情報を参考にしてなんとかなりました。

フレームのフォーマットに整えたデータ列を用意して、それをXBeeにシリアルで送信する、またはXBeeからシリアルで受信したデータの中身を解析してそれに応じた処理を行う。通常のシリアルでやり取りしているプログラムと同じです。

XBeeのコンフィギュレーションの仕方さえ理解できれば、あとは普通の通信プログラムです。

DigiMeshや無線やネットワークの詳しい理屈を知らなくても、アドレスやチャンネルなどの概念がわかれば使えます。なにより、ZigBeeと違い、コーディネータやルータ、エンドポインなどの区別がないのでシンプルです。中継させたいときはDigiMeshにして、ネットワークIDやチャンネルを適切に設定したXBeeを適当なところに設置するだけです。また、それぞれがルータの役目をしているので、各ノードも中継することができます。

すべてスリープさせて、一斉にウェイクアップするとか、DigiMeshにはZigBeeにない利点がありますが、今回は、スリープ関係は試していません。リモートセンサのような用途には省電力対策が必要になると思いますが、それはまた別の機会に。

●XBeeは昔ちょっとだけいじっていた

うちでXBee関係の基板を販売していますが(#196、#197)、発売したのは10年ぐらい前で、そのころはまだ、秋月でもXBeeの取扱いがなく、他で購入しました。輸入品で日本で認可受けてないものも販売されていましたね。まだ、Digi社に変わる前の製品でした。ネットワークではなく1対1のトランスペアレントモードでちょっと通信させただけでした。その後、そのZBeeはお蔵入りです。そのころはまだ、ZigBeeというのは聞き覚えがなかったですが、なんとなく、APIモードとか、ネットワークに使えるとういような話には聞いていましたね。

それで、久しぶりにXBeeを手にしたのは2週間ぐらい前です。ネットで調べて、本を何冊か買ってAPIフレームとは何か、ATコマンドでなにができるかというのをざっと調べて、Digi社からデータシートを入手、XCTU(これが最新になっていて書籍に掲載されているのと全然違う)も入手して数日まえから使い始めました。最新のXCTUは直観的に使えたので苦労なかったです。旧バージョンは本で読んでもめんどくさそうでした。

●ブロードキャストのとき、自分自身にも返ってくるか

自分で出したデータを自分自身で受信するか、ということです。結果的に受信していません。というか、受信しているはずですが、無視するようになっているのでしょう。

実験で、ボタンを押したノードのLEDも自分自身では点灯させず、RFデータを受け取った時だけ点灯するようにしてみました。
ボタンを押すと、自分で出した電波を自分で拾ってそれで、LEDが点灯するかと思いましたが、そうはなりませんでした。電気的な切り替えで送信中は受信できないのか、受信したものを無視しているのかわかりませんが、ブロードキャストでも自分自身では受け取らないことが確認できました。まあ、当然ですね。ちなみに赤外線の送受信の場合、自分で出したのを拾ってしまうことがありますね。

コメントは受け付けていません。