このページでは XBee ZigBee の END DEVICE 用 CYCLIC SLEEP の基本的な動作に関する情報を掲載しています。内容は少し高度です。
END DEVICE が定期的に起動して省電力に動作するモードです。X-CTU の Sleep Modes (SM)を0x04(CYCLIC SLEEP)に設定します。またはATコマンドのATSMで設定します。
AT
name
| 初期
| 例
| 説明
| SM
| Sleep Mode
| 0x04 | Cyclic 0x04 | Cyclic No Sleep(00)/Pin Hibernate(01)/Cyclic Sleep(04)/Cyclic Sleep Pin-Wake(05)の切り換え。Cyclic Sleep wakes on timer expiration.
| ST
| Time before Sleep
| 0x1388 | 5000[ms] 0x01F4 | 500[ms] シリアルやRFの通信終了後、省電力モードに移行するまでの待ち時間[ms]。 | SP
| Sleep Period
| 0x20 | 32x10[ms] 0x64 | 100x10[ms] ZigBeeデータ通信のための省電力モードの持続時間x10[ms]。RouterとCoordinatorは情報の最大保持期間。設定範囲は0020(320ms)〜0AF0(28sec)。 | SN
| Sleep Number
| 0x0001 | 毎回起動 0x003C | 60回毎 外部CPUを起動するまでの起動カウンタ。SP後に通信データが無い場合は省電力モードになり、それがSN回続くと外部On/Sleep pinへON信号(H)を出力する。(SP×SNの間隔で起動) | SO
| Sleep Options
| 0x00 | オフ 0x00 | オフ 0x02 - Wake for ST time on each cyclic wake (after sleeping for SP*SN) | 0x04 - Enable extended cyclic sleep (SP毎にポーリングしない) WH
| Wake Host
| 0x0000 | オフ 0x0064 | 100[ms] XBeeモジュールのIOに接続する機器の起動待ち時間[ms]。 | XBeeのスリープ解除後にUART出力とIOサンプリング処理を設定時間だけ遅らせます。 SI
| Sleep Immediately
| -
| -
| スリープの実行。ATAC(Apply Change)を実行しなくてもスリープに移行する。
| |
END DEVICEをX-CTUで読み込み/書き込みしようとすると、通信エラーが発生する場合が増加します。リセットボタンを押してからST時間内にRead/Writeすると成功しやすくなります。
ATSMで04を設定します。通常は「Cyclic Sleep(04)」を使用します。省電力の管理をXBeeで行うことが出来ます。大抵の用途は後述のSTやSP、SNを設定することで実現できます。
また、「Pin Hibernate(01)」は最もXBeeが低消費電力になるモードですが、省電力の管理を外部のマイコンなどで行う必要があります。XBeeのSleep_Rq (module pin 9) をHでスリープに、LでXBeeが起動します。XBeeは省電力になりますが管理するマイコンの消費電力が増大してしまう点に注意が必要です。
玄関チャイムや警報用センサのように駆動した瞬間だけ起動したい場合もあります。このような場合はSleep Modeを後述の「CYCLIC SLEEP PIN-WAKE(05)」に設定します。
シリアルやRFの通信終了後に、省電力モードに移行するまでの待ち時間です。言い方を変えると、通信が終了したかどうかを判断するための無通信時間の長さです。継続する今のデータと次のデータとの間にマイコンなどの処理によって隙間の時間が生じますが、その最大の時間を設定しておくことで、通信の終了を正しく判断して、省電力モードに移行することが出来ます。
あまり短いと、続く次の送信データや受信データを送信できなかったり受信できなかったりする場合があります。あまり長いと消費電力が増大してしまいます。
前述のST時間経過後にXBeeは省電力モードに移行します。この省電力モードの持続時間がSPです。単位は10[ms]で設定範囲は0x0020(320ms)〜0x0AF0(28sec)です。SP時間後にZigBeeデータ通信を行い、データが無ければ再び省電力モードに移行します。SP値が大きいと、例えば、照明のOn/Offのような制御の時には動作するまでに時間がかかるような問題が発生します。また、小さいと消費電力が増大してしまいます。
さらに、End DeviceだけでなくCoordinatorやRouterにもSP値を設定しなければなりません。CoordinatorやRouterはスリープ中のEnd Device宛の情報を一時的に保存しておかなければならず、設定値はその保持期間として利用されます。したがって、End Deviceと同じSP値を設定します。なお、仕様書には全てのCoordinatorとRouterに設定するように明記されていますが、経由しないデバイス(例えば、センサーなのにRouterに設定しているデバイスなど)には設定しなくて良いかもしれません。
前述のSP時間後にデータが無ければ再び省電力モードに移行することを繰り返しますが、その繰り返し回数がSN回に達した時に外部のマイコンを起動することが出来ます。つまり、SP×SNの間隔で起動します。
具体的には、SP後に通信データが無い場合は直ぐに省電力モードになり、それがSN回続くと外部On/Sleep pinへON信号(H)を出力し、外部のマイコンからコマンドを受けたり送ったりすることが出来ます。
Sleep Periodでは最大の間隔が28秒でしたが、センサーの測定間隔を15分に1回のように長周期にするような場合に使用します。
SP値と同様にEnd DeviceだけでなくCoordinatorやRouterにも設定しなければなりません。CoordinatorやRouterは設定されたSP×SNの3倍の時間を経過してもEnd Deviceと通信できない場合、そのEnd Deviceの登録を削除してしまうからです。
下表はSPとSNの設定時の目安です。SPやSNは16進数で設定するので、直感的に分かりやすい秒数に換算しています。起動間隔はセンサーなどによる測定間隔、保持時間はCoordinatorやRouterがEnd Deviceの登録を保持できる時間です。
CYCLIC
SLEEP SP×SN 設定時の目安 |
SP(Sleep Period) | SN(Sleep Number) | 起動間隔 | 登録保持時間 | ||||
[HEX] | [ms] | [HEX] | [回] | [sec.] | [min.] | [sec.] | [min.] | |
初期値 | 0020 | 320 | 0001 | 1 | 0.3 | 0 | 5.0 | 0 |
送受信デバイス(1分間隔) | 0064 | 1000 | 003C | 60 | 60.0 | 1 | 180.0 | 3 |
送信用デバイス(1分間隔) | 07D0 | 20000 | 0003 | 3 | 60.0 | 1 | 180.0 | 3 |
送受信デバイス(3分間隔) | 012C | 3000 | 003C | 60 | 180.0 | 3 | 540.0 | 9 |
送信用デバイス(3分間隔) | 07D0 | 20000 | 0009 | 9 | 180.0 | 3 | 540.0 | 9 |
警報用デバイス(60分間隔) | 07D0 | 20000 | 00B4 | 180 | 3600.0 | 60 | ####### | 180 |
警報用デバイス(24時間隔) | 0960 | 24000 | 0E10 | 3600 | ####### | 1440 | ####### | 4320 |
最大値 | 0AF0 | 28000 | FFFF | 65535 | ####### | 30583 | ####### | 91749 |
注意点はEnd Deviceに設定した最大のSP値とSN値を、そのEnd Deviceが登録されているCoordinatorやRouterに設定しなければならない点です。また、SP値やSN値が小さすぎると一時的に外しただけで通信データが消失したり、デバイスの登録が削除されてしまいます。反対に、設定上の最大の起動間隔は21日間ですが、あまり大きすぎるとデバイスが無くなっているにも関わらずデータや登録を保持し続けてしまうので、他の正常な通信に支障をきたしてしまう恐れがあります。
警報用デバイスは送信以外は全く実施しないXBee End Deviceを想定しています。このデバイスは受信はしていないと考えた方が良く、もし、問い合わせても応答が来るのは1時間後だったり翌日だったりします。Pin Wake SleepのSM(Sleep Mode)=05と併用することで警報用のセンサーからXBeeを起動させて送信を実行します。(仕様書にそのように記載されていると解釈しているが、実際の動作は現在確認中)
スリープ状態からSP×SN時間後にXBeeのマイコンがST期間だけ起動しますが、この時に必ず起動し続けるというオプションのようです。通常もSP×SN時間後にXBeeは起動しますが、何らかの条件で起動しない、もしくは、起動中も省電力と起動を短い周期で繰り返しているということだと解釈しています。ボクは使ったことがありませんし、用途が不明ですが、XBeeが正しく定期的に起動しない、もしくは、起動中にデータのサンプリングに失敗するといった場合に使ってみてください。
SO値を0x02に設定することでこのモードに移行します。具体的にはATコマンドでATSO02と設定します。解除はATSO00です。
なお、受信データの有無を確認する間隔はSO=0x00の時と同じくSP値で指定された間隔になります。また、SO=0x00とSO=0x02のCYCLIC SLEEP状態をShort Cyclic Sleepと呼ぶようです。
前項のShort Cyclic Sleepに対して、より長期の間隔で起動を行うExtended Cyclic Sleep状態に設定するオプションがSO=0x04です。
既に、SP時間とSN回数の関係で、SP時間ごとに通信確認、SP×SN時間ごとに外部マイコン起動していることを説明しましたが、ATSO04と設定すると、SP時間ごとの通信確認が無くなります。したがって、SP×SN時間ごとにしか動作しなくなります。通信を、極力、減らして消費電力を控えたいときに使用します。ここまでしなくてもSPやSNの設定だけでも単3電池2本で半年近く持つようなので、10年間の電池交換不要といった特殊な用途向けだと思います。
XBeeモジュールのGPIOやADCのサンプリング動作はCyclic Sleepに密接に絡むので、ここで説明しておきます。IO サンプリングの方法は以下の3種類の方法があります。
サンプリング方式
XBeeライブラリで | 使用する関数 説明
| Queried Sampling | (サンプリング要求方式) 要求:xbee_force | 受信:xbee_rx_call
親機Coordinator等から「サンプリング要求」を受けてサンプリングを行う方法。 | スリープ状態が復帰してからサンプリングを行いMODE_RESPとして応答が得られる。 (内部ではATISコマンドで要求し、FrameType0x97で応答している) Periodic IO Sampling | (周期サンプリング方式) 受信:xbee_rx_call
|
子機が自立して一定の周期でサンプリングを行う方法。周期はATIR[ms]で設定する。 | スリープから復帰後のST期間内にIR間隔でサンプリングを行い、結果はMODE_GPINと して応答が送られる。(内部ではFrameType0x92で応答している) Change Detection Sampling | (変化検出方式) 受信:xbee_rx_call
|
GPIOのデジタル入力に変化が生じた時にサンプリングを行う方法。 | スリープから復帰後にサンプリングを行い、変化があった場合のみ、MODE_GPINと して応答が送られる。(内部ではFrameType0x92で応答している) |
注意しなければならないのは、要求方式(Queried Sampling)だけでなく、周期方式(Periodic IO Sampling)と、変化検出方式(Change Detection Sampling)についてもスリープ中は動作しないことです。つまり、周期方式の実際のサンプリング周期はSP値×SN値が支配的な間隔となり、その中のST期間中にIR間隔でサンプリングをで行うとなります。また、変化検出方式についてもスリープが解除されている時しか検出できません。(2009/8/18時点の仕様では割り込みで起動するような機能はありません)
ここでは「XBee 管理用ライブラリ ZB Coordinator」におけるIO サンプリングの設定方法について説明します。本XBeeライブラリでは主として要求方式と変化検出方式を使用することを想定しています。したがって、周期方式を使用する場合はATコマンドもしくはX-CTUを使って予め子機XBeeへ周期動作の設定をしておく必要があります。
要求方式(Queried Sampling)では親機側のライブラリのxbee_force関数を用いて、引数に要求先の子機XBeeのアドレスを指定して要求を送信します。送信を受け取った子機は親機へサンプリング結果を返信します。親機側のライブラリではxbee_rx_call関数を使うことでMODE_RESP応答を得ることが出来ます。ただし、スリープの設定によっては丸1日後に戻ってくる場合もあります。
周期方式(Periodic IO Sampling)はX-CTU等を使用して子機XBeeにATIR値を設定します。初期値は「ATIR0000」で周期方式がオフになっています。周期方式を1秒間隔で設定する場合はATコマンドで「ATIR03E8」、3秒間隔なら「ATIR0BB8」、1分なら「ATIREA60」と入力します。親機側ではxbee_rx_call関数にMODE_GPIN応答が返ってきます。
変化検出方式(Change Detection Sampling)は親機側のライブラリのxbee_gpio_config関数を使用することで親機から子機へリモート設定することが出来ます。引数はアドレス、ポート番号、設定値です。設定値に「DIN」を設定すれば子機のGPIOの指定ポートが入力に変わるとともに変化検出時にサンプリングデータを親機へ送信するように親機のアドレスも自動で設定してくれます。親機側ではxbee_rx_call関数を使うことでMODE_GPIN応答が返ってきます。
玄関チャイムや警報用センサのように駆動した瞬間だけ起動したい場合もあります。このような場合はSM(Sleep Mode)を「CYCLIC SLEEP PIN-WAKE(05)」に設定します。また、起動用のボタンをGPIOの入力だけでなくSLEEP_RQ(XBee_pin 9)にも接続します。例えば、ボタンをport 1すなわちDIO1(XBee_pin 19)に接続した場合、ボタンをSLEEP_RQ(XBee_pin 9)にも接続して割り込みを発生させます。また、IC(I/O Change Detection)も設定しておきます。具体的な設定例を下表に示します。
AT
name
| 設定例
| 備考
| DH
| Destination Address High
| 0x0013A200
| 親機(宛先)の上位アドレス
| DL
| Destination Address Low
| 0xXXXXXXXX
| 親機(宛先)の下位アドレス
| SM
| Sleep Mode
| 0x05
| CYCLIC SLEEP PIN-WAKE
| SP
| Cyclic Sleep Period
| 0x07D0
| 20秒
| SN
| Sleep Number
| 0x0E10
| 3600回
| D1
| AD1/DIO1 Config.
| 0x03
| DIGITAL INPUT
| PR
| Pull-up Resistor
| 0x1FFF
| プルアップ有効
| IC
| I/O Change Detection
| 0x000E
| port 1〜3を検出設定
| |
子機End Deviceは一定間隔で親機Coordinatorと通信を行う必要があります。親機に設定したSP×SN時間を超えると、親機は子機の情報を忘れてしまうからです。NJ(Network Join)設定が0xFFで常時ジョイン可能であれば忘れてしまっても再接続できますが、それ以外だと忘れると再接続が出来なくなります。