#WioLTE を極限までシンプルに #SORACOM Beamで使ってみた

2018年5月1日

#WioLTEを物理で攻めるver2

どうもくろにゃんこたんです。
今回はSORACOM UG信州#3で発表した資料を公開いたします。

概要

WioLTEの課題として、小型の筐体の割にモバイルバッテリーを駆使するとどうしても一日以内程度でバッテリー切れを起こしてしまう事がありました。
今回は前提条件を絞ることにより、物理現象をトリガーに通信を一発だけしたいときに使える技として、

モバイルバッテリー自体の過充電防止機能を利用してSORACOM Beamを打つ方法を思いつきましたので、スライドにまとめました。

名付けてSCFシステム(自閉式水栓システム)。
温泉に行ったときに、シャワーとかレバーを押すと一定時間シャワーが出てから止まりますよね。
要はあれです。

WioLTEの消費電力を極力抑えることで、バッテリー側が充電終了とみなして、勝手に電源供給をOFFにしてくれる機能をフル活用しました。

これにより、ボタンを押すことさえ出来れば、複数回ノーメンテナンスでBeamを打てます。

スライド解説

下記個別のスライド解説です。

自己紹介から入りますので、飛ばしましょう。

物理的に攻めるとは?

はい。前回のブレイクスルーです。
マグネットケーブルを利用して、バッテリー側と接続し、それによってBeamを一発打つ。
というものでした。

前提条件の1と2は良いとして、3と4は結構運用していて面倒でした。
取りに行ったら、マグネットケーブルを外して、紙を挟んで再セット。
この手順が結構億劫です。

ただ上記の様にブレイクスルーとしてはモバイルバッテリーの残量をほぼ気にしなくて良くなったので、
達成は出来たと思います。

IoTでも使えるモバイルバッテリーなんてものも売っています。
確かにこれなら良いのですが、ずっと流しっぱなしなので、結局1日で放電してしまうという本末転倒な事態なわけに。。。
(後につづく)

記事についての反響

はい。色々とありがとうございます。
おっしゃる通りですね。

知るかボケ。
こちらはいかにシンプルに、安く、再現性の高いものを目指してるのですよ。
マグネットケーブルの存在すら初めて知った人からは特に、別のトリガーでもいいじゃんとか言われましたが、
ン万円の業務用よりも、1,000円で買えるもののほうが楽じゃないですか。
なんでそんなに複雑なものを用意する必要があるのでしょうか。

表向きはこんな感じですがね(´ω`)

新バージョン

せっかくなのでもう少し掘り下げてみました。

何処かで見たことあるような顔してますね(´ω`)

構造としては下記の図のような感じ。

やっていることは、前回は割り箸で押してるだけだったのですが、
今回はピアノ線で、引っ張ったら紙が外れて、バッテリーと結線する。という仕組みです。
まぁやっていることは変わらないですが、動力が変わることで、WioLTEボードやバッテリーの置き場所が自由になるのは良いかなと。

さてとここまで書いて、ダンボールかアクリルケースでデモを作ろうとしたのですが、
温泉に入りながら考えていたら、( ゚д゚)ハッ!と気づきました。

もともとの課題としてモバイルバッテリーの過充電防止機能というものがあるのですが、
実は過充電防止機能ってずっと使う分にはうざいけど、逆にBeam一発くらいなら行けるんじゃないか。と。

僕の持っているバッテリーには、電源ボタンが付いていました。
これを押すと、バッテリー残量確認と共に、バッテリー供給が開始される仕組みです。
温度を一定時間図っている時に、このボタンを定期的に押さないと動いてくれなくなってしまうので、非常に面倒で、結局コンセント供給に変えた覚えがあります。

ある一定以上の消費電力が無いと、充電済みとして勝手に電源供給をOFFって仕組み。
使えるかも。。。

要は下記のフローが出来れば良いんじゃね。と。

久々のGoto文。
この赤い文字の部分をずっと回し続ければあれじゃないですかね。
Beam1000発くらい打てませんかね(´ω`)

名付けて「自閉式水栓システム」
温泉のシャワーとかにあるやつです。
バネの緻密な動作によって、お湯が一定時間出るやつ。
この水栓機構はとても複雑なので、新しく作るのは大変です。
だったら、このまま活用してしまおうというノリでやってみました。

とりあえず、WioLTE側では下記のコードで動いています。

[cpp]
#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(5000);

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

SerialUSB.println("### Connecting to \"soracom.io\".");
delay(5000);
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.PowerSupplyLTE(false);

}

err:
delay(INTERVAL);
}
[/cpp]

はい。超シンプル。
beamで起動時間を送るだけのサンプルコードを流用して作りました。

肝は「Wio.PowerSupplyLTE(false);」でLTEを切ります。
これで消費電力がかなり抑えられるので、バッテリー側は
「おやっ?充電終わったか。」と判断して勝手に切ってくれます。
重要なのはほかのセンサーやLEDを使わない(もしくは)センサーもOFFにするということですかね。

GPSとかずっと動いているとうまく動作してくれないかもしれません。

はいまとめです。
今回は駆動そのものをモバイルバッテリー側に担保させる形を取りました。
おかげで前回のマグネットケーブルよりもっとシンプルな構造をとることが出来ました。

ちなみに今回使ったバッテリーはこちら

WioLTEボードではもはやこれ以上削ぎ落とすことは必要ないところまで行ったと思っています。

そして物理面でも・・・

こちらの世界にずぶずぶとなりました。

ありがとうございました!

発表終了時に合わせてこちらの資料を公開しました。
AW○っぽくしたのが今回のオチです。

ここまでお読み頂きありがとうございます。

何かありましたらTwitterやお問い合わせフォームからどうぞ!