#WioLTE の電力消費に疲れた方へ

#WioLTE の電力消費に疲れた方へ

![SORACOMUGTokyo10-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/99cf2777-0d65-9f47-3881-027458006c5f.jpeg)

どうもくろにゃんこたんです。
今回SORACOMUG Tokyoにて発表させて頂く機会があり、資料を大幅にリライトいたしました。
内容としてはほぼ同じですが、多少真面目に作りました。

前回までのアーカイブは[こちらのブログ-くろにゃんこたん.com](https://kuronyankotan.com/?p=660)に残しています。

#結論
WioLTEに限らず、マイコンボードとセンサーを利用するためには継続的な電力供給が必須であり、モバイルバッテリーでの運用は現実的ではありません。
そこで、通信モジュールと電源モジュールに縦割りし、それぞれのマイコンで自立制御させることで、通信を行う最低限の担保をさせています。
これにより、モバイルバッテリーでは１日持たなかったものが、ひと月程度まで運用出来る様になりました。

また、タイトル的にWioLTEをdisっている様に見えますが、むしろWioLTEだからこそこの運用が成り立つので素晴らしいボードだと思います。

#詳細
![SORACOMUGTokyo10-04.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/125755d2-1897-217a-4ee2-0519e9905efd.jpeg)

IoTの最大の課題と言われる電力問題ですが、現在はいろんな試行によってなんとか実現されている状態です。
BLEやRFID、Wifi技術の応用から、そもそもの電力元として太陽光や鉛電池など。
それぞれプロダクトになってしまえば最適化が出来るので、それなりに結果は出せると思いますが、今回の題材であるWioLTEボードはあくまでその前段階のプロトタイプ作りにフォーカスしています。

プロトタイプ上でうまく行けばそれ専用のボードを設計して量産に映ることが出来るのですが、
この段階で電力問題に引っかかってしまうと、プロトタイプとしてデモンストレーションすらままならない場合が多いです。

## SORACOM使う時ってだいたい僻地
僻地は言いすぎかもしれませんが、電力が潤沢に用意されている環境だったらそもそもLoRaWANゲートウェイ設置やWifiアクセスポイントの設置が出来ちゃうんです。
いちいちSIMを刺して通信を発生させないといけないシチュエーションというのは、大体電源が無い＆そんなに近くにボードが無い。場合が多いと思います。
例えばラズパイが10台位数メートルの範囲に散らばっているのだったらSIMを刺すより、Wifiで繋げたほうが早いですよね。でその先にSORACOMならわかるんです。

ということは独りぼっちでボードとセンサーが頑張って動いているような切ない場面に利用することが多くなるので、
結果的にはそんなに近くにコンセントがあるとは限らないんですよね。

![SORACOMUGTokyo10-05.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/a1b126c2-cc7b-efb4-267c-d44618e91a47.jpeg)

電力問題の永遠の課題ではありますが、
それを解決するには、とてもシンプルでして、
・供給電力量を増やす
か
・電力消費を減らす
か
しかありません。
宇宙太陽光発電からの、サテライトワイヤレス給電なんてモノが実現すれば特に問題ないですが、今の所は電力消費を減らす方が簡単です。

## 郵便ポスト投函通知システム

![SORACOMUGTokyo10-06.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/8f005fa0-edfe-4074-5f3e-0125ebe630d5.jpeg)

手軽に試せる環境として、郵便ポスト投函を通知するシステムを前回作りました。
通常であればあらゆるセンサーを利用して、郵便物を感知し、通知を送るようなシステムになりそうですが、
モバイルバッテリーを使っていると一日として持たないです。

毎日充電したモバイルバッテリーでセットして出掛けるとか、とても手間なので、プロトタイプとしては駄目です。
だって面倒だから製品化しようという気にならないですもん。
最適化して一週間使えるようになるから。って説得するのも手ですがエビデンスレベルで実証できないことには製品化しないので、
結局最適化したボードを作ってから、プレゼン。それって本末転倒ですよね。。。

そこで！

![SORACOMUGTokyo10-07.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/8a9a3f05-265f-fbbc-e41c-4a626e66da0a.jpeg)

モバイルバッテリーでも数日以上投函を待っていられる仕組みを考えました。
なにをしたかといえば、センサーを使うことをやめて、物理的に投函されたら電源がONになるという考え方に変えました。
そのためには物理的にバッテリーと通信モジュールを分断し、投函時に接触させることが出来るマグネットケーブルを使いました。

## 何が画期的だったのか

基本電源OFFという考え方が生まれたのは大きいです。
特にWioLTEはArduinoですので雑に言うとsetup()とloop()しかありません。
なので電源が入ったら通信。ハイ終わり。
という技が出来ます。ラズパイだったらOSを起動してPythonコードを自動起動して・・・とちょっと面倒です。


![SORACOMUGTokyo10-08.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/c5bd7023-1d26-b349-b711-27b581538b05.jpeg)

ポイントを整理するとこうなります。
要するにこれで、電波が届けばどこにでも連れていけるわけですね。

しかし！
これだけだとちょっと不満点が残りました。

![SORACOMUGTokyo10-09.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/38488d3b-cc07-9e7e-2d1d-a0b95d4ca808.jpeg)

一番の問題は結線を一度してしまうと、その後電源ONが続きバッテリーを食いつぶすところまで動いてしまうことにあります。
そうすると一回の通知の為だけにバッテリーを一個使ってしまうことになります。

悲しいことですが、通知を受けたら電源を切りに行ってバッテリーを再セットする手間が発生してしまいます。
それが辛いからWioLTEを頑張って省電力で待機させようという話も数多くあります。

シンプルなのは結線して通信が成功したら、断線させればいいんですけどね。
それにはモーターを動かすか、ししおどしみたいに一定時間でワイヤーを引っ張ってマグネットを外すなど結構構造上複雑になってきます。
プロトタイプにそこまでのギミックを用意するのは趣味なら楽しいですが、商用には向きません。
機構が複雑であればあるほど故障の原因となりうりますし。

さらにはバッテリー選びにも気を使う必要があります。

![SORACOMUGTokyo10-10.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/34398806-5959-96cc-d796-efff0d9aaf61.jpeg)

このシステムで一番やっかいなバッテリーは、USB端子に刺さってると電源供給を無駄にしてしまうバッテリーです。
その先のボードには繋がっていないのに電力を消費してしまうので、このシステムでは成立しません。

また、過充電防止機能付きのバッテリーでは、電力消費にムラがあるボードでは意図しないタイミングで電力をカットされることになるので致命的です。
まぁ当たり前ですけどね。モバイルバッテリーってマイコンボードを動かすためにあるのではなくて、機器を充電してあげるためにあるわけですから。
モバイルバッテリーに罪は無いです。


![SORACOMUGTokyo10-11.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/a1a22e17-8012-dea0-2393-67923b55c0f6.jpeg)

そこで温泉に入りながらなにかうまい方法は無いものかと。
それこそ漫画の世界のようにピアノ線を駆使して物理面でぶつかって行くしかないか、そこまで求めず切り捨てるか。

と、シャワーを浴びながら考えていたのですが、

![SORACOMUGTokyo10-12.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/3ed00e40-8103-43d3-95fd-55b3865041a1.jpeg)


「過充電防止機能」ってすなわち、電力消費量が多い場合には電力を供給してくれるけども、各種ボードの電力を切って省電力モードにしてしまえば、勝手に電気を切ってくれる素晴らしい機能じゃないか！？

と思いつきました。


![SORACOMUGTokyo10-13.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/b1b7fb2b-694d-762b-90e5-95e864b8a08b.jpeg)

ちょうどデモに使っていたモバイルバッテリーですが、過充電防止機能が働くと勝手に電力供給をやめます。
ただ、モバイルバッテリーについている残量ボタンを押すと充電を再開してくれるのです。

じゃあ郵便受けに投函されたら、このボタンを物理的に押してしまえばいいんじゃね？となりますよね。
ちなみに、最初の一回はどうしても電力を供給してしまうためセットしたらしばらく待つ必要があります。

## 運用フロー

![SORACOMUGTokyo10-14.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/61c070cd-e788-0a63-2fc7-0c7cf2bc5f28.jpeg)
![SORACOMUGTokyo10-15.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/f45fa0e2-7504-cca0-61ca-3bf9302956c7.jpeg)
![SORACOMUGTokyo10-16.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/40fbd56a-ae25-7aac-e23f-7b0ca6f9aea7.jpeg)
![SORACOMUGTokyo10-17.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/20b11845-abc5-d861-5bac-a157e52e105c.jpeg)

## WioLTE実装コード

```cpp:post.ino

#include <WioLTEforArduino.h>
#include <stdio.h>

#define INTERVAL  (6000)

WioLTE Wio;
bool send_flag = false;

void setup() {
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");

  SerialUSB.println("### I/O Initialize.");
  Wio.Init();

  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(1000);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  SerialUSB.println("### Connecting to \"soracom.io\".");
  delay(1000);
  if (!Wio.Activate("soracom.io", "sora", "sora")) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
}

void loop() {
  char data[100];

  if (send_flag == false) {


    SerialUSB.println("### Open.");
    int connectId = Wio.SocketOpen("beam.soracom.io", 23080, WIOLTE_TCP);
    if (connectId < 0) {
      SerialUSB.println("### ERROR! ###");
      goto err;
    }

    SerialUSB.println("### Send.");
    sprintf(data, "{\"uptime\":%lu}", millis() / 1000);
    SerialUSB.print("Send:");
    SerialUSB.print(data);
    SerialUSB.println("");
    if (!Wio.SocketSend(connectId, data)) {
      SerialUSB.println("### ERROR! ###");
      goto err;
    } 

    SerialUSB.println("### Receive.");
    int length;
    do {
      length = Wio.SocketReceive(connectId, data, sizeof (data));
      if (length < 0) {
        SerialUSB.println("### ERROR! ###");
        goto err;
      }
    } while (length == 0);
    SerialUSB.print("Receive:");
    SerialUSB.print(data);
    SerialUSB.println("");

    SerialUSB.println("### Close.");

    send_flag = true;
    SerialUSB.println("### LTE Power supply OFF.");
   
    Wio.Deactivate();  // Deactivate a PDP context. Added at v1.1.9
    Wio.TurnOff(); // Shutdown the LTE module. Added at v1.1.6
    Wio.PowerSupplyLTE(false); // Turn the power supply to LTE module off

  }

err:
  delay(INTERVAL);
}
```


通信だけ行うのでこんなにシンプルなコードとなりました。
なんといっても、適当にバツンと電源を切っても大丈夫なのは良いですよね。
ラズパイのOSシャットダウン途中で電力が途絶えたらとか考え始めるとまた、色々と大変そうなので。。。

## デモ動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">WioLTE+モバイルバッテリー過充電防止機能併用ノーカット <a href="https://t.co/2coX0ibavZ">https://t.co/2coX0ibavZ</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; くろにゃんこたん (@kuronyankotan) <a href="https://twitter.com/kuronyankotan/status/967209652357185536?ref_src=twsrc%5Etfw">2018年2月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ちょっと長いですが、連続で２回送信に成功している動画はこちら。
ノーカット、ノー編集です。

本当にしているのか分かりやすくするため、メール送信もやってみました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">分かりやすいようにメール通知もやってみました。<br>WioLTE+モバイルバッテリー過充電防止機能併用ノーカット2 <a href="https://t.co/ursRol8e9V">https://t.co/ursRol8e9V</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; くろにゃんこたん (@kuronyankotan) <a href="https://twitter.com/kuronyankotan/status/968034038421209088?ref_src=twsrc%5Etfw">2018年2月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ちなみに通知方法はなんでもよかったのですが、
郵便受け通知なので「メール」にしました。（シャレです）


こちらを名付けまして

![SORACOMUGTokyo10 (1)-18.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/63328f90-0559-ad47-57f8-d1b319233a37.jpeg)

自閉式水栓システムとしました。
温泉施設のシャワーとかボタンを押すと一定時間出続けて勝手に止まってくれるアレです。

自閉式水栓自体はものすごく複雑な構造をしていて、温度管理なんかも金属とバネの力でなんとか調整してしまうというすごいシステムになっています。
到底真似できません。
車輪の再発明をしない方が楽なので、そのシステムをまるっと利用させてもらうわけです。

要はバッテリーのマイコン制御に電力供給の舵取りを任せてしまうやり方ですね。

![SORACOMUGTokyo10 (1)-19.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/1b5571be-e4f4-ac68-55fb-88cfeb1bc9d8.jpeg)

論文調に言ってみるとこんな感じです。
言ってしまえばバッテリーもマイコンボードもそれぞれ、縦割り社会の中で頑張ってくれているので、
結果自律分散という言い方も出来るわけです。
なんかカッコいいですよね。

## 応用例

![SORACOMUGTokyo10-18.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/060637c2-29ba-e9f7-480c-c57e7195a373.jpeg)

単純にボタンが押されれば通信する。というだけなので最適化も簡単です。
WioLTE自体は電圧が足りませんが、最適化の結果ボタン電池一個でいけるボードが出ても不思議ではないです。
センサーも要らないですし。

そうなってくると、開閉センサーもシンプル。マットの下に置けば侵入センサーといろいろと活用できます。
しかもサッと置くだけで、あとはクラウドにデータが送られてくるだけですからちょっと危ないところにもなんとか置けます。

## それぞれのプロフェッショナルへ

![SORACOMUGTokyo10-19.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/c21b5cc4-1b3a-ce34-3269-cf8692b6550e.jpeg)

バッテリーはバッテリーのプロ。
通信は通信のプロに任せたほうが良いに決まってます。 

通信側でバッテリーの管理も任せてしまうとコードがどんどん複雑になりメンテナンスも大変です。

## シンプルであればあるほど良いし、簡単であればあるほど良いし、安ければ安いほど良いのです。
## モノにお金を掛けるんじゃなくて、こういう考え方にお金をかける時代なんじゃないでしょうかとは思います。

ちなみに温度センサーなどは時間を掛けて数値を安定化させる必要がセンサーによってはあるのですが、
例えば、温度センサーもプロに任せてしまえば良いんじゃないかという発想にも繋がります。
汎用的なのは、昔ながらの水銀温度計をずっと置いておいて、WioLTEが起動した時にだけ写真を撮って画像認識とか。
そこまでしなくても、センサー側でずっと値を保持していて必要な時に読み出せば正確な値が採れる水温計なんてものもあります。
当然それはそれで最適化されているので、ただセンサーを付けておくよりはずっと長持ちします。

プロトタイプを作るにも、楽できるとことは楽をしたほうが良いと思います。
難しいことを考えるよりは、そのサービスを使って喜ぶ人の顔を想像したほうが楽しいと思います。

と考えると少し楽しくなりませんか？(´ω｀)

![SORACOMUGTokyo10-21.jpg](https://qiita-image-store.s3.amazonaws.com/0/218533/3744abc3-151c-554b-e544-8573220e7e13.jpeg)