ATOM Matrixでできること 〜Wi-Fi接続時以外のCPU動作周波数を落とす

先日、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の使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


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


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

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