先日、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シリーズの記事にも興味のある方は「さとやまノート」をご覧ください。