TWELITEの間欠受信モードで省エネを目指す

スポンサーリンク

やりたいこと

前回やった「Raspberry Pi 3からTWELITE経由でLチカする」を省エネにしたいと思います。
なぜならあまりにも電池がもたないからです・・・

実際どれくらいの期間、電池がもつのか

はじめに言っておきますが、TWILITE DIPに標準アプリを入れたものをコイン型電池で動かすは無謀です。公式サイトにも書いてあります。

公式サイトにある各数値を参考にしたざっくり計算でもわかります。

前回の親機、子機で使った連続モードでは常に約17[mA]の消費電流が発生しています。
コイン型電池であるCR2032の公称容量は220[mAh]しかありません。
220[mA]を1時間流したらそれでおしまいということです。
つまり連続モードだと220/17≒13時間しかもたない計算になります。

1日もたないんですからそりゃ使うな言いますわ・・・

消費電流(電力)を抑えるには

今後作りたいものとして、家の中の離れた場所でLEDを光らせたいという目標があります。

親機はPCやらラズパイに接続しているので電気使いたい放題ですが
子機は自由に移動させたいので電池で動かすことになります。
この電池のもち時間を少しでも延ばしたい!と大変小さな脳みそで考えた結果、
電子工作初心者でもできることをします。

子機を連続モードではなく、間欠受信モードで動作させることです。

※他にはアプリを開発するとか消費電力を抑える回路を作るとかあるようです。
私にはまだまだ無理な領域です。出来る方は公式HPなど参考に実施してみてください。

参考サイト

こちらのサイト様を参考にさせていただきました。
大変勉強になりました。

間欠受信モードについて

間欠受信モードの詳しい説明は公式HPを参照してください。

間欠受信モードは連続モードとは違い、休止時間を設定することができます。

休止時間中は消費電流も大変低いため(通常17[mA]、休止は1.5[uA])電池が長持ちします。が、扱い方が連続モードと比べると少し難しくなります。。

休止状態から目覚める方法が2つあり、1つは時間経過で勝手に目覚める方法で休止時間を1秒~10秒の間で選べます。設定変更モードで「t」を1~10の間から設定します。
もう1つは回路でDI(デジタル入力)をHighからLowに変えることだそうです。
HighだったものがLowに変わるまではずーと休止状態だとか。
設定変更モードで「t」を0にするとできるようです。

このDIの変更で目覚めさせたほうが明らかに省エネなんですが・・・
私には子機側でDIを遠隔操作する方法が思いつきませんでした。。orz

離れた場所にあるLEDを操作するためにTWILITEを用意したのに、そのTWILITEを目覚めさせるのに別のTWILITE(みたいなもの)が必要ということなのか・・・?コレガワカラナイ

考えても思いつきませんでした。
仕方ないので時間経過で目覚める方法を使います。

また、この間欠受信モードはもう1つ制約があります。
先ほどのリンクの間欠受信モードに小さく書いてあります。

親機から受信できるのは定期通信(I/Oの状態のみ)です。
UARTシリアル経由のコマンドでのコントロールは未対応です。

前回pythonで送ったようなコマンドでの直接のコントロールはできないということだと思います。実際に子機を間欠受信モードの休止時間10秒にした状態でDO(デジタル出力)をHighにしたらLEDが光るように設計したものに、親機からMONOSTICKで信号を送り続けてもLEDは光りませんでした。そのため親機はMONOSTICKではなくDIPを使用してDIをHIGH、LOW制御することにします。
DIPのDIにラズパイのGPIOを接続し、ラズパイでGPIOをHigh,Low制御します。
ただし間欠受信モードの休止状態10秒なのでラズパイから命令を出して最大10秒後に子機に情報が伝達されることになります。その分LEDの点灯,消灯は遅くなります。

各設定

親機、子機ともにTWILITE DIPを使用します。
親機は標準アプリの連続モード。
子機は標準アプリの間欠受信モードを使います。

超簡単!TWELITE標準アプリのver 1.8.2を使用します。

モード設定ビット

親機
0:0:0(M1:M2:M3)

本当はG:0:0(M1:M2:M3)なのですが、
設定変更モードの論理デバイスIDで親機設定しているので0:0:0でOKです。

子機
G:0:G(M1:M2:M3)
こちらも親機と同様に論理デバイスIDで設定したかったのですが、
論理デバイスIDを125にして間欠受信モードにするとtの10000ms(10秒)設定が生きず、
1秒間欠受信モードになってしまったので、モード設定ビットで間欠受信を表すG:0:Gとしました。

設定変更モード

設定変更モードはTWILITE Rに接続してシリアル通信で設定変更しています。

親機

--- CONFIG/MONO WIRELESS TWELITE APP V1-08-2/SID=0x8102e2e6/LID=0x00 ---
a: set Application ID (0x67720102)
i: set Device ID (121=0x79)
c: set Channels (18)
x: set Tx Power (03)
t: set mode4 sleep dur (1000ms)
y: set mode7 sleep dur (10s)
f: set mode3 fps (32)
z: set PWM HZ (1000,1000,1000,1000)
o: set Option Bits (0x00000030)
b: set UART baud (38400)
p: set UART parity (N)
---
S: save Configuration
R: reset to Defaults

DeviceIDを121に設定します。
option bitsは「ADC変化に基づいた送信を抑制する」の10と「ADC値を報告しない」の20で30にしてます。※前回00000020とか書いてましたが、20と入力するだけでOKでした・・・。。

子機

--- CONFIG/MONO WIRELESS TWELITE APP V1-08-2/SID=0x8102ea52/LID=0x7d ---
a: set Application ID (0x67720102)
i: set Device ID (1=0x01)
c: set Channels (18)
x: set Tx Power (03)
t: set mode4 sleep dur (10000ms)
y: set mode7 sleep dur (10s)
f: set mode3 fps (32)
z: set PWM HZ (1000,1000,1000,1000)
o: set Option Bits (0x00000030)
b: set UART baud (38400)
p: set UART parity (N)
---
S: save Configuration
R: reset to Defaults

DeviceIDを1にしました。125では間欠受信モードの10秒休止状態が出来なかったので。
option bitsは「ADC変化に基づいた送信を抑制する」の10と「ADC値を報告しない」の20で30にしてます。
Application ID はそのままですが、親機を同じであることを確認します。

写真、構成図、回路図

親機

親機はラズパイ3でGPIO4を出力設定にし、High(1)、Low(0)を制御してTWILITE DIP親機のDI1がHigh、Lowと変化するようにしています。

子機

TWILITE DIP親機のDI1変化に伴い、TWILITE DIP子機のDO1が変化することでLEDが光るようにしています。
標準アプリの能力で親機のDI1がHighなら、子機のDO1もHigh、親機のDI1がLowなら子機のDO1もLowとなります。
親機のDI1をラズパイから操作すれば子機側のLEDが点灯(Highで点灯)、消灯(Lowで消灯)するようにしています。
ただし間欠受信モードの10秒休止なのでラズパイでGPIO4を変更してから子機のLEDが光るまで最大10秒掛かります。

pythonのコード

親機のGPIO4をHIGH、LOWにすることで子機に接続したLEDをON,OFFさせるコードを作ります。と言っても以前書いてLピカと同じで問題ないです。

「子機のLEDをONにするもの:LpikaON.py」

「子機のLEDをOFFにするもの:LpikaOFF.py」

実行結果

この投稿作成中に初めて知ったのですが、ラズパイのGPIOステータスを見るコマンドがありました。こちらのコマンドです。

$ gpio readall

各実行結果は以下の通りです。

何も接続しない状態でのGPIO。

そしてGPIOに今回の回路を接続したあと結果がこちら。
BCM4(GPIO4)のVが1から0に変わっています。

さらにpythonのコードを実行しLEDを点灯したときの結果がこちら。
BCM4のModeがINからOUTに変わり、Vが0から1に変わりました。

こうやって現在のステータスが確認できるのは便利ですね!

実際に動かしているところを動画にしました。
ラズパイでpythonのコードを叩き、少し時間が経ってからLEDが点灯、消灯しているのがわかります。

最後に(茶番)

で、実際どれくらい省エネになったかざっくり計算してみます。

※ホントはもっと色々条件あると思います。概算です。

連続モードで17[mA]の消費電流です。

間欠受信モードの休止中は1.5[uA]程度なので無視します。
9秒間スリープで1秒通信すると仮定すると、
だいたい1秒あたり消費電流は1.7[mA]となるため
220/1.7=約129時間。129時間なんで5日は持ちますね!!

・・・5日だと?
・・・だからコイン型電池は使えないとか書いてあるのか・・・?

さすがに短いので単3電池か充電池を使うようにしたいと思います。
この内容はまた次回に。。

※2018/06/26追記

コメント頂いた通り計算が誤っておりました申し訳ございません。。

詳しくはAbe-san様のコメントをご確認ください。

ボタン電池でも十分実用的です。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. Abe-san より:

    はじめまして。
    間欠受信モードについていろいろ調べているなかで、このコラムを見させていただきました。

    ところで、最後の電池寿命の計算について気になったのですが…

    17[mA] というのは送受信をしている『間(あいだ)』の電流ですので、
    例えば『間』というのを長めに仮定して 4[ms] とすると、
    → 17e-3[A] * 4e-3[s] = 68e-6[C(クーロン)](消費電荷量)
    で、CR2032の容量 220[mAh] は 220[mA] を 1[h](=3600[s]) 流せるだけの電荷量ですので、
    → 0.22[A] * 3600[s] = 792[C](電池CR2032が保有する電荷量)
    従って、電池が尽きるまでに通信可能な回数は、
    → 792[C] / 68e-6[C] = 11647058.8[times]

    10秒間に一回通信を行うと仮定すると、
    → 11647058.8[times] * 10[s] = 116470588[s] = 32352[h] = 1348[day] = 3.74[year]
    となり、単純計算で3.7年もつことになると思います。

    また、スリープ中の 1.5[uA] を加えて1周期中の時間比率を使って計算すると、平均電流は
    → 17[mA] * (4[ms] / 10000[ms]) + 0.0015[mA] * (9996[ms]/10000[ms]) = 0.00830[mA(ave)]
    となるので、TWELITEが動作可能な時間は
    → 220[mAh] / 0.00830[mA(ave)] = 26506[h] = 1104[day] = 3.06[year]

    となり、単純計算で3.0年もつことになりそうです。

    ちなみに129時間となるのは『9秒間スリープ&1秒間"休みなく"通信』という場合ですね。
    → 17[mA] * (1000[ms] / 10000[ms]) + 0.0015[mA] * (9000[ms]/10000[ms]) = 1.70[mA(ave)]
    → 220[mA] / 1.7[mA(ave)] = 129[h] = 5.3[d] = 0.0145[year]

    なにとぞ参考にしていただけたら幸いです。

    • hakengineer より:

      コメントありがとうございます!
      大変丁寧な計算もありがとうございます。

      ご指摘の通り、私の計算が誤ってますね、すいません。。
      公式をよく読むとちゃんと書いてありましたね。。
      https://mono-wireless.com/jp/products/TWE-APPS/App_Twelite/step2.html

      消費電力について
      「1パケット送信時には約1~4m秒間に約15mAを消費します。」

      コイン型電池でも十分実用に耐えますね!