ESP32の使い方 〜「ESP32-WROOM-32Eマイコンボード」を使ってみる

低電力のIoTデバイスとして「M5Stamp Pico」を活用しています。




「M5Stamp Pico」に搭載されている部品は、ESP32の他には電源レギュレータやLED程度という非常にシンプルな回路構成です。
そのため、特にディープスリープ時の消費電力が非常に小さく、電源のない屋外で、ソーラーパネルやNi-MH電池でIoTデバイスを長期間稼働させたいという用途に適しています。

さて、このようにシンプルな回路構成のマイコンボードであれば、特にM5Stack社の製品にこだわらなくても、他にも選択肢はありそうです。
今回は、秋月電子の「ESP32-WROOM-32Eマイコンボード(K-16108)」という製品を試してみようと思います。

「ESP32-WROOM-32Eマイコンボード」も、搭載されている部品はESP32と電源レギュレータ程度で、「M5Stamp Pico」と同じようなコンセプトの製品です。
価格は税込730円(2022年5月時点)で、「M5Stamp Pico」よりも更に安価です。

プログラムの書き込みには、「M5Stamp Pico」と同様に、USB-シリアル変換モジュールを使う必要があります。
今回は、「M5Stamp Pico」へのプログラム書き込みに使っている「CP2104/CH9102搭載 ESP32ダウンローダキット」で、「ESP32-WROOM-32Eマイコンボード」にもプログラムを書き込むことができるか確認してみようと思います。


両者を以下のように接続します。

ESP32ダウンローダキットESP32-WROOM-32Eマイコンボード
GNDGND
G00
ENEN
TXDRXI
RXDTXO
3.3V3V3

Arduino IDEで「ツール」>「ボード」>「ESP32 Arduino」>「ESP32 Dev Module」を選択し、スケッチを書き込んだところ、問題なく書き込むことができました。本体の押しボタンを押す必要などはありません。

なお、今回書き込んだスケッチは、「GROVE温湿度・気圧センサ(BME280)」で、一定時間毎に温度と湿度を測定し、その値を「Ambient」に送信するものです。


スケッチは以下のとおりです。

#include <WiFi.h>
#include "Ambient.h"
#include "Seeed_BME280.h"

WiFiClient client;
Ambient ambient;
BME280 bme280;

#define SENSOR_VDD 25

const char*  ssid      = "XXXXXXXX";
const char*  password  = "XXXXXXXX";
unsigned int channelId = XXXXX;
const char*  writeKey  = "XXXXXXXX";
unsigned int interval = 30;

void sleepEsp32() {
  Serial.println("### DEEP SLEEP START");
  digitalWrite(SENSOR_VDD, LOW);
  WiFi.disconnect(true);
  esp_sleep_enable_timer_wakeup(interval*1000*1000);
  esp_deep_sleep_start();
}

boolean connect_wifi() {
  Serial.printf("Connecting to %s\n", ssid);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nWiFi connected\n");
  return true;
}

void setup() {
  Serial.begin(115200);

  pinMode(SENSOR_VDD, OUTPUT);
  digitalWrite(SENSOR_VDD, HIGH);
  delay(100);
  if(!bme280.init()) sleepEsp32();
  float temp = bme280.getTemperature();
  float humi = bme280.getHumidity();
  Serial.printf("Temp:%.1f , Humi:%.1f\n", temp, humi);

  if(!connect_wifi()) sleepEsp32();

  ambient.begin(channelId, writeKey, &client);
  ambient.set(1, temp);
  ambient.set(2, humi);
  ambient.send();

  sleepEsp32();
}

void loop() {
}

「GROVE温湿度・気圧センサ(BME280)」と「ESP32-WROOM-32Eマイコンボード」の接続は以下のとおりです。

GROVE温湿度・気圧センサESP32-WROOM-32Eマイコンボード
GNDGND
VCC25
SDA21
SCL22

「ESP32-WROOM-32Eマイコンボード」の「5V」「GND」に単四型Ni-MH電池×4本をつなぐと動作します。

このスケッチで1回の処理(温湿度測定→Wi-Fi接続→Ambientに送信→ディープスリープに移行)を行う際の消費電流値の推移を調査しました。
消費電流値の測定にはM5Stackと「INA226PRC」を使いました(消費電流値の測定方法は こちら)。

結果は以下のとおりです。複数回測定し、波形を重ね合わせました。

ディープスリープ中の電流消費が4mA程度あります。「M5Stamp Pico」の電流消費(0.5mA程度)に比べるとかなり大きな値です。
調べたところ、「ESP32-WROOM-32Eマイコンボード」に搭載されている電源レギュレータ(AZ1117CH)のスタンバイ電流が4mA程度とのことです(ちなみに「M5Stamp Pico」に搭載されている電源レギュレータ「SY8079」のスタンバイ電流は55μA程度とのことです)。

確認のため、「M5Stamp Pico」にも同じスケッチを書き込んでみました。
Arduino IDEで「ツール」>「ボード」>「ESP32 Arduino」>「M5Stack-ATOM」を選択しているので、「GROVE温湿度・気圧センサ(BME280)」と「M5Stamp Pico」の接続は以下のようになります。

GROVE温湿度・気圧センサM5Stamp Pico
GNDGND
VCC25
SDA26
SCL32

消費電流波形は以下のとおりです。

1回の処理に要する時間、および電流消費の推移は「ESP32-WROOM-32Eマイコンボード」と同様ですが、動作時の消費電流値は2/3程度、ディープスリープ時の消費電流値は1/8程度です。

「ESP32-WROOM-32Eマイコンボード」は、特にディープスリープ時の電流消費がかなり大きく、乾電池などでの長期間稼働には向いていないことが分かりました。