先日、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(mA) | デバイスB(mA) |
---|---|---|
初期状態 | 77.7 | 81.3 |
CPUの動作周波数を変更 | 50.9 | 51.7 |
LCD画面の明るさを変更 | 28.6 | 29.4 |
ディープスリープ(動作時) | 22.9 | 22.3 |
ディープスリープ(スリープ時) | 3.2 | 2.9 |
Wi-Fi接続(動作時) | 27.6 | 29.2 |
Wi-Fi接続(スリープ時) | 3.1 | 2.9 |
加速度センサを動作(動作時) | 39.5 | 38.4 |
加速度センサを動作(スリープ時) | 14.5 | 13.4 |
上記のとおり、 CPUの動作周波数を落とし、LCD画面を暗くすることで、動作時消費電流値を半分以下の30mA程度に低減できています。
また、ディープスリープ時の消費電流値は数mAに収まっています。
一方、加速度センサを動作させることにより、動作時、ディープスリープ時ともに、消費電流値が10mA程度増大しています。
先日作成したスケッチは、これが原因で、ディープスリープさせていても2〜3時間で電池がなくなってしまったと想定されます。
なお、上記の調査においては、M5StickCの電源をOFFにし、M5StickC内蔵バッテリーが満充電されていると思われる時でも、デバイスAで1.8mA、デバイスBで0.5mA程度の電流消費がありました。
実際の消費電流値は、この値も加算する必要があります。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。