LoginSignup
4
7

スリープモードによるM5Stackの省電力化

Posted at

はじめに

M5Stackなどのマイコンの省電力化方法はいくつかあります.例えばスリープモードの活用やクロックの最適化,プログラムの最適化などです.今回はそれらの中でも比較的実装しやすいスリープモードの活用について紹介します.

本記事では以下の環境で実行します.
・M5Stack GRAY(ボード選択 → M5Stack-Core2)
・ArduinoIDE

目次

1.はじめに
2.スリープモードの紹介
3.esp_deep_sleep_start()の使用例
3.おわりに

スリープモードの紹介

"ディープスリープ" と "ライトスリープ"

ディープスリープ:本体機能をほぼ停止させることで電力消費を大幅に抑えます.
復帰時に再起動されvoid setup()から実行されます.

ライトスリープ:ディープスリープより電力消費は大きくなりますが,復帰時にスリープした行からプログラムが再開されます.

スリープモードには2種類あり,ディープスリープ(deepSleep)とライトスリープ(lightSleep)が存在します.ここでは,より電力消費を抑えることができるディープスリープについてプログラム例を示します.

また,M5Stackではスリープモードを実行するための関数が2つ(私が確認範囲では)用意されています.以下に例を示します.

1.esp_deep_sleep_start()
void sleep(){
    // スリープ時間を設定
    esp_sleep_enable_timer_wakeup(SLEEP_MIN(time));
    // スリープ開始
    esp_deep_sleep_start();
}
2.M5.Power.deepsleep()
void sleep(){
    // スリープ実行
    M5.Power.deepSleep(SLEEP_MIN(time));
}

2つの関数を比較すると,後者の方では1行で書くことができます.
M5Stackライブラリの中身を見ると M5.Power.deepSleep() 関数内ではesp_sleep_enable_timer_wakeup()esp_deep_sleep_start() を実行していると分かります.さらに,M5.Power.deepSleep() 関数内ではディスプレイのオンオフ(M5.Lcd.setBrightness())まで行っているので,コードを省略できます.

ですが,ここでは esp_deep_sleep_start() を使用した例を掲載します.

esp_deep_sleep_start()の使用例

esp_deep_sleep_start()esp_sleep_enable_timer_wakeup()
とセットで使用します.
esp_sleep_enable_timer_wakeup()により復帰する時間を設定し,esp_deep_sleep_start() によりスリープを開始します.また,電力消費を抑える観点からスリープ時と復帰時には画面をオンオフする必要があるため,それらの記述(M5.Lcd.setBrightness())も必要になります.

esp_deep_sleep_start()の使用例

#include <M5Stack.h>

// スリープ実行関数
void enable_deep_sleep(int time){
    // 画面を消す(スリープに入るだけでは画面は点灯したままになるため)
    M5.Lcd.setBrightness(0); //バックライトの明るさを0(消灯)~255(点灯)で制御
    //スリープ復帰時間を設定
    esp_sleep_enable_timer_wakeup(SLEEP_MIN(time));
    //スリープ開始
    esp_deep_sleep_start();
}

void setup(){
    Serial.begin(115200);
    M5.begin();
    // スリープ復帰時に画面を点灯する
    M5.Lcd.setBrightness(200); //バックライトの明るさを0(消灯)~255(点灯)で制御
}

void loop(){
    M5.update();
    // ボタンAを押したときにスリープを実行する
    if(M5.BtnA.wasPressed()){
        // スリープ開始(1分設定)
        enable_deep_sleep(1);
    }
}

上記の例は,enable_deep_sleep() 関数を作成し,Aボタンを押すとスリープが実行されるプログラムです.また,スリープ前に画面を消灯し,復帰時には点灯するように初期設定としてsetup()で画面の点灯処理を行っています.

おわりに

上記ではディーブスリープの例を掲載しましたが,最後に全スリープのコードも載せておきます.

esp_light_sleep_start() // ライトスリープ
esp_deep_sleep_start() // ディープスリープ

M5.Power.deepSleep() // ライトスリープ
M5.Power.lightSleep() // ディープスリープ

おわり

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7