夜の廊下は意外と怖い
夜、電気を点けずに廊下を歩いていると思わぬ方向に歩いて転倒しそうになるのでLEDテープで廊下を照らすことを考えました。
5V USB電源で12V LEDテープを光らせる
LEDテープは暗闇に慣れた目にまぶしくない程度の光に抑える必要があるので、LED調光ドライバを作ることにしました。小型省電力を目指して回路にはATTiny13Aを用い、プログラムにはArduino(bitDuino13)を使いました。電源は汎用品が簡単に手に入るUSB電源を使い、昇圧チョッパー回路で5Vを昇圧して駆動することにしました。クロック19.6MHzを想定しています(1MHzでは正しく動きませんでした。)。
動作原理
動作としてはソフトウエアPWMを使ってパルス電流を作って昇圧チョッパー回路に流し、LEDを光らせます。夜の廊下をうっすら照らせれば十分という考えで作っているので電圧制御や電流制御はかけていませんが、押しボタンスイッチでPWMのデューティ比を変えることで明るさを5段階で調整できるようにしました。
回路中のC1, C2について
C1はスイッチングスピードを上げるための0.1μFセラミックコンデンサで、こういう役割のコンデンサはスピードアップコンデンサと呼ばれています。以前似たような昇圧回路を組んだ時にスピードアップコンデンサがあったほうがトランジスタのスイッチング速度が上がってトランジスタによる熱損失が減って効率が良くなったのでここでもつけています。
C2は電源の安定化のための100μFの電解コンデンサです。
C1, C2はなくても多分動作します。
// コンパイラbitDuino13
// クロック9.6MHzを想定
#define PWM_PIN 0
#define SW_PIN 1
#define COUNTMAX 10
int mode=4;
int swval=LOW;
int preval=LOW;
int pcount=0;
int ncount=0;
void setup() {
// put your setup code here, to run once:
pinMode(PWM_PIN, OUTPUT);
pinMode(SW_PIN, INPUT_PULLUP);
}
void loop() {
digitalWrite(PWM_PIN, 1);
//delayMicroseconds(1);
digitalWrite(PWM_PIN, 0);
read_switch();
wait_for_a_while();
}
void read_switch(){
swval = digitalRead(SW_PIN);
if(swval==LOW){
if(pcount>COUNTMAX){ // チャタリング防止のため一定期間スイッチが押されたままになるのを待つ
if(preval==HIGH){
mode-=1;
if(mode<0){
mode=4;
}
preval=LOW;
}
}
pcount++;
ncount=0;
}else{
pcount=0;
ncount++;
if(ncount>COUNTMAX){ // チャタリング防止のため一定期間スイッチが離されたままになるのを待つ
preval=HIGH;
}
}
}
void wait_for_a_while(){
switch(mode){
case 0:
delayMicroseconds(10);
break;
case 1:
delayMicroseconds(100);
break;
case 2:
delayMicroseconds(1000);
break;
case 3:
delayMicroseconds(5000);
break;
default:
delayMicroseconds(10000);
}
}