このページではZigBee の END DEVICE 用 ボタン子機 XBee Buttonの製作方法と CYCLIC SLEEP with Pin-Wakeを使用した設定に関する情報を掲載しています。
低消費電力で動作させるためにEND DEVICEとして動作させています。そのあたりの説明や設定が分かりにくい場合、読み飛ばしていただき、まずはROUTERで動作させて確認してみてください。(XBeeを購入した状態ではRouterになっていますので、X-CTUでのファームウェアを書き込まなければ、Routerとして動作します。)
まずはブレッドボードを使用して製作します。このまま秋月で売られている「片面ガラス・ユニバーサル基板(ブレッドボード配線パターンタイプ)」で製作しても構いません。
下図はボタン(子機)の製作例です。右側のプッシュスイッチを押すと XBeeの PORT 1の状態が変化(Hレベル→Lレベル)して親機へボタンが押されたことを知らせます。左上のプッシュスイッチはコミッション用の参加設定スイッチです。また、この製作例ではXBeeのSLEEP_RQ端子(XBee_pin 9)を利用したZigBee End Deviceによる低消費電力動作に対応しています。なお、ZigBee Routerとして動作しているときは信号が無視されるだけなのでSLEEP_RQ端子へ接続していても接続していなくても問題ありません。
左上のコミッション用の参加設定スイッチ(基板1行J列目)はGNDとXBeeの20番ピンに接続する対角(図の右上と左下)の2端子のみを接続し、残る2端子は折り曲げて基板に差し込まないようにします。ブレッドボード配線パターンのユニバーサル基板を使用する場合は、ボタン付近にある背面のマイナス電源ライン(-)パターン1行目と3行目間をカッターなどで切断しておく必要があります。(XBeeの20番ピンがGNDに接続されないように)。ブレッドボードではパターンの切断が出来ないので、プッシュスイッチの足を内側に折り曲げて挿さらないようにします。
XBeeを低消費電力で動作させるためには、購入時のZigBee Routerの状態からZigBee End Deviceに変更する必要があります。(Routerのままでも動作はします。)
End Deviceへの変更するにはX-CTUを使用してファームウェアを書き換えます。X-CTUの「Function Set」のファームウェアの種類の部分で「ZIGBEE END DEVICE AT」を選択します。X-CTUの使い方やファームウェアの変更方法「XBee ZigBee 基本編 ワイヤレス通信を始めよう」を参照してください。
一度、End Deviceに設定すると、XBeeはCYCLIC SLEEPモードで動作するようになりますので、以降はX-CTUとXBeeとの通信を行う直前にXBeeのリセットを押して、すばやくX-CTUを操作する必要があります。CYCLIC SLEEPモードではXBeeの電源がOFF状態になる期間が発生するためです。また、XBeeをリセットすることで一定の時間だけXBeeを強制的に起動させることが出来ます。
XBeeの設定はX-CTUを使用しなくても、シリアルやXBee親機からのATコマンドでも設定することが出来ますが、スリープとなっているEND DEVICEにATコマンドで設定するのは難しいと思います。End Deviceの各種設定については、XBeeに予めX-CTUで設定しておくことをお勧めします。
ZigBee End Deviceが低消費電力で動作するための動作モードです。CYCLIC SLEEPはEND DEVICE が定期的に起動して省電力に動作するモードです。SYCLIC SLEEPの詳しい説明は「XBee ZigBee スリープ方法 CYCLIC SLEEP」を参照してください。
ZigBeeボタンではCYCLIC SLEEPモードに加えてSLEEP_RQ端子から起動する機能を併せ持ったモードであるCYCLIC SLEEP with Pin-Wakeモードを使用します。
設定にはX-CTUを用います。X-CTU の Sleep Modes (SM)を0x05(Cyclic Sleep Pin-Wake)に設定することで、このモードに設定できます。
また、ボタン入力のIOポートの設定やIC(I/O Change Detection)も設定しておきます。具体的な基本設定例を下表に示します。
AT
name
| 初期
| 例
| 説明
| SM
| Sleep Mode
| Cyclic 0x05 | Cyclic+Pin 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
| 0x0020 | 32x10[ms] 0x07D0 | 20秒 ZigBeeデータ通信のための省電力モードの持続時間x10[ms]。RouterとCoordinatorは情報の最大保持期間。設定範囲は0020(320ms)〜0AF0(28sec)。 | SN
| Sleep Number
| 0x0001 | 毎回起動 0x0001 | 毎回起動 外部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毎にポーリングしない) DH
| Destination Address High
| 0x00000000
| 0x0013A200
| 親機(宛先)の上位アドレスを指定する
| DL
| Destination Address Low
| 0x0000FFFF
| 0xXXXXXXXX
| 親機(宛先)の下位アドレスを指定する
| D1
| AD1/DIO1 Config.
| 0x03
| DIGITAL INPUT
| PR
| Pull-up Resistor
| 0x1FFF
| 0x1FFF
| プルアップ有効(ボタン入力のプルアップを無効にしたい場合は0x1FF7)
| IC
| I/O Change Detection
| 0x0002
| port 1を検出に設定(port1〜3を検出にする場合は0x000Eを設定)
| |
なお、END DEVICEをX-CTUで読み込み/書き込みするには、前述のようにCYCLIC SLEEPを一時的に解除するために頻繁にリセットボタンを押す必要があります。このとき、XBeeモジュールがソフトウェア的に壊れることもあります。XBeeモジュールのソフトウェアが壊れてしまった場合は、「Always Update Firmware」をチェックしてFirmwareの書き込みを行うことで初期状態に戻すことが出来ます。Firmwareの書き込みにはFTDI製のUSB変換ICを使用します。また、書き込み後にチェックを外すのを忘れないようにします。
この回路には一つの課題があります。ボタンを押下するとXBeeのSLEEP_RQ端子の電圧が変化(Hレベル→Lレベル)してXBeeモジュールが起動し、そのすぐ後に、XBeeのDIOポート1の電圧もHレベルからLレベルに変化し、XBeeモジュールはDIOポート1の状態変化を検出します。ところが、ボタンを押下した状態のままにしておくと、電圧Lレベルの状態のままXBeeモジュールがスリープに入ってしまいます。XBeeモジュールがスリープ状態の時にボタンを放すと、ポート1の電圧がHレベルに戻ってもXBeeモジュールは検出することが出来ません。したがって、SP値で設定した20秒に1回の起動のタイミングまでXBeeモジュールは電圧の変化に気づきません。とはいっても、最大20秒後にはHレベルに戻ったことを検出して状態変化土を送信しますので、ボタンが押された通知(Lレベル)だけを親機側で検出するようにすれば、多くの場合は問題ないでしょう。
最後に2.0mmピッチのユニバーサル基板上での製作例を示します。左上の端子は電源入力用です。2mmピッチ基板に45°の角度で実装すると、なんとなく実装することが出来ます。左上のLEDはアソシエートLEDです。やはり45°の角度で実装し、すぐ左下にある1kΩの抵抗を経由してXeeの15番ピンに接続します。
右側のボタンは上側がコミッショニング用のボタン、下側が呼び出し用のボタンです。右下の端子はポート1のボタンを外部信号で押下するための入力端子です。入力抵抗100kΩを経由し、トランジスタ(2SC1815)のエミッタが接地され、コレクタはボタン(DIOポート1)に接続されています。その他の回路はブレッドボードのものと同じです。
当サイトで公開しているPC用およびH8マイコン用の「XBee 管理用ライブラリ ZB Coordinator API」を親機側のXBeeに使用することができます。受信用関数「xbee_rx_call」を用いることで、子機となるZigBee ボタンから送られてきた信号を親機側で検出することが出来ます。
ZigBeeボタンを検出するためのサンプルソフトは「基本編 プログラムを作ってみよう」のサンプル2「スイッチ状態取得」を参照してください。
ただし、ZigBee End Deviceとして動作させたいは、本機(子機)のGPIO設定を行っている「xbee_gpio_init(dev_gpio);」の部分を削除しておいたほうが良いでしょう。本関数で設定しているのは、前述の基本設定の表に記したD1値とIC値の設定ですので、親機から設定する必要が無いからです。また、SP値を20秒に設定しているので、親機からコマンドを送っても、それを子機が受信するまでに最大20秒が必要です。また、親機側のXBeeにもZigBeeボタン(子機)に設定したSP値とSN値の同じ値を設定しておく必要があります。