XBee(無線通信)の実験パート6
(エンドデバイスのスリープ機能を探ってみます)

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


今回はXBeeエンドデバイスの省電力機能(スリープ機能)を少し見てみようと思います。
ZigBee(シリーズ2)ではコーディネータとルータはスリープ出来ないようです。
(DigiMeshではすべてのXBeeをスリープさせる事が出来るらしい)

尚、ここでの記述は秋月電子のXBee ZBモジュール(シリーズ2)PCBアンテナタイプでの内容となります
また、XBee基本(基礎)の話とX-CTU基本操作の話はパート1を参照下さい。

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

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

《スリープコマンド》

スリープ機能に関連するATコマンドについて説明します。

[ATSM:Sleep Mode]

スリープのモードを設定します。
サイクリックに繰り返してスリープしたい場合は"04"を設定します。
外部ピン(9番ピン)の制御でスリープしたい場合は"01"を設定します。
サイクリックでも外部ピンでも両方でスリープさせたい場合は"05"を設定します。

外部ピン(9番ピン)の制御にした場合は、9番ピンをHIGHにするとスリープし、LOWで起動しますが、
9番ピンはプルアップされているので通常はスリープしたままになります、なので9番ピンをGNDに
引っ張ってやればXBeeは目覚めます。

[ATST:Time before Sleep]

目覚めている時間を設定します。
デフォルトは0x1388(5000ms:5秒)で、設定範囲は0x00〜0xFFFE(65534) x 1ms です。
まず、目覚めたら接続している親(コーディネータかルータ)に対して自分宛のデータが届いているのか
問い合わせを行います、で、届いていれば受信を行います。
(なので、エンドデバイス宛のデータは親がプールする事になります)

また、"ATIR:IR-I/O Sampling Rate"が設定されていた場合は親にI/O情報を送信します。
この送信と受信が終了したあと5秒後(デフォルト)にスリープに入ります。
もし、この送信と受信がない場合は5秒待たないで直ちにスリープします。

注意として、スリープ期間中はX−CTUでの設定が出来ません、だから、 "直ちにスリープ"された場合
は目覚めている時間が殆どないのでX-CTUでの設定が難しくなります。
なのでぇ、ATIRを設定しておくか、またはスリープモードを"05"にしてボタンを押している間に設定を
済ませるか、あるいは前回記事(パート4)の"親機から子機をリモートで設定操作"を行えば良いです。

[ATSP:Cycles Sleep Period]

スリープさせて置く時間を設定します。
設定範囲は0x0020(32x10ms=320ms)〜0x0AF0(2800x10ms=28s)です。

[ATSN:Number of Cycles to power down IO]

IOパワーダウンサイクル数の設定で、設定範囲は 0x01〜0xFFFF(65535) です。
即ちここで設定した回数だけスリープ(SP x SN)したら目覚めます。
だから、SP値の最大設定値28秒より長くしてから目覚めさせたい場合はこのサイクル数を設定します。
目覚めた場合は、ON/SLEEPピン(13番ピン)をONします。
なので、この信号をマイコンに入力してマイコンもスリープと起動を行う事が出来るでしょう。
デフォルトは"1"なので毎回目覚めたら信号が出力されます、当然目覚めている間は出力しっぱなしです。

[ATIR:IO Sample Rate]

目覚めている期間中にI/Oをサンプリングする周期を決定します。
IR > 0の場合、デバイスは全ての有効なデジタルI/O及びADCをIRミリ秒ごとにサンプリングして
DH + D Lで指定されたアドレスに送信します。
設定範囲は 0x32〜0xFFFF(65535ms) です。
尚、IRを1や2等に設定した場合、デバイスは追いつかず、多くのサンプルが失われます。
又、I/Oをサンプリングしなければ設定する必要は在りません。

[ATPO:Poll Rate]

上で目覚めたら親にデータの問い合わせを行うと書きました、この問い合わせは目覚めている間ずっと
ここで設定した周期で繰り返します。
デフォルト値は0となっていますが0=100ms毎に問い合わせを行います。
設定範囲は0x00〜0x3E8(1000:10s) x 10ms

この他にも[ATSI][ATWH][ATSO]等が有りますが、ちょっとぉ使い方が不明です。

※ ATコマンドの詳細はこちらです。


《子機の設定を行う》

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


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

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

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

Updateボタン  B "Function Set"の項目が"ZIGBEE ROUTER API"になっています。
   "ZIGBEE END DEVICE API"に変更します。
   Updateのアイコンをクリックします。

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

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

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

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

B "Function Set"の項目が"ZIGBEE TH Reg"になっていますが、これは切替えてもこのままです。
  "S2C/XBee3"モジュールのデフォルトも”ルータ AT”ですので”エンドデバイス API”に切替えます。

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

C コンフィギュレーションの設定を”エンドデバイス API”に切替えます。

エンドデバイス切替え画面1
[Sleep Modes]の項目に有る、"SM"の設定を"Cycclic Sleep Pin-Wake[5]"に設定を行い、
項目右横の[Write]丸ボタンをクリックして設定をXBeeに書き込んで下さい。
ここの設定が[1]/[4]/[5]で有ればエンドデバイスで動作します。

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

エンドデバイス切替え画面3
[Networking]の項目に有る、"CE"の設定が"Disabled[0]"に
なっている事を確認します。
"XBee3は、"Join Network[0]"の設定名です。

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

D PAN IDを設定します、今回は"777"で実験しました。 *3)
  この同じIDどうしのXBeeのみ通信出来ます、なので同じネットワーク内なら同じIDとなります。

Configuration(Networking)画面

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

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

F ピンの割り付けを行う。 *3)

Configuration(I/O-Settings)画面1
"I/O Settings"のセクションに有る"D1-AD1/DIO1Configuration"の項目をクリックし、
  "3-DIGITAL INPUT"を選択します。

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


X-CTU画面308 G "I/O Settings"項の"I/O Sampling"項目に有る
  "IR-IO Sampling Rate"を左図では"1388"ですが、
  "BB8"で設定をして置いて下さい。

この項目はI/O端子の情報を"BB8"毎に読込みDH/DLに設定したアドレス宛にデータを送信する設定です。 "BB8"は16進数で10進数に直せば"3000"です、これは3000ms(3秒)毎に読み込むと言う事です。

X-CTU画面308a
"X-CTU v. 6.3.4"での設定例です、 *3)
図の電卓アイコンをクリックして"Time(ms)"の所で5000と入力した方が簡単ですね。

H "Serial Interfacing"のセクションに有る"AP-API Enable"項目を"1"に設定します。
  これは設定値は1か2のみですが、設定の意味は前回(パート4)を参照。 *3)
  "S2C/XBee3"モジュールの場合は上記Cにて設定を行っていますよね。 *4)

X-CTU画面305

I スリープ関連の設定を行います。 *3)
  "S2C/XBee3"モジュールの場合、"SM"設定は上記Cにて行っていますよね。 *4)

X-CTU画面305
"SM-Sleep Mode"を"05"で設定
"ST-Time before Sleep"はデフォルト5秒のまま
"SP-Cyclic Sleep Period"を"1F4"の5秒で設定
"SN-Number of Cycles to power downIO"は"3"設定
"SO"/"PO"はそのままです。

Writeボタン
 J 各項目右横の[Write]丸ボタンをクリックして設定をXBeeに書き込んでも良いのですがぁ、
   今回は、最後に纏めて左のWriteアイコンで書き込んだ方が手っ取り早いでしょう。 *3)

《親機の設定を行う》

XBeeの親機の設定はパート3の"親機の設定を行う"を参照下さい。
子機で設定した"SP(1F4)"と"SN(3)"値と同じ値を、親機にも設定して下さい。
これは親機が子機用のデータを保持している期間や、長くスリープしていてもネットワークから
切り離さない様にする為に必要です。
尚、データシートには全てのルータとコーディネータに設定する様に書いて有ります。

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

子機の設定で、AD1/DIO1をデジタル入力としAD2/DIO2をアナログ入力としていますね、
それと"IR-IO Sampling Rate"の設定を3秒毎にスキャーンして送るとなっていますよね、
子機がルータの時は3秒毎に親機へデジタル・アナログI/O情報を繰り返して送っていましたが、
子機がエンドデバイスになればどんな感じに送信されるのでしょう?、実験をしてみます。

USB−XBee603(配線図)  左図が子機の配線図です。
 秋月電子のXBee用2.54mmピッチ変換基板に乗っています。
 親機は配線有りませんPCに繋ぐだけです。
 外部電源5Vを利用します。

 スリープ状態を表示する為にLEDを付けます。
 足の長い方をXBeeの13番端子側に配線します。
 スリープ中は消灯、起動中は点灯です。

 タクトスイッチはスリープ制御用スイッチです。
 ボタンを押している間中起動しています。
 (但し、スリープモードを"1"か"5"にしないとダメです)

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

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

図の@のタブをクリックして[Consoles Working Mode]にします。
下図が表示されるので図のAをクリックし回線をオープンします。
(オープンしたらアイコンはクローズボタンになります)
ATコマンド操作画面

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

X-CTU画面309  C 15秒に2回の割合で左図の
   様なデータが送られて来る
   と思います。

  (左図は旧X-CTU画面です)


下記図が、今回のスリープ設定におけるスリープと起動の概念図です。

概念図1

"SN"を1回に設定したら5秒毎に起動すると言う事になりますよね、
また"IR"を5秒以上に設定したら起動期間中を過ぎるので1回の送信しか出来ないと言う事です。
"PO"の設定が100msのデフォルトですので"起動中"は100ms毎に親機へデータ有無を問い合わせる
事になります。

概念図2

"ST"が5秒あってもこの様に送受信するデータがない場合は直ちにスリープモードに移行します、
起動期間中は100ms程でしょうか?、LEDは瞬間点灯です。なので、X-CTUで設定が難しくなります。
そんな時は、前回記事(パート4)の"親機から子機をリモートで設定操作"を行って設定をして下さい。
(XBeeの"Function Set"を"END DEVICE"から他のファームウェアに変えたい場合は、"ST=60秒"位に
すれば変更出来るでしょう。)

タクトスイッチ

今回の"SM"スリープモードは"05"のサイクリックと外部ピン制御に設定されていますね、
なので、スリープと起動を繰り返しています(サイクリック)。
スリープ中にタクトスイッチを押して見て下さい、直ちに起動すると思います。
マイコンからXBeeを起動させる事が出来ますが、これを押している最中にX−CTUの設定を行う事も
出来ます。

《エンドデバイスにマイコンを繋いでみる》


前回の記事で、コーディネータやルータにマイコン(PIC16F1827)を接続する話を書きました。
ここでは、エンドデバイスにマイコンを接続し、エンドデバイスが目覚めたらマイコンもスリープ状態から
目覚めさせ、マイコンから親機にデータを送信後マイコンはスリープ状態に入ると言う実験をしてみます。

子機の配線

PICピンの構成 左は16F1827のピン構成図です。

PICの今回使用するピン番号は
14番(VDD:5V)と5番(VSS:GND)を
電源に配線します。

USART関連ピンは7番(RX)と8番(TX)です
RX=受信 TX=送信

10番RB4より別途作成のLCDモニターに接続しています。

13番RB7にXBeeからの信号を入力します。
外部割込みを掛けスリープからPICを目覚めさせる為です。

配線図2 電源は外部から5Vを繋ぎます。

XBee(2:DOUT)→PIC(7:RX)の配線
でPICは2.0V以上でHIGHと認識
するのでそのまま直結です。

PIC(8:TX)→XBee(3:DIN)の配線で
XBeeは3.3Vまでの入力なので
抵抗で分圧し3.3Vに落とします。
抵抗は手持ちから4.7Kと9.1Kの
組合わせにしています。

LEDはXBeeのスリープ状態を表示させる為です。
LEDの足が長い方をPIC側に配線します。

ダウンロードプログラムについて

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
XBee2.lzh(Ver2.00 2014/02/02) *1)
XBee6.lzh ライブラリとMPLAB X用に変更 *2)

プログラムの内容や使い方は前回の記事を参照下さい。

XBee2.c

このプログラムはエンドデバイスと接続する為の物です。
起動させるとXBeeから"8A"のパケットでステータスは"02"を受信するまで待ちます、LCDモニターは
[8A02]と表示されます。
その後、親機へパケット"10"でデータ内容は"test"文字を送信し、PICはスリープモードに入ります。
XBeeが目覚めるとPICの外部割り込みピンに信号が来るのでPICも目覚めます、
でぇ、また、"test"文字を送信し、PICはスリープモードに入ります、これを繰り返すだけです。

実験1

まず、子機XBeeのみ電源を入れて見て下さい。
LCDモニターに[8A00]が表示されますが、親機がいないのでこのままです。
親機がいれば[8A02]が数10秒後に表示され、ネットワークが接続されます。

実験2

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

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

図の@のタブをクリックして[Consoles Working Mode]にします。
下図が表示されるので図のAをクリックし回線をオープンします。
(オープンしたらアイコンはクローズボタンになります)
ATコマンド操作画面

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

X-CTU画面607 C しばらくすると、左の様に表示
  されます。

  (左図は旧X-CTU画面です)

  子機の設定で"IR-IO Sampling
  Rate"が設定されているので
  I/Oの情報も送られて来ます。
  "IR-IO Sampling Rate"を0に
  すれば"test"のパケットのみ
  送られて来るでしょう。


実験3

前回の記事(パート4)を参考にし、親機から子機にAPIパケット"10"のデータを送信してみて下さい。
子機が目覚めている時(LEDがON)に送れば、直ぐデータをLCDモニターに表示します。
子機がスリープ状態(LEDがOFF)の時に送って見て下さい、子機が目覚めた時にデータを受信すると思います。
尚、データを子機に送る場合は、LCDモニターに表示出来る様に文字データ12文字以内として下さい。

概念図2

コーディネータがエンドデバイスにデータを送った場合、ルータがデータを一時保管します。
でぇ、エンドデバイスからルータにデータ有無の問合わせが有った時にデータを送信すると言う事です。
(この様な接続形態ならエンドデバイスはルータとしか通信出来ません)
なのでぇ、送信しても直ちにデータは届かないと言う事に注意です。
また、ルータにエンドデバイスが沢山ぶら下がった場合や、大量のデータを送った場合等で、
データの一時保管バッファ容量が足りなくなります、するとデータは保管されず捨てられるので注意しましょう。

《その他》

気付いたらなんとパート6まで書いちゃっていました、実験初めて約1ヶ月少々、長かったなぁ〜。
当初はここまでの予定はなく、透過モード辺りで止めて置くつもりでしたが.....ついつい。
でもまぁ、ここまで理解出来ていれば、大体XBeeは扱えるのではないでしょうか?
今後は、XBeeが増えて来たら数個での実験を行って見たいなぁっとぉ......
Arduino用のXBeeシールドも買いたいけどねぇ......
イーサネットへの接続は....まだ先の話ですかね.....



"XBee3"モジュールでの見直し(*5) 2019/07/06
"S2C"モジュールでの見直し(*4) 2018/02/05
X-CTU(ver6.3.4)での見直し(*3) 2017/01/20
ライブラリとMPLAB X用に変更(*2) 2015/10/27
"skMonitorLCD.c"変更により"XBee2.c"のプログラム変更(*1) 2014/02/02


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