XBee(無線通信)の実験パート3
(親と子の1対1で、子機から親機へI/O情報を送信してみます)

〔マイコンのトップに戻る〕
〔パート1〕 〔パート2〕   〔パート4〕 〔パート5〕 〔パート6〕 〔XBee3〕


前回(パート2)では、1対1通信(透過モード)で、親から子へ文字を送信して、子はそのまま文字を
返送する実験を行いました。
今回は子機にスイッチ等を取り付けデジタル入力にアナログ入力のデータを親機に送ってみたいと
思います。子機が単体でセンサー情報を親に送る場合を想定した実験ですね。
また、XBee基本(基礎)の話とX-CTU基本操作の話はパート1を参照下さい。

尚、ここでの記述は秋月電子のXBee ZBモジュール(シリーズ2)PCBアンテナタイプでの内容となります

PS. *2)
2018/1月 現在、XBee S2モジュールは製造中止です、後継機は"S2C"です
こちらの製品です、ここのMyHPは旧記事ですがぁS2Cでも少し追記して置きます。

PS. *3)
2019/7月 現在、更に低消費電力/小型化したXBee3モジュールが販売されているようです。
"XBee3"でも少し追記して置きます。

《子機の設定を行う》

USB−XBee1  秋月電子のXBee USBインターフェースボード
 子機を乗せて設定します。
 (PWE-SELジャンパーピンはUSB側に取付けですよ)

@ USBインターフェイスボードをUSBケーブルでPCに接続し、X-CTUツールを起動させます。

A パート1のこちらを参照し、X-CTUとXBeeをコネクトして下さい。 *1)

B "Function Set"の項目が"ZIGBEE ROUTER AT"になっています、
  ルータで使用このまま変更しません。
  "S2C"モジュールの場合の表示は、"ZIGBEE TH Reg"ですが、このモジュールもデフォルトは
  "ルータ AT"ですのでそのまま使いましょう。 *2)
  "XBee3"モジュールの場合の表示は、"Digi XBee3 Zigbee 3.0 TH"ですが、このモジュールも
  デフォルトは"ルータ AT"ですのでそのまま使いましょう。 *3)

C PAN IDを設定します、今回は"777"で実験しました。 *1)

Configuration(Networking)画面
この同じIDどうしのXBeeのみ通信出来ます、なので同じネットワーク内なら同じIDとなります。

D 通信相手(親機)のアドレスを設定します。 *1)

Configuration(Addressing)画面
DHに相手アドレスの上位4バイトを設定
DLに相手アドレスの下位4バイトを設定

  ちなみにSH/SLが自分のアドレスです。

E ピンの割り付けを行う。 *1)

Configuration(I/O-Settings)画面1
"I/O Settings"のセクションに有る"D1-AD1/DIO1Configuration"の項目をクリックし、
  "3-DIGITAL INPUT"を選択します。
 (全てのデジタルI/Oの初期値設定は"無効"の使用しないになっています)

Configuration(I/O-Settings)画面2
"D2-AD2/DIO2 Configuration"の項目をクリックし、"2-ADC"(アナログ入力)を選択します。

F ピンのサンプリング設定を行う。 *1)
  この項目はデジタルI/O端子が変化すれば、DH/DLに設定したアドレス宛にデータを送信する
  設定です。

Configuration(I/O-Sampling)画面
"I/O Settings"セクションの"I/O Sampling"に有る"IC-Digital IO Change Detection"の項目に、
"0002"を設定します。

今回は、"D1-AD1/DIO1"端子をデジタル入力にしているので下記表に従い設定は"0002"となります。
なので、D1端子が変化すれば親機にその都度データが送信されます。
(もちろん他のデジタルI/Oは入力に設定していないので変化が有っても通知されませんよ、念のため)

端 子 P2 P1 P0 D7 D6 D5 D4 D3 D2 D1 D0
ビッ ト名 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
2進数 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
16進数 0 0 0 2

(S2C/XBee3モジュールの場合) *2)
端子     
P4
P3
P2 P1 P0 D9
D8
D7 D6 D5 D4 D3 D2 D1 D0

G 各項目右横の[Write]丸ボタンをクリックして設定をXBeeに書き込んで下さい。 *1)
  (最後に纏めて[Write]アイコンをクリックしても良いです。)

《親機の設定を行う》

XBee USBインターフェースボードには子機が乗っています、親機XBeeと乗せ替えます。
親機と子機XBeeを取り間違えない様に注意しましょう。

@ USBインターフェイスボードをUSBケーブルでPCに接続し、X-CTUツールを起動させます。

A パート1のこちらを参照し、X-CTUとXBeeをコネクトして下さい。 *1)

-------------------------------------(S2/S2B)---------------------------------------

Updateボタン  B XBeeを"ZIGBEE COORDINATOR API"に変更します。(APIモードです) *1)
   Updateのアイコンをクリックします。

C XBeeのファームウェアを書き換えます。 *1)

Update画面
まず、"Function Set"の項目で"ZIGBEE COORDINATOR API"を選択します。
次に、"Firmware version"の項目で書き込むバージョンを選択します、
一番上が新しいのでそれを選びましょう。
後は、[Update]ボタンをクリックしてのファームウェアを書き込みます。

(S2/S2BはここまでDへ進む)
-----------------------------------------------------------------------------------

-----------------------------(S2C/XBee3はここから)------------------------------- *2)

B "Function Set"の項目が"ZIGBEE TH Reg"になっていますが、これは切替えてもこのままです。
  "S2C"モジュールのデフォルトも”ルータ AT”ですので”コーディネータ API”に切替えます。

  ※ "S2C/XBee3"モジュールは一つのファームウェア内にルータ/コーディネータ/エンドデバイスの
    全てが書込まれているのでファームウェアの書換えは必要なく設定を切替えるだけで動作します。

C コンフィギュレーションの設定を”コーディネータ API”に切替えます。

コーディネータ切替え画面1
[Sleep Modes]の項目に有る、"SM"の設定が"No Sleep(Router)[0]"に
なっている事を確認します。

コーディネータ切替え画面2
[Serial Interfacing]の項目に有る、"AP"の設定を"API enabled[1]"に設定を行い、
項目右横の[Write]丸ボタンをクリックして設定をXBeeに書き込んで下さい。
"XBee3は、[UART Interfacing]の項目です。
(因みに、[1-2]以外の設定になっていれば"AT"モードとなります)

コーディネータ切替え画面3
[Networking]の項目に有る、"CE"の設定を"Enabled[1]"に設定を行い、
"XBee3は、"From Network[1]"の設定名です。
(この項目がコーディネータ/ルータの切り替えです)
項目右横の[Write]丸ボタンをクリックして設定をXBeeに書き込んで下さい。

-----------------------------------------------------------------------------------

D PAN IDを設定します、今回は"777"ですよね。 *1)

Configuration(Networking)画面

E 通信相手(子機)のアドレスを設定します。 *1)

Configuration(Addressing)画面
今回は、DH(0)/DL(FFFF)に設定します、これはブロードキャスト用のアドレスで
親機に繋がっている全ての子機に一斉に送信する為の物です。

F AP通信のエスケープモードの確認を行います。 *1)
  "S2C/XBee3"モジュールの場合は上記Cにて設定を行っていますよね。 *2)

Configuration(SerialInterfacing)画面
"Serial Interfacing"のセクションに有る"AP-API Enable"の項目が
"1"になっている事を確認します。
"XBee3は、[UART Interfacing]の項目です。
これは設定値は1か2のみですが、設定の意味は次回以降に説明します。

G 各項目右横の[Write]丸ボタンをクリックして設定をXBeeに書き込んで下さい。 *1)
  (最後に纏めて[Write]アイコンをクリックしても良いです。)

《子機のスイッチ状態が変化したら親機にデータを送信する》

USB−XBee31(配線図) 左図が子機側の配線です。
XBee用2.54mmピッチ変換基板に子機を乗せています。
外部電源5Vを利用します。

親機側は配線はありません、PCに接続するだけです。

ここではDIO1端子(19)で実験しています、
I/O端子はXBeeの内部でプルアップされています、
なのでタクトスイッチはGNDに配線します。

ちなみに[ATPR]コマンドを利用すれば
内部プルアップは禁止に出来ます。

@ 親機側をUSBケーブルでPCに接続します。
  (親機側から電源を先にいれますよ)

A 子機側に電源を接続します。

B X-CTUを起動させ、パート1のこちらを参照し、X-CTUとXBeeをコネクトして下さい。 *1)

図の@のタブをクリックして[Consoles Working Mode]にします。
下図が表示されるので図のAをクリックし回線をオープンします。
(オープンしたらアイコンはクローズボタンになります)
ATコマンド操作画面
”ID0”がスイッチを押した時、”ID1”がスイッチを離した時です。
この図が"X-CTU v. 6.3.4"での例ですが、以下の説明図は旧 X-CTUでの内容です。m(_ _)m

X-CTU画面306

C 子機のタクトスイッチを押して見ましょう。
  上図ので囲った部分の最初の22バイトがスイッチを押した時のデータです。
  上図ので囲った部分の最後の22バイトがスイッチを離した時のデータです。

  パート1でのデータ内容と少々異なりますね、
  これは子機がAPI(Application Programming Interface)モードでのフレームデータ(APIパケット)と
  言われるデータフォーマットで送信して来ている為です。(詳しいAPIパケットの話は次回を参照)
  アプリのソフトでの1対n制御を意識したインターフェイスなのでしょう。
  だから、親機は"ZIGBEE COORDINATOR API"のファームウエアに切り替えるのです。
  ちなみに"API"のファームウエアでは[Terminal]の画面で"+++"のATコマンドモードは操作出来
  なくなります。

X-CTU画面307

  このデータはスイッチが押された時の内容(上図の枠)ですが、フレームタイプは"92"です、
  このデータフォーマット(92)は子機がデジタルI/Oに変化があった時に送信されます。
  先頭5バイト目から8バイトが送信してきた子機のアドレスなので、子機を複数接続しても何処から
  送信されたか判別がつきますね。
  先頭16バイト目から6バイトがデジタルI/O情報です、これはパート1でのデータ内容と同じなので
  そちらを読みましょう。

《子機からデジタル・アナログI/O情報のデータを周期的に送信する》

子機に接続されてるスイッチやセンサーの情報を定期的に親機へ送信させる実験を行ってみます。
ここではセンサー代わりにとりあえず分圧抵抗を配線します、パート1のアナログ入力と同じ物です。

まず、子機を下記の様に設定を行います。

X-CTU画面308 "I/O Settings"項の"I/O Sampling"項目に有る
"IR-IO Sampling Rate"を"1388"で設定します。
この項目はI/O端子の情報を"1388"毎に読込み
DH/DLに設定したアドレス宛にデータを送信する設定です。

"1388"は16進数で10進数に直せば"5000"です、これは5000ms(5秒)毎に読み込むと言う事です。

X-CTU画面308a
"X-CTU v. 6.3.4"での設定例です、
図の電卓アイコンをクリックして"Time(ms)"の所で5000と入力した方が簡単ですね。
項目右横の[Write]丸ボタンをクリックして設定を書き込むのをお忘れなく。 *1)


USB−XBee32(配線図) 左図が分圧抵抗によるアナログ入力回路です。

ここではAD2/DIO2端子(18)をADCに割付けて
実験しています、

外部電源5Vを利用します。
XBeeのアナログ入力は0〜1.2Vまでを
0〜1023(3FF)に変換して読み込まれます。
1.2Vを超えない様に注意。

今回は手持ちの抵抗から4.7KΩと1KΩを分圧して入力しました、計測したら880mVでした。

@ 親機側をUSBケーブルでPCに接続します。
  (親機側から電源を先にいれますよ)

A X-CTUを起動させ、パート1のこちらを参照し、X-CTUとXBeeをコネクトして下さい。 *1)
  [Consoles Working Mode]にします。 (以下は旧X-CTU画面での説明です)

X-CTU画面309
B 子機側に電源を接続します。

  左図の様にI/O情報のフレーム
  データ(APIパケット)が5秒毎に
  送られて来ると思います。


X-CTU画面310

X-CTU画面311

このデータのフレームタイプは"92"です、
先頭5バイト目から8バイトが送信してきた子機のアドレスですね。
先頭16バイト目から8バイトがデジタルとアナログI/O情報です、これはパート1でのデータ内容
同じなのでそちらを読みましょう。

尚、"AD2から読込まれた電圧値データ"が"02F1"ですね、これを10進数にすると753だから
計算すると、(753 * 1200mV) / 1023 で 883mVとなる、上記測定値が880mVなのでだいたいOK。

《その他》

実験風景  アナログ入力を定期的に親機へ送って
 いる実験風景です。

 子機をルータからエンドデバイスに設定
 しての実験は、スリープ機能が絡む様
 ですが、そのうちにでも行ってみます。
 (実験しました、パート6を参照下さい)

 デジタル出力はAPIモードで親機から
 リモートコマンド操作を行えば出来ると
 思います。(次回以降予定)

問題はぁ、送られて来たデータをどう加工して利用するかが大変なんですがぁ
まぁ、それは使う人次第なのでぇここは基礎実験と言う事で良しとしますかぁ。

次回以降はAPIモードでの通信を予定しているのですがぁ、そんな感じでぇ
XBee利用の仕方でぇ、実験のやり方が変わるようなぁ、カンジぃみたいなぁどうしましょ。



"XBee3"モジュールでの見直し(*3) 2019/07/06
"S2C"モジュールでの見直し(*2) 2018/02/05
X-CTU(ver6.3.4)での見直し(*1) 2017/01/20


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2019 Shigehiro Kimura All Rights Reserved.