====== 常夜灯(フルカラーLED) ======
===== 概要 =====
秋月電子で大型フルカラーLED(35mA)が安価(200円)で販売していましたので、早速購入し“常夜灯”なるものを作成してみました。
<仕様>
* 暗くなると自動的に点灯すること。点灯する暗さのレベルが調整できること。
* RGB各々のLEDは10段階で明るさが変わること。つまり1000色(10×10×10)に変化できること。
* 音も出せること。これは泥棒避けの為です。
===== 動作原理 =====
暗さの検出は、CDS(Cadmium sulphide cell)を利用しました。
今回は、暗くなると電圧が下がるようにCDSと抵抗を接続しました。
{{:imgpaste:202004:htmikan-20200428-170655.png?500}}
点灯する暗さのレベルは、通常はボリュームを使用して調整するのですが、少し趣向を凝らしてみました。
起動時の暗さを記憶し、それを点灯するレベルとします。
つまり、点灯してほしい暗さで起動してあげればよいことになります。
尚、起動時だけでなくSWを押すことによって、このレベル(その時の暗さ)を再設定することも出来ます。
RGB各々のLEDを10段階の明るさに切り替えることが出来るようにするために、PWM方式を採用しました。
LEDが1個だけであれば、PICが内臓しているPWMモジュールを使用するのですが、今回はRGBと3つのLEDがあるのでこのモジュールは使えません。
そこでタイマー割り込みを駆使して実現してみました。
* タイマー割り込みの周期は、約0.1msec(正確には128μsec)とします。
* LEDの明るさを10段階としましたので、PWMの周期は、1msec(0.1msec×10)とします。
* PWMのデューティサイクル【duty cycle】は、RGBの各LED毎に変えます。(これで明るさが変わります)
* 各LEDのデューティサイクルは、0~9の乱数を発生させ、その値を設定します。
<乱数で0~9を発生させる方法>
* mikroCが提供している関数(rand)は、0~32767を返します。
* これを利用して、0~9を得るには次のようにします。\\ cnt = (((double)rand()) / 32768.0) * 10.0;
音を出すために内臓モジュールのPWMを使用しました。
音の周波数は、500Hz、1KHz、2KHz、4KHz、8KHzと変化(100msec単位)させて見ました。
これはPWMの関数が用意されているのでとても簡単に出来ます。
===== 回路図 =====
{{:imgpaste:202004:htmikan-20200428-170828.png}}
===== ソースコード =====
//**********************************************************************
#define ledR GPIO.F0
#define ledG GPIO.F4
#define ledB GPIO.F5
#define SWITCH GPIO.F3
//**********************************************************************
static unsigned char led_cnt, ledR_cnt, ledG_cnt, ledB_cnt;
void interrupt(){
if (INTCON.T0IF == 1) {
INTCON.T0IF = 0;
GPIO.F1 = ~GPIO.F1;
//
if ((led_cnt <= ledR_cnt) && (ledR_cnt != 0))
ledR = 0;
else
ledR = 1;
//
if ((led_cnt <= ledG_cnt) && (ledG_cnt != 0))
ledG = 0;
else
ledG = 1;
//
if ((led_cnt <= ledB_cnt) && (ledB_cnt != 0))
ledB = 0;
else
ledB = 1;
//
if (led_cnt < 9)
led_cnt++;
else
led_cnt = 0;
}
if (PIR1.TMR1IF == 1) {
PIR1.TMR1IF = 0;
}
}
//**********************************************************************
void Pwm_Change_DutyEx(unsigned int duty_ratio)
{
CCPR1L = duty_ratio >> 2;
CCP1CON.F6 = duty_ratio & 0b00000001;
CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1;
}
//**********************************************************************
void buzzer()
{
Pwm_Init(500);
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Start();
Delay_ms(100);
Pwm_Stop();
//
Pwm_Init(1000);
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Start();
Delay_ms(100);
Pwm_Stop();
//
Pwm_Init(2000);
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Start();
Delay_ms(100);
Pwm_Stop();
//
Pwm_Init(4000);
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Start();
Delay_ms(100);
Pwm_Stop();
//
Pwm_Init(8000);
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Start();
Delay_ms(100);
Pwm_Stop();
}
//**********************************************************************
void main()
{
unsigned char cntR, cntG, cntB;
unsigned int tmp, ref;
OSCCON = 0b01110000; // クロックは8Mhz
CMCON0 = 0b00000111; // コンパレータは使用しない。
ANSEL = 0b00000010; // AN1を使用する。
TRISIO = 0b00001010;
GPIO = 0b00000000;
OPTION_REG = 0b10000000;
//
INTCON.T0IE = 1;
INTCON.T0IF = 0;
OPTION_REG.T0CS = 0;
OPTION_REG.PSA = 1;
OPTION_REG.PS0 = 0;
OPTION_REG.PS1 = 0;
OPTION_REG.PS2 = 0;
//
led_cnt = 0;
ledR_cnt = 0;
ledG_cnt = 0;
ledB_cnt = 0;
//
INTCON.PEIE = 1; // これ以降の処理で割り込みを許可する。
INTCON.GIE = 1; // これ以降の処理で割り込みを許可する。
//
ref = Adc_Read(1);
while (1) {
if (SWITCH == 0) {
ref = Adc_Read(1);
}
if (Adc_Read(1) > ref) {
ledR_cnt = 0;
ledG_cnt = 0;
ledB_cnt = 0;
continue;
}
tmp = rand();
ledR_cnt = (((double)tmp) / 32768.0) * 10.0;
tmp = rand();
ledG_cnt = (((double)tmp) / 32768.0) * 10.0;
tmp = rand();
ledB_cnt = (((double)tmp) / 32768.0) * 10.0;
buzzer();
Delay_ms(1000);
}
}
//**********************************************************************
===== 動作確認 =====
{{:imgpaste:202004:htmikan-20200428-171340.png?500}}
大型フルカラーLED(35mA)です。
LEDに接続している抵抗は、100Ω位が良いのですが今回は330Ωと少し高めです。
{{:imgpaste:202004:htmikan-20200428-171422.png?500}}
PICとCDS周りです。CDSは秋月電子で1個40円で販売しています。
{{:imgpaste:202004:htmikan-20200428-171513.png?500}}
LEDの光の拡散には、ピンポン玉を少し繰り抜いて利用しました。
{{:imgpaste:202004:htmikan-20200428-171537.png?500}}
ピンポン玉をLEDに被せたところです。
{{:imgpaste:202004:htmikan-20200428-171559.png?500}}
LED直では、明るすぎますね。
{{:imgpaste:202004:htmikan-20200428-171622.png?500}}
様々な色に変化します。見ているだけでも楽しいですね。
{{:imgpaste:202004:htmikan-20200428-171649.png}}{{:imgpaste:202004:htmikan-20200428-171655.png}}
{{:imgpaste:202004:htmikan-20200428-171701.png}}{{:imgpaste:202004:htmikan-20200428-171707.png}}
{{:imgpaste:202004:htmikan-20200428-171714.png}}{{:imgpaste:202004:htmikan-20200428-171719.png}}
{{:imgpaste:202004:htmikan-20200428-171732.png}}{{:imgpaste:202004:htmikan-20200428-171738.png}}
{{:imgpaste:202004:htmikan-20200428-171746.png}}{{:imgpaste:202004:htmikan-20200428-171751.png}}
如何ですか?
こんな簡単な仕組みの割には、綺麗に点灯しますね。^_^
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]