「充電の家計簿」SUBACO(伊東 健一)

SUBACO(Smart USB BAttery Charging Organizer)

伊東 健一

作ったもの

「SUBACO」という、モバイル機器の充電を自動で管理してくれるサービスを作りました。充電器と端末の間に繋いでおくだけで、充電状況を記録して蓄積します。専用のWebアプリにWi-Fiで情報を送信するため、いつ、どこからでも情報を閲覧できます。

画面の最上部では、モバイルバッテリの残量情報がグラフで並びます(この画面では一つだけですが)。その下に、バッテリや端末を最後に充電してからの時間や、充電の履歴が並びます。

動機

バッテリの充電は、日々スマホやタブレットを活用する現代人にとって大きな足かせです。ウェアラブルやIoTの進展により、充電が必要な機械はさらに増えてきています。外でスマホの充電が切れてしまった、ワイヤレスイヤホンを使おうとしたら電池残量がない……といった悲劇は、多くの人が経験したことがあるのではないでしょうか?

モバイルバッテリを持ち歩けば、この種のトラブルはかなり回避できます。ただ、そのモバイルバッテリも充電が切れればただの箱です。残量を常に確認し、充電しておかなければ十分に活躍できません。

こんなに面倒な充電を、ユーザ自ら管理することは果たして効率的でしょうか? 残量や充電履歴を把握し、適切なタイミングに充電する作業を機械が代行してくれれば、我々はストレスなくモバイル生活を謳歌できるのではないでしょうか。

機能と構成

3ヶ月の演習期間に実現できそうな成果として、充放電履歴を閲覧できる「充電の家計簿」を目指すことにしました。画面を一目見れば、どの端末やバッテリを充電すべきかが分かることが目標です。また、家計簿アプリのように履歴を閲覧し、日々の充電スタイルを把握できる効果も見込んでいました。

モバイルバッテリの多くは3~4段階の大まかな残量表示しかできません。そのため、バッテリから流れる電流を測ってやる必要があります。検討の結果、充電時に計測と記録を行うハードウェアと、データの蓄積・表示を行うWebアプリが連携する形をとりました。データの交換以外はそれぞれ独立に作業できるので、開発の負担を軽減できます。

最終的に、図のような構成となりました。当初はスマホやヘッドホンとBluetoothで通信して名称やバッテリ情報を読み取ることも考えたのですが、SUBACO側からの通信がうまく行かず断念しています。

 

製作の流れ

ハードウェア

まずは、使用するマイコンとセンサを選定することから始めます。2017年の時点で、Wi-Fiが使えるマイコンボードというとESP-WROOM-02(http://akizukidenshi.com/catalog/g/gK-09758/)(ESP8266)がMaker界隈で圧倒的人気でした。しかし、Bluetoothを使ってみたかったこともあり、進化版のESP-WROOM-32(http://akizukidenshi.com/catalog/g/gM-11819/)(ESP32)を選びました。結局Bluetoothは没になったので、慣れているESP8266でやればもう少し楽だったことでしょう……。

ESP32自体はEspressif Systemsという会社の製品ですが、Arduinoの開発環境を使ってプログラムすることもできます。Arduinoの既存のコードやライブラリを流用できるので、初めて使うときも負担が軽いです。細かな仕様の違いで紆余曲折はしたものの、Arduino環境のみでプログラムを完成させることができました。

次は、充電計測の要である電流測定の手段です。最近のスマホなどの充電は2A近い電流を流すことも多いので、大電流でマイコンが壊れないよう注意が必要です。そこで、非接触で電流を測定できるACS712(https://www.switch-science.com/catalog/107/)を使うことにしました。このセンサは、電流が作り出す磁場をホール素子で検出することで間接的に電流を測定します。ただし、磁気を利用する仕組み上ノイズに弱いので対策に追われました。

電流を測っただけでは、様々な機器を充電した際に、何を充電したのかが分かりません。利用者が自ら入力するのでは便利さが半減してしまうので、自動で取得したいところです。幸いにも、USBで接続すると多くの機器は自分の名前やメーカーを教えてくれます。これを利用するには、「USBホストシールド」というArduino向けのボードが必要になります。ESP32でUSBホストを使った前例がほぼなく、かなり苦しむことになってしまいました。

10月中旬の演習スタートから、ESP32や電流センサの動作確認までは2週間程で済んだものの、USBホストのコードを組み込めたのは12月に入ってからとなりました。この間、3種類の製品を試し、最終的に既存のライブラリ(https://github.com/felis/USB_Host_Shield_2.0)を修正してESP32に対応させることで解決しました。このライブラリ、ESP8266には元から対応しており、最初の選定で誤らなければ案外すんなり行っていたかもしれません。作る前に、部品やライブラリの組み合わせに前例があるかしっかり調べておくのは大事ですね。

 

その他、実際の動作に必要な細かい部品を含めて、11月の中間発表ではブレッドボードに回路を組んだ状態で発表しました。ソフトを改良する過程でも回路の修正は何度も発生するので、設計が確実に固まるまでは簡単に組み直せるブレッドボードのままがいいと思います。秋月電子のBタイプ基板(http://akizukidenshi.com/catalog/goods/search.aspx?search=x&keyword=%82a%83%5E%83C%83v)2枚に収まる小規模な回路ですので、ユニバーサル基板へのはんだ付け作業は2日程度で終わりました。

Webアプリ

ハードウェアで詰まりながらも、11月からはWeb側の実装も進めました。JavaScript(JS)が大好きでいつも使っているので、今回もJSメインで実装していきます。まずは、サーバサイドでJSを動かせるNode.jsや、Node.jsと連携が楽なMongoDBを演習用のRaspberry Piサーバに導入。Webサーバ用にExpress、フロントエンドにVue.jsを使用するMEVNスタックで開発しました。フロントエンドがAngularでないのは、単に両方未経験かつVueの方が人気そうだったという程度の理由です。

Webアプリは、ユーザ・SUBACOのハードウェアの両方とやり取りすることになります。まずは、外部からの命令でデータの表示や書き換えを行うAPIから構築しました。データベースが絡むWebアプリを一から作るのは初めてだったので、Googleに頼りながらの作業でした。実際にユーザが操作するフロントエンドは一番最後に駆け足で実装したため心残りの部分も多いです。

感想

当初の計画では、バッテリ残量の低下や充電の終了を検出すると通知が届く機能も付けたかったものの、時間不足のためデータを表示するだけのアプリとなりました。それでも、最低限動くものを出すことができて安心しています。

IoTはここ数年で一気に広まって、ほとんどのアイデアは既に試した先人の方がいるような状況です。今回の「充電を記録するハードウェア」というコンセプトは、調べた限りでは前例がないので取り組んでみました。ただ、バッテリ・端末の他に記録用の機器まで日常的に持ち歩くのは理想とは言えません。モバイルバッテリのメーカーさんから、クラウドで残量を管理できる製品がそのうち出てくるのではと期待していますw

電子工作やWebプログラミングは、ここ最近一気に敷居が下がりました。ライブラリや各種サービスの力を借りれば、素人が3ヶ月頑張れば動作するものができてしまいます(途中で詰まらなければ1ヶ月かも……)。ツールやライブラリで楽できる部分はとことん楽することが、作りたいものに早く到達する秘訣だと思います。

 


発表会ビデオ