ESP32 EN(Reset) PINを使用した消費電力化

ESP32の動作検証について

最近、ESP32を本格的に動かす機会が増えたため、実践した部分を備忘として書き出していこうと思います。ESP32が何者かについては、割愛しますので、Wikipedia等の情報をご確認ください。
なお、自身はハードの専門家ではなく電子工作の知識も不十分。「動けばいいな」程度の知識しかなく、検証に使用したESP32もすでに2台がご臨終しました。検証サンプルをマネされる場合は自己責任でお願いします…。

ESP32のスリープモード

今回はESP32を電池やバッテリで駆動させる場合に、可能な限り電力を長持ちさせる「スリープモード」を調べました。
ESP32には、消費電力を抑えるための「スリープモード」が、大きく3種類存在します。

  • Modem-sleep mode :CPUの動作を維持したまま、非通信時にWiFi用のRF回路をオフにして電力をおさえる。WiFiとの接続は維持。
  • Ligth-sleep mode : 通信が行われないときにはWiFi用のRF回路をオフにし、CPUの実行をサスペンド。GPIOなどの入力情報をトリガーに何かを実行するのに向いている。
  • Deep-sleep mode : RTCのみの電源がオンでCPUは停止状態。復旧時に再起動されて、setup()から実行される。一定間隔(タイマー)で何かを実行するのに向いている。

電力消費仕様

上記の消費電力は、公式データシートの、以下の章に記載されています。

ポイントを要約すると、通常(『Active mode』)では 100mA 前後消費(WifiやBLE状況の使用状況に依存)する電力を、『Light-sleep mode』で動作させた場合は 0.8mA(125分の1)、『Deep-sleep mode』で動作させた場合は 0.15mA(666分の1) まで下げることができる、ということ。

サンプルPG

配線図

ソース(ESP32)

void setup() {
  // シリアル出力初期化
  Serial.begin(115200);

  // シリアル出力初期化
  Serial.println("Sleep!!");
  esp_deep_sleep_start();
  Serial.println("Wake?(on setup)"); // ← 出力されない
}

void loop(){
  // ダミー出力
  Serial.println("Wake?(on loop)"); // ← 出力されない
}

ここで照会するサンプルは、次のような動作をする。
リードスイッチは普段ONの(磁石が近づいている)状態が前提である。
このとき、プルアップによりEN(Reset)ピンへの入力はHIGHである。

  • ESP32は起動時にSetup()処理を行い、直後にDeepSleepに移行する。
  • DeepSleep中は、上表のとおり電力消費が最低に抑えられている。
  • リードスイッチが磁石から離れる(スイッチがOFFになる)と、EN(Reset)ピンへの入力がHIGH→LOWに変わる。
  • EN(Reset)ピンへの入力変化により、ハードウェアリセットがかかる。
  • 再度Setup()の処理が実行される。
  • その後、再度DeepSleepに移行する。

基本動作がDeepSleep状態であるため、相当に消費電力を抑えられるはずである。