フルカラーLED(色設定ユニット)
概要
最近は、各種のフルカラーLEDが市販されています。
フルカラーLEDは、赤(R)緑(G)青(B)の3原色のLEDがパッケージされたもので、各LEDに流す電流を調整することにより、フルカラーの色を表現するものです。
しかし、好みの色になるように電流を調整するのは、結構難しい作業になります。
そこでRGB各々のLEDに流す電流(正確には、PWMのデューティ比率)を、0%~100%まで数値で表示し、調整作業をスムーズに出来るユニットを製作してみました。
今回採用したフルカラーLEDは、OSTA5131A(OptoSupply社)です。
他にも各種市販されているので試してみてください。
動作確認
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)
回路図
ソースコード
- LedFullColor.c
//********************************************************************** /* 『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; // A/D変換を使用する。 TRISA = 0b01111100; TRISB = 0b00000001; //LCDの初期化 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% |




























