コイン電池で動作し、人が近づいたら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程度なので、かなりの長期間動作できますね。
コメント