M5Stamp Picoでできること 〜動作周波数変更時の消費電流値

これまで、0.3〜2W程度の小型ソーラーパネルからの電源供給で、「M5Stamp Pico」や「Timer Camera」などのM5デバイスを常時稼働させてきました(記事は こちら や こちら)。
これらはいずれも、温度などのセンサデータや画像データを「一定時間毎」に取得するものです。処理時間以外はディープスリープさせることで平均消費電流値を2〜3mA程度に抑え、小型のソーラーパネルでも常時稼働できるようにしていました。

さて、IoTデバイスの用途によっては、何らかのデータを常時観測し、変化した時に何らかのアクションをさせたいケースがあります。
振動を検知して通知を送ったり、動物の侵入を検知して写真を撮影したりといったものですが、データを常時観測する必要があるため、このような時にはディープスリープを使うことができません。

これまで、このようなディープスリープを使えないケースでは、小型ソーラーパネルでIoTデバイスを常時稼働させることはできないと思い込んでいましたが、はたして本当に無理なのかどうか、少し調べてみることにしました。

ソーラーパネルの発電量について

住宅の屋根に設置するソーラーパネルについてのネット記事などを読むと、ソーラーパネルの出力1kWあたり、年間の発電量を1000kWhとして見積もることが多いようです。
この値を電子工作用の小型ソーラーパネルにそのまま当てはめると、ソーラーパネルの出力が1Wのとき、

  • ソーラーパネルの平均発電電力:1000Wh / (365日 × 24h) = 0.114W
  • 電源電圧5VのIoTデバイスに供給できる平均電流:0.114W / 5V = 22.83mA

となります。

また、別の見積もり方法として、ソーラーパネルの1日当たりの発電量を「ソーラーパネルの出力 × 3.5時間」と計算する方法もあります。
この式で計算すると、ソーラーパネルの出力が1Wのとき、

  • ソーラーパネルの平均発電電力:1W × 3.5h / 24h = 0.146W
  • 電源電圧5VのIoTデバイスに供給できる平均電流:0.146W / 5V = 29.17mA

厳しい方の値を採用すると、出力1Wのソーラーパネルで、平均消費電流値が22.83mA@5VのIoTデバイスをギリギリ常時稼働できることになります。

今回使うことを想定しているのは、こちらのソーラーパネルです。


出力0.5Wで、サイズは 55mm × 70mm です。
これぐらいサイズがコンパクトであれば、ちょっとしたIoTデバイスに気軽に取り付けて使うことができます。

出力が0.5Wなので、IoTデバイスの平均消費電流値を10mA@5V以下に抑えることができれば、何とか常時稼働できる可能性がありそうです。

M5Stamp Picoの消費電流値について

使用するIoTデバイスとしては「M5Stamp Pico」を想定しています。
ESP32以外に搭載されている部品が電源レギュレータとLED程度であり、回路構成が単純で余計な電力消費がないのが選定理由です。




さて、ESP32を普通に使うと、特に何らかの処理を行わなくても常時20〜30mA@5V程度の電流を消費します。これでは目標の10mA以下を達成することはできません。
ディープスリープを使わないとなると、消費電流低減のためにできる手段はESP32の動作周波数を落とすことぐらいです。

そのため、動作周波数を落としたときの消費電流値を測定することにします。

スケッチは以下のような簡単なものです。動作周波数を順番に変更してその都度5秒待つだけのもので、他には何も処理を行っていません。

void setup() {
  Serial.begin(115200);

  setCpuFrequencyMhz(240);
  Serial.println("240MHz");
  delay(5*1000);
  
  setCpuFrequencyMhz(160);
  Serial.println("160MHz");
  delay(5*1000);
  
  setCpuFrequencyMhz(80);
  Serial.println("80MHz");
  delay(5*1000);
  
  setCpuFrequencyMhz(40);
  Serial.println("40MHz");
  delay(5*1000);
  
  setCpuFrequencyMhz(20);
  Serial.println("20MHz");
  delay(5*1000);
  
  setCpuFrequencyMhz(10);
  Serial.println("10MHz");
  delay(5*1000);

  Serial.println("Sleep");
  esp_sleep_enable_timer_wakeup(5*1000*1000);
  esp_deep_sleep_start();
}

void loop() {
}

今回は、ソーラーパネルで発電した電力で単四型Ni-MH電池4本を充電し、そこからM5Stamp Picoに電源供給しようと考えています。
回路構成は以下のとおりです。

そのため、単四型Ni-MH電池4本をM5Stamp Picoの「5V」「GND」端子につなぎ、途中にテスターを入れて消費電流値を測ります。

それぞれの動作周波数のときの消費電流値をテスターで読み取り、グラフ化してみました。

動作周波数が40MHz以下のとき、消費電流値が目標の10mAを下回りました。
ただ、40MHzのときは9.5mAと、ほとんど余裕がありません。プログラムで何らかの処理を行うと、すぐに10mAを超えてしまいそうです。
動作周波数が20MHzのときは7.8mA、10MHzのときは7.0mAでした。このぐらいであれば、所望の処理を行っても平均消費電流値は何とか10mA以下に収まるかもしれません。

基本的にはM5Stamp Picoを動作周波数10MHzで動かしておき、必要なときだけ周波数を上げてWi-Fi通信などの処理を行う、というような使い方で、具体的に検討を進めてみようと思います。

追記

念のため、別の2個(計3個)のM5Stamp Picoについても同様の調査を行い、それらの結果もグラフに重ねてみました。

いずれの個体でも傾向は同じになりましたが、実際の消費電流値には若干の違いがあり、最も結果が悪かった個体では、動作周波数が10MHzのときでも消費電流値は9.6mAでした。
目標の10mAをギリギリ下回ってはいまずが、ほとんど余裕はありません。

この方法をつかって実際にデバイスを稼働させる際には、極力余計な処理を行わないよう気をつける必要がありそうです。


なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。