Arduinoで赤外線リモコンを受信するまでスリープ状態にさせるテクニック
Sleeps Arduino until infrared remote control is received
赤外線リモコンのボタンを押したときだけArduinoに処理を実行させたいけど、それ以外は何もしないのに延々とループを回して待機させるのは電力の面でやや非効率です。
Arduino向けの著名な赤外線信号処理ライブラリ「IRRemote」はタイマーを使って信号を解析するため、スリープモードからの復帰直後のデータ受信は見逃され、正確な情報は得られることができません。
一方で、IRRemoteの派生プログラム「TinyIRReceiver」はNEC方式の信号かつ8bitのアドレスとコマンドの組み合わせのみと、非常に限られた情報しか取得できませんが、ピン入力からの割り込み処理を迅速に解析できるため、スリープモードに移行している状態からでも入力された内容を調べることができます。
こちらは2番ピンに接続している一般的な赤外線センサーから信号を受け取ったときのみスリープから復帰してデータを取得するサンプルコードです。「TinyIRReceiver.hpp」はIRRemoteライブラリーを導入することで使用できます。
tinyir.ino
#include <Arduino.h>
#include <avr/sleep.h>
#include <avr/power.h>
// Arduino Uno R3なら2,3のみなど、割り込み可能なピンは限られている
#define IR_RECEIVE_PIN 2
#include "TinyIRReceiver.hpp"
void setup()
{
Serial.begin(9800);
initPCIInterruptForTinyReceiver();
Serial.println("TinyReceiver test.");
}
bool enter_sleep = true;
void sleep()
{
// スリープモードに入る
Serial.println("Sleeping");
delay(50);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode(); //sleep_enable();sleep_cpu();sleep_disable();と同義
enter_sleep = false;
}
void loop()
{
if(TinyIRReceiverData.justWritten == true){
printTinyReceiverResultMinimal(&Serial);
delay(100);
TinyIRReceiverData.justWritten = false;
enter_sleep = true;
}
if(enter_sleep == true) sleep();
}
2024/06/16