M5StickCでできること 〜M5StickCの消費電流値

先日、M5StickC内蔵の加速度センサでM5StickC本体の傾きを測定し、一定時間毎にWebサーバに送信するスケッチをつくりました(記事は こちら)。

その際、スケッチを書き込んだM5StickCは、内蔵バッテリーで駆動させていたのですが、スケッチにはディープスリープを入れており、大部分の時間はスリープしているにも関わらず、2〜3時間で電池がなくなってしまうという問題が生じました。

そこで、バッテリーでの駆動時間をのばすことができるかどうか見極めるため、簡単なスケッチでM5StickCの消費電流値を調査してみることにしました。


調査方法

以下のとおり、M5StickCを電池で駆動し、その際の消費電流値をテスターで測定します。


なお、M5StickCの電源をOFFにしても、内蔵バッテリーへの充電等のために電流消費するため、電源ON時、OFF時の電流値の差を測定しています。
手持ちの2個のM5StickCについて調査しました。

初期状態

初期状態は以下のとおりです。

#include <M5StickC.h>
  
void setup() {
  M5.begin();
}

void loop() {
}

CPUの動作周波数を変更

CPUの動作周波数を240MHzから80MHzに変更しました。
80MHzは、M5StickCで無線通信ができる最低限の速度とのことです。

#include <M5StickC.h>
  
void setup() {
  M5.begin();
  setCpuFrequencyMhz(80);
}

void loop() {
}

LCD画面の明るさを変更

LCD画面の明るさを、文字が読めるギリギリまで暗くしました。

#include <M5StickC.h>
  
void setup() {
  M5.begin();
  setCpuFrequencyMhz(80);
  M5.Axp.ScreenBreath(8);
}

void loop() {
}

ディープスリープ

一定期間毎にディープスリープに入ります。

#include <M5StickC.h>
  
void setup() {
  M5.begin();
  setCpuFrequencyMhz(80);
  M5.Axp.ScreenBreath(8);
}

void loop() {
  delay(5000);

  M5.Axp.ScreenBreath(0);
  esp_sleep_enable_timer_wakeup(10000000);
  esp_deep_sleep_start();
}

Wi-Fi接続

Wi-Fi接続を追加しました。

#include <M5StickC.h>
#include <WiFi.h>

WiFiClient client;

const char* ssid       = "XXXXXXXX";
const char* password   = "XXXXXXXX";

void setup() {
  M5.begin();
  setCpuFrequencyMhz(80);
  M5.Axp.ScreenBreath(8);

  M5.Lcd.setRotation(3);
  WiFi.begin(ssid, password);
  while(WiFi.status()!=WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.print("\r\nWiFi connected\r\nIP address: ");
  M5.Lcd.println(WiFi.localIP());
}

void loop() {
  delay(5000);

  WiFi.disconnect();
  M5.Axp.ScreenBreath(0);
  esp_sleep_enable_timer_wakeup(10000000);
  esp_deep_sleep_start();
}

加速度センサを動作

加速度センサを動作させました。

#include <M5StickC.h>
#include <WiFi.h>

WiFiClient client;

const char* ssid       = "XXXXXXXX";
const char* password   = "XXXXXXXX";

float accX = 0.0f;
float accY = 0.0f;
float accZ = 0.0f;

void setup() {
  M5.begin();
  setCpuFrequencyMhz(80);
  M5.Axp.ScreenBreath(8);
  M5.Imu.Init();

  M5.Lcd.setRotation(3);
  WiFi.begin(ssid, password);
  while(WiFi.status()!=WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.print("\r\nWiFi connected\r\nIP address: ");
  M5.Lcd.println(WiFi.localIP());
}

void loop() {
  M5.IMU.getAccelData(&accX, &accY, &accZ);
  delay(5000);

  WiFi.disconnect();
  M5.Axp.ScreenBreath(0);
  esp_sleep_enable_timer_wakeup(10000000);
  esp_deep_sleep_start();
}

調査結果

調査結果は以下のとおりです。

動作 デバイスA デバイスB
初期状態 77.7 mA 81.3 mA
CPUの動作周波数を変更 50.9 mA 51.7 mA
LCD画面の明るさを変更 28.6 mA 29.4 mA
ディープスリープ(動作時) 22.9 mA 22.3 mA
ディープスリープ(スリープ時) 3.2 mA 2.9 mA
Wi-Fi接続(動作時) 27.6 mA 29.2 mA
Wi-Fi接続(スリープ時) 3.1 mA 2.9 mA
加速度センサを動作(動作時) 39.5 mA 38.4 mA
加速度センサを動作(スリープ時) 14.5 mA 13.4 mA

上記のとおり、 CPUの動作周波数を落とし、LCD画面を暗くすることで、動作時消費電流値を半分以下の30mA程度に低減できています。
また、ディープスリープ時の消費電流値は数mAに収まっています。

一方、加速度センサを動作させることにより、動作時、ディープスリープ時ともに、消費電流値が10mA程度増大しています。
先日作成したスケッチは、これが原因で、ディープスリープさせていても2〜3時間で電池がなくなってしまったと想定されます。

なお、上記の調査においては、M5StickCの電源をOFFにし、M5StickC内蔵バッテリーが満充電されていると思われる時でも、デバイスAで1.8mA、デバイスBで0.5mA程度の電流消費がありました。
実際の消費電流値は、この値も加算する必要があります。

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


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


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

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