見出し画像

M5Stamp TimerPower(電源制御モジュール)で待機電流を100μAオーダーにする方法

(24/6/10修正)
タイトルをμAオーダーから100μAオーダーに変更。関連部修正。

M5Stamp TimerPower(電源制御モジュール)を使用し、待機電流を100μAオーダーに下げる方法をまとめます。また、Wio Extension – RTC(電源制御モジュール)との比較についてもまとめます。


1. 背景と目的

電池駆動型IoTデバイスを自作する上、待機電流をいかに下げるかは、非常に重要な課題です。次の章で詳細を述べますが、待機電流を下げるため電源制御モジュールを採用することは有用な手段の一つです。私はこれまで、「Wio Extension – RTC」という電源制御モジュールを多用してきましたが、秋月電子通商でも在庫限りになっており、どうも生産中止になったようです入手性が悪くなっています(24/6/10修正)。
代替部品を探していましたが、先日、「M5Stamp TimerPower」という電源制御モジュールを見つけたため、この動作確認を行います。

2. なぜ電源制御モジュールが必要か?

電源制御モジュールの必要性は、下記記事にまとめています。よろしければご覧ください。

ここで改めて整理すると、待機電流を下げる方法は、大きく2つあります。

1つ目は、マイコンのdeep sleepモードを用い、待機電流を下げる案です(下図参照)。deep sleep時の待機電流の小ささを売りにしたマイコンも増えてきており、このようなマイコンを採用することが一つの解決策です。ただし、注意点は、マイコンだけでなく、マイコンに接続されたセンサーや通信モジュールにも常時電源電圧が供給されるため、これらの待機電流も考慮してこれらの部品を選定する必要があります。

2つ目は、電源制御モジュールを採用する案です(下図参照)。これにより、スリープ時に電源制御モジュールの二次側への電源供給が停止します。これは大きなメリットです。私は、電池駆動かつ間欠運転のIoTデバイスには、この案を採用しています。

自作でも使いやすい電源制御モジュールとして、「Wio Extension – RTC」を使用してきましたが、生産中止により、「M5Stamp TimerPower」を検討します。

3. プロトタイプの回路図

動作確認のため、モバイルバッテリー(電池)、M5Stamp TimerPower、M5Stamp S3でプロトタイプを組んでみました。M5Stamp S3を使うのは、今回が初めてです。M5StampTimerPowerが M5Stampシリーズであるため、せっかくなのでマイコンもM5Stampシリーズを選んでみました。今回は、通信モジュールやセンサを繋いでいません。通信モジュール接続に関しては次の記事でまとめます。

図. プロトタイプの全体図
図. プロトタイプの部品構成

配線に関しては、
・M5Stamp TimerPowerとM5Stamp S3をI2Cで接続
・5Vの電源を5V INピンとGND品に接続
・HOLDピンをM5Stamp S3の任意のピン(今回は、G9ピン)に接続し
・HOLDピンをスイッチで5V INピンにも接続
としました。公式サイトもご参照ください。

図. プロトタイプの回路図

4. プロトタイプのサンプルコード

M5Stamp TimerPowerの公式サンプルコードから以下を変更しました。
・M5Atomとの接続用コードだったため、M5Stamp S3用に変更
・M5Unified.hを用い、マイコン変更に柔軟に対応
・10秒起動、10秒スリープというシンプルなコードに変更
・バグ取りのため、シリアルプリントを所々に追加

#include <M5Unified.h>
#include <FastLED.h>
#include "M5_I2C_BM8563.h"

#define NUM_LEDS 1
#define DATA_PIN 21
CRGB leds[NUM_LEDS];

#define POWER_HOLD_PIN 9
#define EN_3V3 7

I2C_BM8563 rtc;
const int sleepSeconds = 10;  // スリープ時間の変数

void bat_init() {
  Serial.println("Initializing battery...");
  pinMode(POWER_HOLD_PIN, OUTPUT);
  digitalWrite(POWER_HOLD_PIN, 1);
  pinMode(EN_3V3, OUTPUT);
  digitalWrite(EN_3V3, 1);
  Serial.println("Battery initialized.");
}

void bat_disable_output() {
  Serial.println("Disabling battery output...");
  //    esp_sleep_enable_timer_wakeup(600000000);
  digitalWrite(POWER_HOLD_PIN, 0);
  //    esp_deep_sleep_start();
  Serial.println("Battery output disabled.");
}

void setup() {
  Serial.begin(115200);  // シリアルモニタの初期化
  Serial.println("Setup start.");

  auto cfg = M5.config();

  M5.begin(cfg);  // M5Stamp S3の初期化
  bat_init();     // バッテリの初期化

  FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  fill_solid(leds, NUM_LEDS, CRGB::Red);  // 赤色点灯
  FastLED.show();
  Serial.println("LED initialized and set to red.");
  
  //M5.In_I2C.begin();
  Wire.begin();  // I2Cの初期化
  Serial.println("I2C initialized.");

  if (!rtc.isEnable()) {
    Serial.println("RTC is not enabled. Check the I2C connection and address.");
    return;
  } else {
    Serial.println("RTC is enabled.");
    rtc.WakeAfterSeconds(sleepSeconds);
  }
}

void loop() {
  Serial.println("Loop start.");
  delay(10000);

  // スリープ前にLEDを緑色にする
  fill_solid(leds, NUM_LEDS, CRGB::Green);
  FastLED.show();
  Serial.println("LED set to green. Waiting for 1 second.");
  delay(1000);  // スリープ前の1秒間の遅延

  // スリープ設定
  Serial.println("Entering deep sleep...");
  rtc.WakeAfterSeconds(sleepSeconds);  // RTCを使ってウェイクアップタイマーを設定
  bat_disable_output();
}

5. 待機電流が100μAオーダーに

(24/6/10更新)USBタイプのワットメーターで計測すると、待機電流が0.00000A〜0.00001Aを行き来する結果となりました。ここまで小さい値だと、正しく計測できているかわかりません。

(24/6/10追記)そこで、上記ワットメーター精度の高いテスターで電流値を計測してみました。すると約120μA前後を行き来する値となりました。

2000mAhの単3電池4本(=約5V)で駆動させたとすると、電池持ち時間は、
(2000mAh x 5V) / (0.12mA x 5V) = 10000mWh / 0.6mW =694day
となりました。

ただし、120μAというのは案外大きい電流値だなぁという印象です。1μAオーダーになることを期待していました。もう少し下げる方法があるのでしょうか?

6.「M5Stamp TimerPower」と 「Wio Extension – RTC」の比較

これまで「Wio Extension – RTC」を使用してきたからこそ、「M5Stamp TimerPower」の違いも見えてきましたので、整理します。

Wio Extension – RTCの特徴は、

  • 電源INのUSB microB端子、電源OUTのUSB typeA端子がついており、かつデータ通信もできるため、接続やマイコンへのデータ書き込みが楽

  • I2C端子x2が付いており、これも楽

  • プログラム書き換え時などの使えるスライドスイッチが付いており、これも楽

  • EEPROMが搭載されており、sleep時間を書き込むことができるため、電池交換時も、問題なく再動作する

  • 待機電流値を1μA以下に下げることができる(公式サイト

一方、M5Stamp TimerPowerの特徴は、

  • 小さいのは大きなメリット

  • 電源INと電源OUTの端子を自分でつくる必要があるが、好きな端子にすることができる。例えば、電源INをXH端子、電源OUTをGrove端子にするなど。

  • 基板上に実装しやすいのもメリット

  • HOLDピンを5Vに接続するためのスイッチが無いため、現場採用時は、スイッチを付けたほうが便利

  • 待機電流を120μA程度にすることができる

  • 電池交換時など、電源給電が途絶えると、そのままでは復帰しない。一度、HOLDピンを5Vに接続し、再度sleep時間を書き込む必要がある

と感じました。特に最後の点は重要です。電池交換後にこの動作を実施しないと、間欠運転されなくなります。何か対策はあるのでしょうか。あるいは、私の理解が間違っており、うまくやる方法があるのでしょうか。ご存知の方がいらっしゃれば、情報提供頂くと幸いです。

改めてWio Extension – RTCを用いることで1μA以下になることの凄さを、実感することができました。

7. まとめと今後の課題

M5Stamp TimerPowerをM5Stamp S3と接続し、待機電流を120μA程度まで下げられることを確認できました。電池交換後に再度間欠運転させるためには、HOLDピンを5Vに短絡させる必要があり、注意が必要であることが確認できました。Wio Extension – RTCとの比較も行うことができました。

次回は、M5Stamp CAT-Mモジュールを接続し、SORACOMに接続した場合の動作確認が消費電力調査を行います。

参考

・電池駆動型自作IoTデバイスの肝は待機電流をいかに下げるか、だと思っています。記事内にもリンクを貼りましたが、改めてここでもリンクの貼ります。


この記事が気に入ったらサポートをしてみませんか?