XBee-WiFi

セットアップと動作テスト

XBeeのWiFiモジュールを入手しました。
XBeeモジュールには、ZigBee/WiFi/IEEE 802.15.4の3つの無線方式が有ります。
無線方式の詳細はこちらに紹 介されていますが、今回入手したのはWiFiを使うモジュール(S6B)です。
ZigBee/IEEE 802.15.4の無線方式を使う場合、同じ無線方式のモジュールが2個以上必要になりますが、
WiFiの無線方式を使う場合、1個だけで既存のネットワークに接続することができます。

XBeeには5つのアンテナタイプが有り、微妙に外感が違います。
アンテナタイプの詳細はこちらに 紹介されていますが、今回入手したのはU.FLアンテナタイプとRP-SMAコネクタのモデルです。
外部アンテナモデルはアンテナを付けないと、極端に受信感度が落ちます。


XBeeのピンピッチは2mmなので、ブレットボードには直接刺さりません。
この様なUSB接続用のベースボード(XBee Explorerと呼ばれています)が販売されています。
ベースボードにはUART-USB変換チップが実装されていて、直接USBでホストに接続することができます。
XBee本体は3.3V駆動ですが、ベースボード上のレギュレータで5V→3.3Vに変換して給電しています。


WiFiモデルを使う場合、SoftAPモードとStationモードを選ぶことができます。
SoftAPモードは、XBee自身がアクセスポイントになり、WiFiルータとして動作します。
Stationモードは、既存のアクセスポイントを利用します。
これらを設定するための専用アプリ(XCTU)をこ ちらからダウンロードすることができます。

以下では、XCTUを使った初期設定と簡単な通信テストを紹介します。
XBeeをベースボードに装着し、USB経由でホストに接続します。
今回、Windows10版のXCTUを使いましたが、Linux版やMAC版のXCTUも公開されています。

XCTUを起動すると、このような画面が出現します。
左上隅の虫眼鏡アイコン(Discover devices)をクリックするとポートの選択になります。


XBeeが接続されているCOMポートを選択して、Nextで先に進みます。


ポートを選択すると、シリアル通信仕様の選択になります。
工場出荷時は何も変更せずにそのままFinishで先に進みます。
シリアル通信のボーレートなどを変更している時は、変更後のボーレートを選択する必要が有ります。
良く分からないときはSelect allを指定すると、様々な条件でXBeeモジュールを探してくれます。


XBeeモジュールが見つかるとこの画面が表示されます。
Add selected devicesで先に進みます。


これがメインの画面です。
左側の部分をクリックします。


右側に現在の設定内容が表示されます。
Active Scanボタンでアクセスポイントの検索を行うことができます。


見つかったアクセスポイントが表示されます。


接続先のアクセスポイントを選んで、パスワードを入力します。
Connectボタンでアクセスポイントに接続します。
この時、Save the SSID configuration in the moduleを選んでおくと、選んだSSIDとパスワードをモジュールに書き込んでくれます。


アクセスポイントへの接続が完了すると、DHCPで払い出されたIPアドレスが表示されます。
これがこのモジュールのIPアドレスになります。


pingを発行すると応答が有ります。


DHCP経由でIPアドレスを取得するので、IPアドレスは起動毎に変わる可能性が有ります。
IP Addressing ModeをStaticに変更すると、静的なIPアドレスとなります。
設定を変更した時はペンのアイコンで変更内容をモジュールに書き込む必要が有ります。


この時点で、XBeeはUDPサーバーとUDPクライアントの2つが動いています。
送信先はブロードキャストになります。
XBee以外のUART-WiFiモジュールの中には、サーバーモード(親機モード)とクライアントモード(子機モード)が有って、どちらか片方 しか動かないものが有ります が、
XBeeのFirmwareは(おそらくマルチスレッドで)サーバーとクライアントの両方が同時に動いています。


受信に使うポートは0x2615(=9750)、送信先のポートは0x2615(=9750)です。
これがデフォルトのポート番号です。


右上のターミナルのアイコンをクリックします。


XCTUに内蔵されているターミナルが起動します。
Openアイコンをクリックします。


これでUDP送受信の準備ができました。


ホストマシンで以下のスクリプトを実行します。
# -*- coding : UTF-8 -*-
import socket
HOST_NAME = '255.255.255.255'
PORT = 9750 # 0x2616
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(b"Hello, UDP BroadCast", (HOST_NAME, PORT))

受信したデータが表示されます。


send packetsの横のプラスボタンをクリックします。


適当な文字列を入力してAdd packetで先に進みます。


ホスト側で以下のスクリプトを実行します。
# -*- coding : UTF-8 -*-
import socket
HOST_NAME = ''
PORT = 9750
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((HOST_NAME, PORT))
while True:
    rcv_data, addr = sock.recvfrom(1024)
    print("receive data : [{}]  from {}".format(rcv_data,addr))
sock.close()

Send selected packageをクリックします。


ホスト側に受信データが表示されます。


XBeeの送信先は255.255.255.255になっているので、9750ポートを監視している全てのホストにデータは届きます。


送信先のアドレスを指定すると、特定の相手にだけパケットが届きます。




Windowsで動くSocket通信のテストツールは幾つか有りますが、私は
これを使っています。
余計な機能もなく、直感的で使いやすいです。
ポートを9750にすると、XBeeと通信することができます。




セットアップに関する詳細は、こ ちらのドキュメントに有りますが、かなり読みごたえが有ります。
XBeeがUARTから読み込んだデータは、一旦XBee内部のバッファに格納され、特定のタイミングでWiFiのパケットとして送出されます。
送信タイミングの変更や、IOの制御など、ものすごく多機能です。
うまく使いこなせば、これだけで相手側XBeeのIO制御などを行うことができます。

ESP8266+AT Firmwareでも、WiFiモデムとして使うことができますが、AT Firmwareの場合、送受信を全てATコマンドで行うので少し面倒です。
XBee WiFiの場合、シリアルへの入出力がそのままWiFiへの入出力になるので、ネットワーク機能を持たないマイコンなどを、
簡単にWiFi対応にすることができます。

続く...