Elektrolab
wz




  • Jedeme pod
  • Firefox
  • Chrome
  • Opera

IR ovládání RGB LED pásku

Po dlouhé odstávce jsme se s Martinem rozhodli trochu podpořit web. Postupně zkusíme přidávat vše rozumné, co jsme od posledního článku vytvořili. Já začnu tím nejmenším projektem a to je bezdrátové ovládání RGB LED pásku.

Bude tomu asi dva roky, co jsem narazil na levné LED pásky na portálu Aukro a rozhodl se je vyzkoušet.

LED pásky jsou ohebné DPS vyrobené z kaptonu (s nanesenou vrstvou mědi) a na něm zapájené LED diody s předřadnými rezistory. Ty nastavují jejich pracovní bod, většinou pro napájení 12 V.
Pro zajímavější efekt jsem vybral tříbarevnou verzi. LED pásky se dají koupit i s řídicí jednotkou, ta bývala za příplatek cca 300 - 400 Kč. Má to drobnou nevýhodu - musíte k ní mít ovladač. To sice není přímo špatně, ale když máte ovladač od TV, který většinou nevyužívá všechna tlačítka jimiž disponuje, nebylo by dobré jimi LED pásek ovládat a nemít tak zbytečně 2 ovladače? Navíc si asi každý bastlíř raději jednoduchou jednotku za 100 - 200 Kč vyrobí, než aby si ji za 400 Kč koupil :-) A myslím, že ani tak nejde o ty peníze…


Schéma

Hardware
Jak již bylo řečeno, většina LED pásků má napájení 12 V a navíc RGB má v náš prospěch společnou anodu pro všechny barvy.
Myslím, že princip PWM regulace nemá smysl dlouze rozvádět, není problém si detailně najít tuto problematiku např. pomocí google.com. Tedy jen ve zkratce. PWM regulace má velkou výhodu - malé ztráty. Kdybychom regulovali intenzitu osvětlení LED spojitě, např. pomocí regulovatelného zdroje konstantního proudu, přebytečná energie by se na tranzistorech měnila na teplo. Z toho plyne malá účinnost a přehřívání tranzistorů. PWM reguluje trochu jinak - do LEDek se střídavě spíná napájecí napětí. Pokud stavy vypnuto / zapnuto střídáme dostatečně rychle - v našem případě s frekvencí 10 KHz (mělo by stačit i 60 Hz), lidské oko nepostřehne, že by světlo blikalo a vnímá jen jeho střední hodnotu. Takto je možné (téměř) lineárně regulovat jas diod bez větších ztrát na tranzistorech a bez složitých analogových obvodů - čistě digitálně.
Protože má LED pásek společnou anodu, jednotlivé katody jsou spínány přes MOSFETy IRFZ44 na nulu. Každý ze tří MOSFETů ovládá jednu barvu.
Budící signál pro ně generuje ATmega48. Ta potřebuje 5 V napájení, které obstarává obyčejný stabilizátor LM7805 s menším chladičem (zvládá to i bez chladiče), filtračními a blokovacími kondenzátory. Celé zařízení pak napájí 12 V adaptér. Jeho max. výstupní proud se odvíjí od délky LED pásku, většinou bývá udáván proudový odběr na jednotku délky. Samotný obvod pro jejich ovládání odebírá proud cca do 50 mA, ale je třeba počítat s určitou rezervou. Přibližný uváděný odběr LED pásku + 100 mA. Pokud bude adaptér předimenzovaný tak se samozřejmě nic neděje. Procesor je taktován na frekvenci 16 MHz a má zapojeny jen 4 I/O piny. Tři výstupní pro tranzistory a jeden vstupní pro IR přijímač SFH5110-36.
Tento IR přijímač filtruje a demoduluje záření, které na něj dopadá. Obsahuje optický filtr, který vybírá 940 nm s poměrně úzkou šířkou pásma. Poté je IR signál převeden na elektrický a odfiltruje se signál o frekvenci 36 KHz. Nakonec se signál demoduluje na dvoustavovou inverzní logiku. Příjem signálu = log "0", jinak log "1".


Obrázek

Obrázek

Obrázek

Software
Zaprvé bylo potřeba dekódovat IR signál z ovladače. Jedná se o ovladač Samsung. (Mám vyzkoušeno, že Samsung používá pro všechny TV stejný protokol.) To jsem provedl asi před pěti lety pomocí přípravku s AVR. Do paměti se ukládala log. hodnota a čas, kdy došlo k přerušení vyvolané externě právě výstupem IR přijímače. Data jsem si nahrál do PC, udělal graf a ručně dešifroval, jak je kódována log "1", log "0", startovací a závěrečná sekvence. (To je tak, když nemáte log. analyzátor). Nedávno jsem na internetu našel pdfko od Samsungu, kde je celý protokol popsán. (Btw potěšilo mě, že se na +/-10 µs shodoval s mým dekódováním.) Po napsání algoritmu pro automatické dekódování už bylo snadné přiřadit tlačítkům na které TV nereaguje nějakou funkci. Zde je tabulka s decimálními hodnotami, které odpovídají jednotlivým tlačítkům. V případě zájmu bych byl ochoten napsat verzi pro jiné TV ovladače a tlačítka.

Podrobnější informace k programu
Při zapnutí zařízení se nainicializují následující bloky procesoru:

  • Timer/Counter 0 na PWM mód pro oba kanály, kde kanál (OCR) A řídí střídu pro červenou a B pro zelenou barvu
  • Timer/Counter 2 na PWM mód pouze pro kanál A a ten řídí střídu pro modrou barvu
  • Timer/Counter 1 se nastaví na CTC mód a přerušením s intervalem 10 µs
  • Externí přerušení 0 na každou logickou změnu na vstupu
V přerušení od Timeru 1 se inkrementuje proměnná cas. Na pozadí se při přerušení od INT0 ukládá do pole proměnných hodnota na vstupu, ke kterému je připojené čidlo a zároveň hodnota proměnné cas. Poté se inkrementuje proměnná n, která uchovává počet log. změň.
Jak již bylo řečeno, SFH má inverzní logiku, proto při přerušení, když se jeho hodnota ukládá do pole, se tato hodnota neguje. Přerušení je vyvolané při každé změně log. hodnoty na INT0. Tím dostaneme v poli hodnotu 1 pro vysílání a hodnotu 0 pro nevysílání.
V hlavní smyčce se vykonává mód, který je zrovna zvolen (např. pro manuální mód se přiřadí registrům OCR0A, OCR0B, OCR2A nastavené hodnoty, nebo se pro prolínání inkrementují dané barvy atd). Poté se v hlavní smyčce kontroluje, zdali proměnná cas přesáhla 3000 (30 ms). Ovladač totiž vysílá 20 ms a tato hodnota zajišťuje příjem pouze jednoho příkazu. Pokud ano, data i adresa jsou neplatné. Pokud ne, pole hodnot se prohledá, a zjišťuje se, jestli se v něm nenechází startovací sekvence. Tzn. hodnota 1 po dobu > 4 ms a poté hodnota 0 po dobu 4 - 5 ms (mělo by být 4.5 ms). Pokud ano, do pomocné proměnné se uloží čas, kdy byla start sekvence objevena. Od tohoto času dál se prohledá celé pole.
Protože se log 1 a log 0 liší pouze v době trvání hodnoty 0 v poli (tzn nevysílání) a pole obsahuje střídavě hodnoty 0 a 1, kontroluje se pouze délka každého druhého prvku. Log "1" odpovídá době trvání > 700 µs (1690 µs) a log "0" době < 700 µs (560 µs). Takto se načtou proměnné adresa, adresa2f, data.
Pro odstranění chybných příjmů se data validují tak, že se prohlásí za platné jen když adresa = adresa2 = adresa TV ovladače. Pomocí přepínače switch() se pak vyhodnotí co provést při přijetí danné decimální hodnoty dat.

LED pásek pracuje ve čtyřech základních módech.

Manuální ovládání (mód A)
Inkrementálně se ovládají jednotlivé složky barvy a to s rozlišením cca 5 %. Pomocí šesti tlačítek se přidává / ubírá jas červené, zelené nebo modré, viz obrázek.

Schéma


Prolínání primárních barev RGB (mód B)
Začíná pozvolným rozsvěcením červené, po dosažení plného svitu začne zhasínat a po zhasnutí se začne pozvolna rozsvěcet zelená a tak to jde i pro modrou.

Mód B


Prolínání všech barev (mód C)
Začne se rozsvěcet červená, po dosažení plného svitu se přidává zelená, čímž vznikne žlutá, poté červená začne zhasínat a zůstane zelená, začne se rozsvěcet modrá, vznikne azurová, zelená začne zhasínat, zůstane modrá, začne se rozsvěcet červená, vznikne fialová, začne se rozsvěcet zelená, vznikne bílá, poté všechny barvy zhasnout a cyklus jede znovu.

Mód C


Prolínání všech barev s pauzou na primárních a sekundárních barvách (mód D)
Pro módy B, C, D je možné nastavit rychlost prolínání a pro mód D i dobu zpoždění (přibrždění) na plném svitu barev: R, Y, G, C, B, M, W.

Mód D



Toto zapojení funguje již 2 roky spolehlivě, bez přestávky. Ještě by bylo fajn ho dát do nějaké pěkné krabičky. V dalším článku popíši možnost alternativního ovládání vlastním ovladačem, který umožní ovládat barvy absolutně (ne pouze inkrementálně) a zvládne toho víc než jen ovládat TV a LED pásek.


Program (hex) zde

Vytvořil a otestoval David
18. 3. 2014


V případě jakýchkoliv připomínek nebo dotazů pište zde.