待機電流100uAのIoTボタンを作ってみた。

投稿者:

みなさんこんにちは佐々木です。

LTE-CatM接続で待機電流100uAのIoTボタンを作ってみたので紹介します。ボタンを押すと基地局から得られる情報をもとにおおまかな位置情報をLINEへ通知します。計算上1000mAhのリチウムポリマー電池なら1年以上もつ、はず!ボタンの代わりにセンサーを繋いで定期的に通知するなど応用範囲が広い作例となっています。ぜひご活用ください。

ボタンを押すとこんな通知が届く

※※注意※※

待機電流を減らすため基板の改造を行っています。改造を推奨するものではありませんが、みなさんの開発の参考になれば幸いです。

どんな基板?

主な材料は次の通り。

回路は次のようになっています。JP1/JP2はISP1807搭載Microボード、JP3/JP4はレベルシフタ、JP5はSARA-R410 LTEモジュールです。TXD/RXDはレベルシフタを挟んで接続しています。PWR_ON/1V8_OUT/CTS(REG_EN)はSARA-R410 LTEモジュールの電源オンオフ制御に使います。CTS(REG_EN)はSARA-R410 LTEモジュールを改造してレギュレータのオンオフ制御に使っています。

IoTボタンの回路図

タカチのプラスティックケースに部品を収めるためSeeed StudioのPCBサービスを利用しプリント基板を作成しました。基板外形はデータシート記載の推奨基板形状を元にしています。ISP1807搭載Microボードとレベルシフタは基板に直接載せてはんだづけして、SARA-R410M LTEモジュールはピンヘッダを使って浮かせてはんだづけしました。

消費電流を減らすための改造

待機時の消費電流を減らすためいくつか基板の改造を行いました。

ISP1807搭載MicroボードのLEDの電流制限抵抗R7とCEプルダウン抵抗R5の除去しました。LEDの電流制限抵抗で約1mA、CEプルダウン抵抗で約500uAの電流が削減できました。

SARA-R410M LTEモジュールピッチ変換基板のレギュレータ出力をISP1807搭載Microボードから制御するため、レギュレータENのプルアップ抵抗R8を除去、レギュレータENをピンヘッダのCTSに接続、SARA-R410モジュールからピンヘッダのCTSへのラインをカットしました。レギュレータのフィードバック抵抗で消費していた約360uAが削減できました。

スケッチは?

TinyGSM(SARA-R410モジュール制御用ライブラリ)のサンプルコードHttpsClientをベースに以下の変更を加えました。スケッチはここからダウンロードできます。

ボタン入力の監視

タクトスイッチが接続されているD9ピンを1秒周期で監視しています。D9ピンのレベルが20msの間LOWだったらボタンが押されたと判断し位置情報取得・LINE通知処理に進みます。

SARA-R410 LTEモジュールの電源オンオフ制御

待機時、SARA-R410 LTEモジュールの電源オフ状態なので通信する前に電源をオンにします。また通信が終わったら電源オフします。

電源オンする時は、A1(CTS[REG_EN])ピンをHIGHにしSARA-R410 LTEモジュールのレギュレータをオンにした後、D10(PWR_ON)ピンを225ms間LOWにします。A0(1V8_OUT)を監視しSARA-R410 LTEモジュールが起動するのを待ちます。A0(1V8_OUT)の電圧が1.44V以上になったら電源オンしたと判断します。

電源オフ時は、D10(PWR_ON)ピンを2250ms間LOWにし、A0(1V8_OUT)を監視しSARA-R410 LTEモジュールが終了するのを待ちます。A0(1V8_OUT)の電圧が0.54V以下になったら電源オフしたと判断します。A1(CTS[REG_EN])ピンをLOWにしてSARA-R410 LTEモジュールのレギュレータをオフします。

位置情報の取得

ATコマンド+CEREG+UCGEDをつかって次の4つの値を取得します。取得した値をopencellid.orgのAPIを使って緯度・経度に変換します。

  • MCC(モバイルカントリーコード)
    • 運用地域を表す値
  • MNC(モバイルネットワークコード)
    • DoCoMoやSoftbankなど事業者を表す値
  • TAC(トラッキングエリアコード)
    • 地域を表す値
  • CID(セルID)
    • 基地局に割り振られた値

参考:基地局の位置情報を取得できる API を公開しました! - SORACOM公式ブログ

LINE通知

緯度・経度を次のGoogle MapのURLに埋め込みLINE NotifyのAPIを使ってLINEに通知します。

https://maps.google.com/maps?q=xxx,yyy

USB動作停止

逆流防止ダイオードから漏れた電流によりISP1807のUSB回路が動作してしまうのでUSB動作を停止するコードを入れました。そのためArduino IDEからのスケッチ書き込み要求をうけつけなくなっています。スケッチを書き込む時はDFUモード(リセットボタンを2回押す)に入ってから書き込みます。

ビルドに必要なモノ

スケッチのビルドには下記ライブラリが必要です。Arduino IDEのライブラリマネージャでインストールします。

  • TinyGSM
  • ArduinoHttpClient
  • StreamDebugger

LINE通知を行うためにアクセストークンが必要です(LINE Notifyで発行)。アクセストークンは次の変数に設定しています。

// Your LINE Notify Token
const char line_notify_token[] = "";

また基地局の情報を緯度・経度への変換を行うためにはOpenCellid.orgのAPIトークンが必要です(OpenCellid.orgで発行)。APIトークンは次の変数に設定しています。

// Your OpenCellid API Token
const char opencellid_token[] = "";

消費電流は?

Power Profiler Kit II (PPK2)を使って3.7Vを入力した時の消費電流を計測しました。

待機時の10秒間の平均電流は約100uAでした。1秒周期で消費電流が増えているのはタクトスイッチの状態を読み取っているためですね。

LINE通知時

LINE通知時の平均電流は約78mAでした(グレー選択部分)。1000mAhのリチウムポリマー電池だと2000回ほどクリックできる計算になります。

開発を始めたころは待機電流数十μAを狙っていたのですがあと一歩及ばずでした。待機時の消費電流のほとんどはISP1807搭載Microボードのレギュレータで消費されていました。レギュレータを交換することも考えたのですがさすがにやり過ぎかなと思ったのでやめました。

レギュレータのデータシートから抜粋

以上です。