【PMM2018】Xbee S2C Sleepモードいじる<反応遅い最速2.4秒周期>

ヘルメットに搭載した耳たぶ式心拍センサのデータをマイコンでカウントしてXbeeで送信するだけなのですが、30-50mAも食ってます。単4二本ですが、電池寿命が数時間なので、もっと伸ばすためにSleepモードをいじってみました。
すでにXbeeをヘルメットに搭載する基板は完成しているので
あとはソフトを整備する段階です。

●Sleepモードの情報
参考にさせていただいたブログはこちら様で一番詳しかったです。
https://www.aihara.co.jp/~junt/electronic-circuit/XBee.html

●私の目的
心拍数の周期は、最速でも240bpm(250msec)で、普段は120bpmで500msec周期です。この間にSleepがはいらないかということで実験しました。

●Sleepの基礎評価
XCTUでXbeeのSleep条件を書き換えながら、使い慣れたmbed NucleoL432KCで、タイミングを測定してCPLTでグラフにしながら観察します。
■測定PIN

9番ピンにSleepControlピン(Input):HIGHでSLEEPが始まる指令
13番ピンにOn Sleepピン(Output):実際のSleep状態のモニタピンでLOWでSleep中、HIGHでWAKE中です。
①PIN Hibernate85)モードをいじる
下記グラフは、PIN Hibernateモード(5)ですが
青がSleepControlPin 入力です、
緑がOn Sleep ピンです。
赤とみどりがエッジからのタイマーで縦1マスが1秒です。
青が短時間しかHIGHになってないので緑も短時間しかLOWに
なってないのは納得ですが毎回追随しているかというと
2回に1回しか追随してないのが不思議な現象です。
これだと4秒に1回のSleep周期になってます。
制限があってSLEEPが1回分飛ばされてしまっている感じです。

訳がわからなくなってきたので、本当にONSleep信号で電流が止まっているのか確認しないといけないので、電流測定手段を考えました。
■電流測定簡易方法
電流センサをもってないので、簡易的に電流をモニターするために10Ωの抵抗をマイコンからXbeeへ入る電源線に直列にいれて
電圧降下した電圧をマイコンのAD変換でサンプリングして
上記ピンの動作と同時に表示します。
ブレッドボードに秋月のUSBインターフェース基板をさして
LEDを設置します。赤が9番ピンのSleepControlピンです。
これがついていればSLEEPになっているかというと違っていて
マイコンからの信号がSLEEPせよと言っているだけなのが後述で判明します。

緑が13番のOn Sleepピンです。点灯しているときはWAKE状態です。

SLEEP中は、電圧降下がないので3300mVですが
WAKE中だと電流が流れて、電圧降下して3000mV以下になっるので、Sleep状態を明確にとらえることができます。
PINモードで、Controlピンを2400msecHIGHにした場合のグラフです。上の橙色が10Ω抵抗に流れる電流で発生する電圧降下をAD変換したものです。電圧天井の3300mVになっている場合は、電圧降下ゼロなので電流ゼロ、電圧が短冊乗状に下がっている状態は、電流が流れて電圧降下している状態です。

これでみると明確で分かりやすいです。
緑のON SleepがHIGHのときは電流がながれていて、LOWの時は
電流が流れてません。しかし、青のSLEEP Controlとは動きが一致してません青がHIGHなのに、緑がHIGHで、電流も流れている状態が2~2.4秒常に発生してます。

●PINモードでこんがらがったのでCYCLICモードで単純化したSLEEPをみてみた
どうも制御不能なのでCYCLIC(4)モードで時間を変更しながら観察してみました。
①CYCLICモード Sleep Period=F0h(2400msec)
マイコンから入力はなしで、勝手に指定周期でSleepに入るモードです。丁度2400msec周期でオンオフがそろってます。
電力のDutyは50%となります。

②CYCLICモード Sleep Period=20h(320msec)
設定の最速値20h320msecにするとどうなるかですが
期待では320msecでオンオフがでて欲しかったのですが
全然期待を裏切られてしまいました。

通電時間は2400msecで固定されていてSleep時間320msecで
トータル2720msecでオンオフを繰り返してました。これだと
DUTYが低いので節電効果は少ないです。
Sleepの周期は2400msec以上離れてないと効かないということです。
③CYCLICモード Sleep Period=D0h(2080msec)
上記の現象の確認で2400より少し少ない周期をいれてみました

やはり、通電間隔は2400msecでSLEEPが2080msecでした。

●心拍センサとしてどう使えばいいか
アナログ無線の都合で2400msecの通電時間が最小のセットアップ時間として必要だとXbeeは言っていると思うのですがどこにも書いてないところがDIGIらしいです。
しかし、世間一般では、ZIGBEEのSLEEP復帰が速いのが特徴とあてます。数十msecでるとか書いてあるのでS2Cだけ遅いのか
どうなのか知調べてみたいです。
こちらには速いとかいてあります。
http://musenka.com/info/bluetooth_zigbee_diff.html
これは、復帰ははやいが頻繁にSLEEP復帰を繰り返すことは
できないと書いてありますので、結局、私の実験がZIGBEEの
実力なんだとがっかりしました。
BLEがZIGBEEのライバルと書いてあるのもあります
http://musenka.com/info/bluetooth-zigbee-select.html

消費エネルギーの比較表もありました
http://bluetooth.tokyo/%E8%BF%91%E8%B7%9D%E9%9B%A2%E7%84%A1%E7%B7%9A%E9%80%9A%E4%BF%A1%E8%A6%8F%E6%A0%BC%E3%80%80%E7%B0%A1%E6%98%93%E6%AF%94%E8%BC%83-658.html

最も効率がよい方法は、
①CYCLICモードで2400msec指定にしておく
②マイコンでON  Sleeps信号を監視するLOOPを回す
③ON Sleepがオンになったら平均した心拍数を送信する
④送信してからタイマーを回して2400msec手前になったら
その間の心拍数の平均値送信
⑤次にON Sleep信号がONになったら③④を繰り返す

心拍数は、送信毎に平均値を計算しておけばいいです。

●結論
2.4秒周期で心拍数を送信することで節電が50%できます。
もっと、通電待機時間が短ければ、節電%を稼げるのですが
2SCではこのレベルだということです。
心拍数だから2.4秒に一回平均値を送信すれば大勢に影響ないのですが、ペダリングのパワーなどでは一切節電はできないのでクランクは半日もてばいいくらいになると思います。

●以後
無線をいじりだして、結局周期をあげるとパワーをくって電池寿命がもたないというジレンマがあって、どうしようもない制限があることが分かってきました。ロードバイクのIOTを実現するにあたって最も良い無線は何かということを追及していこうと思います。