Arduinoのシリアル通信でできる限り電力を減らす

Power saving technique for Arduino serial communication
基本的に電源が入っている間は常にCPUクロックが稼働するArduinoですが、リモコンスケッチのように、外部からシリアル信号を受け取ったときだけ稼働させたいのであれば、待機時はそれなりの無駄が生じます。

と、いうことで、シリアル信号を受け取ったとき以外は常にスリープ状態にするプログラム例をご紹介。
sleep.ino
#include <avr/sleep.h>
#include <avr/power.h>

void sleep()
{
    set_sleep_mode(SLEEP_MODE_IDLE);
    power_all_disable();
    power_usart0_enable();
    sleep_mode();
    power_all_enable();
}

void loop()
{
    Serial.write("ready\n");
    Serial.flush();

    sleep();

    String cmd = Serial.readStringUntil('\n');
    int c = cmd.charAt(0);
   
    if(c == 'i'){
        transferInfrared();
    }else if(c == 'r'){
        receiveInfrared();
    }

    Serial.flush();
}
sleep()を呼び出すと、シリアル通信以外のモジュールをすべて切った後にマイコンはアイドルモードに移行します。アイドル時に受信バッファに何かしらのデータが記録されると復帰し、すべてのモジュールが再び使用できるようになります。あとは記録されたシリアルデータを分析して、適切な処理を実行させます。

これらはAVRマイコンの命令を直に呼び出しているため、ATmegaチップを使っていない互換マイコンでは基本的に動作しません。
2020/06/06