先日、M5StickCを最低動作周波数(10MHz)で常時稼働させ、Wi-Fi通信する時だけ240MHzに上げた時の消費電流値調査を行いました(記事は こちら)。
M5StickCでIoTデバイスをつくり、できるだけ低電力で常時稼働させるのが目的です。
CPUの動作周波数は下げた方が消費電力を低減できますが、Wi-Fi通信を行う場合は80MHz以上でなければならないという制約があります。
そのため、上記のように動作周波数を動的に変化させ、Wi-Fi通信する期間だけは100mA以上、その他の期間は30mA程度で動作させることができることを確認できました。
同様の調査を、ATOM Matrixでも行ってみることにしました。
まずは再確認のため、何の処理もないスケッチをATOM Matrixに書き込み、消費電流値を調査しました。
#include "M5Atom.h"
void setup() {
M5.begin(true, false, true); // Serial, I2C, LED
}
void loop() {
}
この時の消費電流値は 約77mA でした。
次に以下のように、CPU動作周波数を10MHzに落としました。
#include "M5Atom.h"
void setup() {
M5.begin(true, false, true); // Serial, I2C, LED
setCpuFrequencyMhz(10);
}
void loop() {
}
すると、ATOM Matrixの全LEDが、最高輝度で点灯してしまいました。
LEDマトリクスは動作周波数が低い状態では使えないようです。
「M5.begin」でLEDをOFFにしました。
#include "M5Atom.h"
void setup() {
M5.begin(true, false, false); // Serial, I2C, LED
setCpuFrequencyMhz(10);
}
void loop() {
}
消費電流値は 約31mA になりました。
この状態を基準にし、
- ATOM Matrix内蔵の加速度センサで、常時加速度データを採取(動作周波数は10MHz)
- ボタンを押すとWi-Fiに接続し、それまでの採取データの最大値、最小値をAmbientに送信(動作周波数は240MHz)
- 送信が完了したらWi-Fiを切断(動作周波数は10MHz)
という処理を繰り返すスケッチを作成しました。
#include "M5Atom.h"
#include "Ambient.h"
WiFiClient client;
Ambient ambient;
const char* ssid = "XXXXXXXX";
const char* password = "XXXXXXXX";
unsigned int channelId = XXXXX;
const char* writeKey = "XXXXXXXX";
float accX, accY, accZ;
float maxX = -99.9;
float minX = 99.9;
void setup() {
M5.begin(true, false, false); // Serial, I2C, LED
setCpuFrequencyMhz(10);
M5.IMU.Init();
}
void loop() {
M5.update();
M5.IMU.getAccelData(&accX, &accY, &accZ);
if(maxX < accX) {
maxX = accX;
Serial.printf("[X-MAX] %5.2f, [X-MIN] %5.2f\n", maxX, minX);
}
if(minX > accX) {
minX = accX;
Serial.printf("[X-MAX] %5.2f, [X-MIN] %5.2f\n", maxX, minX);
}
if(M5.Btn.wasPressed()) sendData();
}
void sendData() {
setCpuFrequencyMhz(240);
Serial.println("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi CONNECTED");
ambient.begin(channelId, writeKey, &client);
ambient.set(1, maxX);
ambient.set(2, minX);
ambient.send();
maxX = -99.9;
minX = 99.9;
Serial.println("DATA SEND");
WiFi.disconnect(true);
Serial.println("WiFi DISCONNECTED");
setCpuFrequencyMhz(10);
}
動作させた結果、通常は 約30mA、ボタンを押すと一瞬だけ 100mA 以上に増加し、また 30mA 程度に戻ることが確認できました。
また、データがAmbientに問題なく送信できていることも確認できました。
LEDマトリクスが使えないという制限はありますが、ATOM Matrixを普通に使う場合に比べると半分以下の消費電力で、IoTデバイスをつくれることが確認できました。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。