ボタンを押すと赤外線リモコンのコマンドを一発だけ売ってスリープするガジェットです。別にコマンドは複数でもできますがあえての一発屋です(笑)
CPUは、Arduinoとかで使われている Atmel ATmega328P/ 16MHz / 8bitです。回路もほぼ Arduinoシリーズと同じ。クリスタルはセラロック、USBインターフェースとか動作に不要な余計なものは全部無しです。書き込み機は Arduino Unoでシリアルで書き込みます。ブートローダーも Arduinoのものでこれも Unoから書き込みます。
電源は、みんな大好き 18650リチウムイオン電池で 3.7Vから 5Vに昇圧モジュールを使ってあげています。このモジュールは無負荷時に、0.1mA程度を消費します。(モジュール上のLEDは外しました)
プログラムは、IRremote ライブラリの読み込みと書き込みを流用。
読み込みは、シリアル端末にでデータを書き出す必要があるので、普通の Arduino nanoを使用。
IR送出には余計な周辺は不要なので、 生 ATmega328P と最低限必要な部品を使います。
低消費電力になる部分は、ChatGPTに聞きました。(笑)ほんと便利だわ。
復帰は、単純にリセット入力です。

配線はやっつけなので汚いなあ。
#include <avr/sleep.h>
#include <avr/power.h>
#include <IRremote.h>
unsigned int rawData[] = {
8900, 4450, 550, 600, 550, 1700, 500, 600, 500, 1700, 550, 1700, 500, 1700, 550, 550, 550, 600,
,,,ここに送りたいIRコマンド(irreadで読み取ったもの)
};
unsigned int rawDataLength = sizeof(rawData) / sizeof(rawData[0]);
IRsend irsend;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
irsend.sendRaw(rawData, rawDataLength, 38); // 38kHzで送信
delay(200);
irsend.sendRaw(rawData, rawDataLength, 38); // 38kHzで送信
delay(800);
digitalWrite(LED_BUILTIN, LOW);
// スリープ前の準備
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // 最低消費電力モード
noInterrupts(); // 割り込み無効
sleep_enable(); // スリープ許可
// すべての周辺機能を停止
ADCSRA &= ~(1 << ADEN); // ADC停止
power_all_disable(); // 全周辺(ADC, Timer, SPI, TWI, etc.)停止
// BOD(ブラウンアウト検出)も無効化してさらに省電力化
MCUCR |= (1 << BODS) | (1 << BODSE);
MCUCR = (MCUCR & ~(1 << BODSE)) | (1 << BODS);
interrupts(); // 割り込み再開(※ここで有効にしないとsleep_cpuで止まらない場合あり)
sleep_cpu(); // スリープ突入
}
void loop() {
}で、消費電流ですがスリープ時、3.7Vで 0.1mA以下といったところで、今のところ3週間くらいは電池で動いています。
ケースは、電池ボックス含めて 3Dプリンターで作製しました。



コメント
ワンアクションなら、電源スイッチ自体をボタンにすれば、待機電力の問題は無くなりますね。
一般のリモコンもそういう作りが多いと思います。
その案もあったんですが、オン状態を一定時間確保しないといけないのと CPUのスリープを使ってみたかったという事もありあえて今回の方法に。
とりあえず、1ヶ月は電池持っています
3か月たちました。毎日使っていますがまだ電池持っていますね。