フルカラーLED(色設定ユニット)

概要

最近は、各種のフルカラーLEDが市販されています。 フルカラーLEDは、赤(R)緑(G)青(B)の3原色のLEDがパッケージされたもので、各LEDに流す電流を調整することにより、フルカラーの色を表現するものです。

しかし、好みの色になるように電流を調整するのは、結構難しい作業になります。 そこでRGB各々のLEDに流す電流(正確には、PWMのデューティ比率)を、0%~100%まで数値で表示し、調整作業をスムーズに出来るユニットを製作してみました。

今回採用したフルカラーLEDは、OSTA5131A(OptoSupply社)です。 他にも各種市販されているので試してみてください。

<OSTA5131Aの概観>

<OSTA5131Aのピンアサイン>

動作確認

PIC16F88には、CCPモジュールが1個内蔵されていますが、今回は、RGBの3つのLEDを制御するために、 ソフトウエアによる擬似PWM方式を採用しました。

PWMのデューティサイクル
TIMER0の割り込みを使用し、デューティサイクルの最小単位を、128usecとしました。

PWMの周期
最小デューティサイクルの100倍の、12.8msecとしました。

PWMの波形
アノードコモンとカソードコモンの双LEDに、対応するために波形反転モードを実装しました。

つまり、各LEDは、0~100迄のデューティサイクル(比率)が設定できるので、最大1000000色(百万色)の 組み合わせが可能になります。 1000000色=100(R)×100(G)×100(B)

回路図

電流制限抵抗(R1,R2,R3)は、使用するLEDに合わせて変更してください。

ソースコード

//********************************************************************** /* 『ＬＥＤフルカラー』 */ //********************************************************************** #define LED_R PORTA.F0 #define LED_G PORTA.F7 #define LED_B PORTA.F1 #define SW1 PORTA.F5 #define SW2 PORTB.F0 #define ON 0 #define OFF 1 //********************************************************************** static unsigned short pwm_cnt, led_R, led_G, led_B; void interrupt() // 約0.128msec周期 { static short onFlg, offFlg; // INTCON.T0IF = 0; // onFlg = (SW1 == 1) ? 0 : 1; offFlg = (SW1 == 1) ? 1 : 0; // LED_R = (pwm_cnt <= led_R) ? onFlg : offFlg; LED_G = (pwm_cnt <= led_G) ? onFlg : offFlg; LED_B = (pwm_cnt <= led_B) ? onFlg : offFlg; //約12.8msec（78Hz） if (pwm_cnt < 100) pwm_cnt++; else pwm_cnt = 1; } //********************************************************************** void main() { static char buf[10]; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00011100; // Ａ／Ｄ変換を使用する。 TRISA = 0b01111100; TRISB = 0b00000001; //ＬＣＤの初期化 Lcd_Config(&PORTB, 3, 1, 2, 7, 6, 5, 4); Lcd_Cmd(LCD_CURSOR_OFF); Lcd_Cmd(LCD_CLEAR); Lcd_Chr(1, 2, 'R'); Lcd_Chr(1, 6, 'G'); Lcd_Chr(1, 10, 'B'); // TIMER0の設定 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; TMR0 = 0; // pwm_cnt = 1; led_R = 50; led_G = 50; led_B = 50; // 割り込みを許可する。 INTCON.PEIE = 1; INTCON.GIE = 1; // while (1) { led_R = (double)Adc_Read(2) / 10.13; led_G = (double)Adc_Read(3) / 10.13; led_B = (double)Adc_Read(4) / 10.13; // ByteToStr(led_R, buf); Lcd_Out(2, 1, buf); ByteToStr(led_G, buf); Lcd_Out(2, 5, buf); ByteToStr(led_B, buf); Lcd_Out(2, 9, buf); // Delay_ms(10); } }//~! //*********************************************************************

動作確認

左側から、フルカラーLED、色設定用ボリューム、PIC16F88、LCDです。

LEDの光を拡散させるために、ピンポン玉に穴を開けてLEDに被せます。

R=33%、G=50%、B=100%にしてみました。綺麗な色です。

RGBの値を、次の表に示す値で設定してみました。

R	G	B
0%	0%	50%
0%	0%	100%
0%	50%	0%
0%	50%	50%
0%	50%	100%
0%	100%	0%
0%	100%	50%
0%	100%	100%
50%	0%	0%
50%	0%	50%
50%	0%	100%
50%	50%	0%
50%	50%	50%
50%	50%	100%
50%	100%	0%
50%	100%	50%
50%	100%	100%
100%	0%	0%
100%	0%	50%
100%	0%	100%
100%	50%	0%
100%	50%	50%
100%	50%	100%
100%	100%	0%
100%	100%	50%
100%	100%	100%

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細 This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details