Jste zde

Relaxační LED lampička s převodem HSV do RGB

Míchání barev s RGB ledkami dnes není vůbec žádný problém. Za pomocí PWM kanálů, které dnes najdeme téměř ve všech procesorech jednoduše namícháme barvu ovlivňováním RGB složek u led. Přímá regulace výkonu RGB kanálů je trochu matoucí, proto je vhodné použít HSV(odstín, sytost, jas) do RGB konverze, která je blízká lidskému vnímání barev. Dále je pak popsaná konstrukce lampičky která konverzi využívá.

Trocha matematiky

HSV nebo HSB model

zkratka
anglický název
český název
Rozsah hodnot
H
hue
odstín
<0,360°>
S
saturation
sytost
<0,1> nebo <0,100%>
V,B
value, brightness
jas
<0,1> nebo <0,100%>

Se zadanými hodnotami odstínu,jasu a sytosti(h,s,v) můžeme vypočítat rgb hodnoty pomocí následujících vztahů:


Grafické zobrazení odstínu a sytosti

Tab č.1 - Výsledky některých zadaných hodnot

barva
H
S
V
R
G
B
bílá
-
0
1
1
1
1
červená
1
1
1
0
0
žlutá
60°
1
1
1
1
0
zelená
120°
1
1
0
1
0
světle modrá
180°
1
1
0
1
1
modrá
240°
1
1
0
0
1
purpurová
300°
1
1
1
0
1
červená
360°
1
1
1
0
0

Konstrukce

Na konstrukci není nic složitého, ze zapojení se dá vypustit i krystal s blokovacími kondenzátory pokud se nastaví interní oscilátor. Celý obvod řídí procesor ATmega8 v smd pouzdru. Ledky jsou zapojeny na PWM kanály procesoru přes tranzistory BC337. Lampička se řídí infračerveným dálkovým ovládáním, k dekódování je použit přijímač SFH5110 připojený na vnější přerušení procesoru. Napájení obvodu je 9V, pokud zvolíme jiné je potřeba přepočítat rezistory R1-R3 z hlediska odporu i výkonu. Navržený plošný spoj umožňuje připojit až 8RGB LED, v mém případě jsou použity jen 4.

Schéma zapojeni

Navržený a osazený plošný spoj

  

Pro zajištění promíchání barev je použita obyčejná krabička od Tic Tacu jednou obmotaná pauzákem a nasazená na ledky. Zvýší se sice útlum světla ale barvy jsou daleko čistější. Plošný spoj je umístěn do lampičky z mléčného skla, infračervený paprsek přes sklo bez problémů projde.

 

Seznam součástek

C1, C2, C3, C8 100nF  
C6 100uF  
C7 10uF  
IC1 7805 nebo 78L05 stabilizátor 5V
IC2 SFH-5110 infračervený demodulátor
IC3 ATmega8-16AU pouzdro TQFP 32
J1 PSH02-02P konektor pro napájení
J2 lámací lišta 2x3pin programování přes SPI
L1   100uH
LED1-LED8 RGB LED 5mm, 4000mcd, 40°, společná anoda
Q1-Q3 BC337  
R1-R3 82R/1W pro 4LED  
  62R/1W pro 6LED  
  39R/1W pro 8LED  
R4-R6 1k SMD1206
R7 100R  
R8 10k  

C4,C5, XTAL1 nemusí být použity pokud se nastaví interní oscilátor.
R1-R3 jsou počítány pro napájecí napětí 9V

Software

Nemá smysl zde uveřejňovat algoritmy pro dekódování dálkového ovládání jelikož tato problematika už byla mnohokrát zveřejněna. Proto jsem se rozhodl uvést zde jen funkce, které přímo ovládají RGB led. Jsou napsány v programovacím jazyku C.

Pro nastavení odstínu, sytosti a jasu slouží funkce HSVtoRGB jak bylo popsáno v úvodu. Funkce ukládá vypočítané hodnoty RGB přímo do komparačních registrů PWM kanálů. Abychom ušetřili místo v datové paměti i výpočetní čas procesoru nebudeme používat reálná čísla, ale celá. Algoritmus výpočtu potom vypadá následovně:

//mozne hodnoty promennych: h = <0,360>  , s = <0,255>, v = <0,255>   
// rgb jsou komparacni registry PWM kanalu
#define r	OCR1A
#define g 	OCR2
#define b   	OCR1B
// --------------------------- konverze HSV do RGB -----------------
void HSVtoRGB(unsigned int h, unsigned char s, unsigned char v )
{
	long q,t,p,f;
	unsigned char i;

	if(s = = 0)  {
	    r = g = b = v;  
	    return;
	}

	 i =  h / 60;
               f =  h % 60;	
	 p =  ((v * (255 - s)) / 255) ;
	 q =  ((v * (15049 - s * f)) / 15049);
	 t =  ((v * (15049 - s * (59 - f))) / 15049);

	switch(i)   {
	   case 0: r = v ;g = t ;b = p ;break;
	   case 1: r = q ;g = v ;b = p ;break;
	   case 2: r = p ;g = v ;b = t ;break;
	   case 3: r = p ;g = q ;b = v ;break;
	   case 4:	r = t ;g = p ;b = v ;break;
	   default:r = v ;g = p ;b = q ;break; 
	}
}

Linearizace jasu

Další užitečnou funkcí která se dá použít je linearizace jasu. Protože lidské oko vnímá intenzitu jasu logaritmicky, linearizaci zajistíme exponenciální funkcí, v našem případě lomenou křivkou podle obrázku.
255 hodnot jasu je rozděleno do čtyř úseků, kde je různá strmost lineárních funkcí.

Počet kroků nastavení jasu se potom sníží z 256 na 32, což zcela postačuje. Pokud do funkce zadáme větší číslo než 31, vrátí hodnotu 255.


Lomená křivka pro linearizaci jasu
// ------------- funkce pro linearizaci jasu -------------
// x = <0,31>

unsigned char linear_value(unsigned char x)
{	
	if(x>31) 
               return 255;

	switch(x/8)   {
	   case 0: x = x*2+2;break;  
	   case 1: x = x*6-26;break; 
	   case 2: x = x*8-56;break;	
	   case 3: x = x*16-241;break; 
	   default: break;
	}
	return x;
}

Příklady nastavení některých barev

#define red		0
#define yellow		60
#define green		120
#define light_blue	180
#define blue		240
#define magenta		300

// cervena, maximalni sytost i jas
HSVtoRGB(red, 255,255);

// cervena, maximalni sytost, mensi jas s funkci “linear_value” 
HSVtoRGB(red, 255, linear_value(20));

// modra, max. sytost, max. jas
HSVtoRGB(blue, 255, linear_value(31));

// modra, polovicni sytost, max. jas
HSVtoRGB(blue, 128, linear_value(50));

Fotky z příkladů nastavení

Závěr

Lampička je vhodná například jako originální dárek pro ženy. Hlavním cílem článku bylo nastínit HSV do RGB konverzi. Kromě nastavování odstínu, sytosti a jasu můžeme naprogramovat i jiné funkce, např. automatické projíždění spektra odstínů, při usínání automatické vypínání za určitý čas, disko efekty atd.

Vhodné by bylo připojit lampičku na sériový kanál PC a naprogramovat aplikaci k jejímu řízení.

Download& Odkazy

Hodnocení článku: 

Komentáře

Nejsem zadny velky expert na paralelni spojovani LED diod, ale ve skole nas ucili, ze je lepsi dat kazde diode vlastni omezovaci odpor a ne ho sdilet pro vsechny...
Kvuli rozdilnym prahovym napetim jednotlivych diod (i kdyz jsou stejneho typu a ze stejne serie)

Mohol by mi tu prosim niekto vysvetlit, akym dialkovym ovladacom sa tejto lampicke meni intenzita svetla a farba?
Dakujem

Ahoj, zkousel nekdo tento obvod sestrojit a fungovalo to?
Ja to zkousel predem na nepajivem poli a nic... nefunguje.
Budu vdecny za jakekoli rady.
Dik.

Zdravim. Omlouvám se, že jsem se neozval dřív. Zdrojáky se teda pokusím zveřejnit. Příloha v hex je nyní naprogramována pro ovladač Sencor na minivěž. Ve zdrojáku potom bude potřeba přepsat délky pulsů z ovladače a jejich kódy. HSV konverze by ale měla jet bez problému po nastavení všech třech PWM kanálů.