コイン電池で動作し、人が近づいたらLEDがレインボーに輝く電飾を作りたいと思います。
人感センサ
人感センサには、電池でも長持ちするように、待機電力が小さいSR602を使います。
SR602について詳しくは、こちらの記事をご覧ください。
このセンサは、人に反応すると、出力ピンがHiになります。
レインボーLED
3Vの電源をつなぐと、赤青緑の光が時間と共に変化し、混ざり合って、様々な色に変化する便利なLEDです。
色の変化はランダムではなく、決まったパターンの繰り返しのようです。
回路を考える
MOS-FETでLEDをドライブ
まず考えられるのが、上記のような回路です。コイン電池CR2032を電源として、SR602に電源を供給します。SR602の出力ピンから取り出せる電流はとても弱く、LEDを直接接続するとセンサが不安定になってしまいます。そのため、センサの出力をMOS-FETに接続し、センサが反応して出力ピンがHiになると、MOS-FETがONしてLEDが点灯するようにします。
MOS-FETではなく、トランジスタを使う方法も考えられますが、トランジスタの場合にはONした時に0.6V程度電圧が低下してしまいます。コイン電池が3Vとすると、LEDの電圧は2.4Vになってしまい、青色のLEDが点灯するには電圧不足となります。MOS-FETの場合、トランジスタのような大きな電圧降下がないので、青色LEDも光ってくれます。
ただこの回路、一つ問題があります。
レインボーに光るLEDは、色が変化するパターンが同じため、4つのLEDが同時にONすると、4つ共に同じような色になってしまいます。それぞれのLEDが、ばらばらな色で光って欲しいのです。
マイコンを使う
そこで、マイコンを使うことを考えます。マイコンで、4つのLEDをONするタイミングを少しずつずらし、同じパターンで光っても、それぞれのLEDの色が異なるようにしようと思います。
プログラムを考える
マイコンには、8ピンDIPパッケージで工作しやすい、AVRマイコンのATtiny13Aを使うことにしました。
このマイコンは、MCUDudeさんが、Arduinoでプログラムできるパッケージを公開してくれています。このパッケージをインストールすることで、Arduino言語で簡単にプログラムを作ることができます。インストール方法など詳しくは、こちらをご覧ください。
このマイコンで実行したい処理は以下の通りです。
- 普段はSleepしていて低消費電流で待機
- INT0ピンがLowになったらプログラムを実行開始
- LEDを200m秒ごとに順番にONする
- 10秒待つ
- LEDを200m秒ごとに順番にOFFする
- Sleepに入る
MCUDudeさんのパッケージを使って、Arduino言語で書くとこうなります。
#include <avr/sleep.h>
#include <avr/interrupt.h>
#define LED1 3
#define LED2 4
#define LED3 0
#define LED4 2
#define Triger 1
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(Triger, INPUT_PULLUP);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void wakeUpNow() {
}
void sleepNow() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
attachInterrupt(0, wakeUpNow, LOW);
sleep_mode();
sleep_disable();
detachInterrupt(0);
}
int delayTime = 200;
int stayTime = 10000;
void loop() {
//turn on
digitalWrite(LED1, HIGH);
delay(delayTime);
digitalWrite(LED2, HIGH);
delay(delayTime);
digitalWrite(LED3, HIGH);
delay(delayTime);
digitalWrite(LED4, HIGH);
delay(stayTime);
//trun off
digitalWrite(LED1, LOW);
delay(delayTime);
digitalWrite(LED2, LOW);
delay(delayTime);
digitalWrite(LED3, LOW);
delay(delayTime);
digitalWrite(LED4, LOW);
sleepNow(); // sleep
}
レジスタ操作を全くせずに、ピン変化割り込みや、Sleepの処理が簡単に書けてしまいます。なんて便利なんでしょう。
動作テスト
人の動きに反応して、LEDがレインボーに光るようになりました。LEDが光っていない時の電流を調べたところ20uAでした。CR2032の容量が200mAh程度なので、かなりの長期間動作できますね。












コメント