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に置き換えようかな。