ESP32とESP8266のDeep SleepとLight Sleep


ESP32やESP8266などのマイコンは、WiFiにアクセスできるのだが、消費電力が大きいという欠点がある。 これを常時稼動させておくと、発熱もするし、電池などでの稼動には適さない。 時々、何かをモニタしたり、WiFiに繋いだりするのであれば、それ以外の時には、消費電力を抑えた状態にしておけば良く、そのような機能がある。

最も電力を小さくできるのは、Deep Sleepであり、電池駆動の場合には、これを使うと良い。 これを実行すると、メモリの内容なども消えて、復帰したときには、プログラムは最初からもう一度実行される。 多少電力は消費しても、メモリやレジスタの内容を保持したいときには、Light Sleepを使うと良い。 様々な機能をoffにすることによって、消費電力を抑えるが、復帰した時には、プログラムの続きから実行できる。

ArduinoでESP32のsleepを使うのは、非常に簡単である。 以下のようにヘッダファイルをincludeして、sleepする時間をマイクロ秒単位で指定して、sleepの開始をすれば良い。

#include <esp_sleep.h>
esp_sleep_enable_timer_wakeup(5 * 1000000ULL); //us
esp_light_sleep_start();

Deep Sleepの場合には、開始命令のlightをdeepにすれば良い。 ただし、それ以降の命令は実行されることは無く、setupに戻るのが、Light Sleepとの違いである。

一方、ESP8266では、少し複雑である。 Deep Sleepはプログラムは以下のようにするだけだが、RSTをD0ピンに繋いでおかないと、自動で復帰ができないので、注意が必要である。

ESP.deepSleep(5 * 1000000ULL); //us

また、Light SleepはForce Power Savingという機能を使って実現しているので、設定が少し面倒である。 以下のようにすると、消費電力が小さいLight Sleepが実行できる。

extern "C" {
  #include "user_interface.h"
}
  uint32_t sleep_ms;
  sleep_ms=sleep_s*1000;
  wifi_station_disconnect();
  wifi_set_opmode(NULL_MODE);
  wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
  wifi_fpm_open();
  wifi_fpm_set_wakeup_cb(NULL);
  wifi_fpm_do_sleep(sleep_ms * 1000);
  delay(sleep_ms + 1);
  wifi_fpm_do_wakeup();
  wifi_fpm_close();
  wifi_set_opmode(STATION_MODE);

これらの機能もmruby/cに組込もうと思う。 これで、ESP32やESP8266でmruby/cから使いたいと思っていた機能がほぼそろったことになる。 ESP32ではBlueToothも使えるけど、今のところ使う予定は無いので、まだしばらくは放置で良いかな。 ESP32上のmicropythonで動かしていたプログラムを、mruby/cに置き換えようかな。