先日、「ATOMS3」の使い方を確認しました(記事は こちら)。
M5Stack社のドキュメントページ(こちら)に従って作業を進めることで、問題なく環境構築ができましたので、さっそく一般的なスケッチを書き込んで動かしてみたいと思います。
私は「ATOMS3」をIoTデバイスとして活用したいと考えています。
そのため、まずは以下のような内容のスケッチをつくることにします。
- 「ATOMS3」と「ENV IIIユニット」を接続して使用する。
- 一定時間毎に「ENV IIIユニット」で温度を測定し、その値をWi-Fi経由でWebサーバに送信する。
- 処理が終了したらディープスリープに移行する。
M5Stack用環境センサユニット(ENV III)(Yahoo!ショッピング)
ところで、私は「ATOMS3」を主に電池で動かしたいと考えているため、消費電流値(特にディープスリープ中の)が気になります。
M5Stack社のマイコンデバイスは全般的に、ディープスリープ中でも消費電流値の大きいものが多いと感じています。ディープスリープ中も周辺回路(USB I/Fなど)が動いているのが原因です。
それに対し、「ATOMS3」に搭載されているMCUである「ESP32-S3」には、USB通信機能が内蔵されているようです。「ATOMS3」の具体的な回路図を見つけることはできませんでしたが、もしも「ATOMS3」が「ESP32-S3」でUSB通信をしており、その機能も含めてディープスリープ中には停止するのであれば、ディープスリープ中の消費電流値はとても小さい可能性があります。
そんな訳で、上記のスケッチで「ATOMS3」を動かしている際の消費電流値も測定してみたいと思います。
作成したスケッチは以下のとおりです。
#include <M5AtomS3.h>
#include <WiFi.h>
#include "M5_ENV.h"
SHT3X sht30(0x44, 2);
float val0 = 0.0;
const char* ssid = "XXXXXXXX";
const char* password = "XXXXXXXX";
unsigned long interval = 10; // unit:sec
boolean sendRequest(float val0) {
: 省略
}
void setup() {
M5.begin(true, true, false, false);
Wire.begin(2, 1);
USBSerial.println("### Get temperature data with ENV.III Unit & send request");
esp_sleep_enable_timer_wakeup(interval*1000*1000);
// Get Data
if(sht30.get()!=0) {
USBSerial.println("### ENV III ERROR");
esp_deep_sleep_start();;
}
val0 = sht30.cTemp;
M5.Lcd.clear();
M5.Lcd.setTextDatum(4);
M5.Lcd.drawFloat(val0, 1, M5.Lcd.width()/2, M5.Lcd.height()/2, 7);
// Connect WiFi
USBSerial.printf("Connecting to %s\n", ssid);
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
USBSerial.print(".");
}
USBSerial.printf("\nWiFi connected\n");
// Send Data
if(!sendRequest(val0)) esp_deep_sleep_start();;
USBSerial.println("Send request is finished.");
esp_deep_sleep_start();;
}
void loop() {}
「HUBユニット」を使って「ATOMS3」「ENV IIIユニット」「単3×4本用電池ボックス」の3つをつなぎます。電池ボックスには 単3型Ni-MH電池4本 を入れておきます。
電池ボックスのスイッチをONにすると、一定時間毎に温度をWebサーバに送信します。また、動作中は「ATOMS3」のディスプレイに温度が表示されます。ディープスリープ中は表示が消えます。
所望のとおり動作することが確認できました。
次に、この構成で「ATOMS3」を動かしている時の消費電流値を確認します。
以前、「M5Stack Basic」と「INA226PRC」という電流計モジュールを使ってデバイスの消費電流を測定したことがあります(記事は こちら)ので、その方法を使って測定します。
「電池ボックス」と「HUBユニット」の間に「INA226PRC」と「M5Stack Basic」のセットを挿入し、それらで消費電流値を測定します。
6回測定し、その結果を重ね合わせてグラフ表示してみました。
1回の処理にかかる時間は平均「1.83秒」、その間の消費電流値は平均「68.96mA」でした。またディープスリープ中の消費電流値は平均「0.48mA」でした。
なお、このつなぎ方では、ディープスリープ中も「ENV IIIユニット」へ電源供給されています。
以前調査したところ、「ENV IIIユニット」自体が常時 0.5mA 程度の電流を消費していました。
確認のため、「ATOMS3」から「ENV IIIユニット」を取り外し、スケッチは温度の代わりに乱数データを取得するように変更してみました。
スケッチは以下のとおりです。
#include <M5AtomS3.h>
#include <WiFi.h>
float val0 = 0.0;
const char* ssid = "XXXXXXXX";
const char* password = "XXXXXXXX";
unsigned long interval = 10; // unit:sec
boolean sendRequest(float val0) {
: 省略
}
void setup() {
M5.begin(true, true, false, false);
USBSerial.println("### Get random data & send request");
esp_sleep_enable_timer_wakeup(interval*1000*1000);
// Get Data
val0 = random(0, 1000) / 10.0;
M5.Lcd.clear();
M5.Lcd.setTextDatum(4);
M5.Lcd.drawFloat(val0, 1, M5.Lcd.width()/2, M5.Lcd.height()/2, 7);
// Connect WiFi
USBSerial.printf("Connecting to %s\n", ssid);
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
USBSerial.print(".");
}
USBSerial.printf("\nWiFi connected\n");
// Send Data
if(!sendRequest(val0)) esp_deep_sleep_start();;
USBSerial.println("Send request is finished.");
esp_deep_sleep_start();;
}
void loop() {}
接続は以下のとおりです。
この状態で、先ほどと同様に消費電流波形を採取しました。
1回の処理にかかる時間は平均「1.71秒」、その間の消費電流値は平均「68.27mA」でした。またディープスリープ中の消費電流値は平均「0.05mA」でした。
「ATOMS3」自体のディープスリープ中の消費電流値は非常に小さいことが確認できました。
これだけ低電力であれば、電池駆動のIoTデバイスとして、さまざまな用途に活用できそうです。
なお、「ATOMS3」をディープスリープさせるとUSB通信機能も停止するようです。このため「ATOMS3」にディープスリープするスケッチを書き込んだ後は、スケッチの書き込みができなくなります。
その場合は、本体側面のリセットボタンを側面LEDが緑色に点灯するまで長押し(2秒程度)します。これにより「ATOMS3」はダウンロードモードになり、スケッチ書き込みができるようになるようです。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。