みなさんこんにちは佐々木です。
LTE-CatM接続で待機電流100uAのIoTボタンを作ってみたので紹介します。ボタンを押すと基地局から得られる情報をもとにおおまかな位置情報をLINEへ通知します。計算上1000mAhのリチウムポリマー電池なら1年以上もつ、はず!ボタンの代わりにセンサーを繋いで定期的に通知するなど応用範囲が広い作例となっています。ぜひご活用ください。
※※注意※※
待機電流を減らすため基板の改造を行っています。改造を推奨するものではありませんが、みなさんの開発の参考になれば幸いです。
どんな基板?
主な材料は次の通り。
- ISP1807搭載Microボード(Pro Microピン互換)
- SARA-R410M LTEモジュールピッチ変換基板
- NTB0104 レベルシフタ ピッチ変換済みモジュール
- タクトスイッチ
- SORACOM Air for セルラー(特定地域向け IoT SIM plan-D)
- リチウムイオンポリマー電池1000mAhまたはリチウムイオン電池900mAh
- リチウムイオンポリマー電池400mAhでも動くとおもいます。
- 小型 汎用プラスチックケース TW5-3-9G
- TW5-3-9Gの販売終了しているみたいなのでTW5-3-9Bのリンクを載せておきます
回路は次のようになっています。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モジュールを改造してレギュレータのオンオフ制御に使っています。
タカチのプラスティックケースに部品を収めるため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通知時の平均電流は約78mAでした(グレー選択部分)。1000mAhのリチウムポリマー電池だと2000回ほどクリックできる計算になります。
開発を始めたころは待機電流数十μAを狙っていたのですがあと一歩及ばずでした。待機時の消費電流のほとんどはISP1807搭載Microボードのレギュレータで消費されていました。レギュレータを交換することも考えたのですがさすがにやり過ぎかなと思ったのでやめました。
以上です。