フルカラー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に合わせて変更してください。

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%





著作権表示 copyright notice

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details
  • elechobby/picdic/pic16f88/124.txt
  • 最終更新: 2025/10/17 14:29
  • by 127.0.0.1