Trocha matematiky
HSV nebo HSB model
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 | ||||||
bílá | ||||||
červená | ||||||
žlutá | ||||||
zelená | ||||||
světle modrá | ||||||
modrá | ||||||
purpurová | ||||||
červená |
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.
// ------------- 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
- Detailně popsaná HSV do RGB konverze - http://cs.wikipedia.org/wiki/HSV
- Ukázka regulace barev - http://www.youtube.com/watch?v=V9eI2MRgGqU
- Download plošného spoje (Eagle 4.13) - lampicka-eagle.rar
Komentáře
Paralelni spojeni LED
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)
Dialkove ovladanie.
Mohol by mi tu prosim niekto vysvetlit, akym dialkovym ovladacom sa tejto lampicke meni intenzita svetla a farba?
Dakujem
Neco je spatne?
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.
Lampa
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ů.