
IoT a robotika 1: Softvérová obsluha LED diód
Tento článok už bol publikovaný na jar a bol a vlastne stále je zamýšľaný ako prvý diel seriálu o softvérovej obsluhe hardvérových komponentov. Potom, keď žiaci a študenti zostali doma a prestali chodiť do krúžkov informatiky a robotiky kde mali k dispozícii hardvérové vybavenie však prišla "spoločenská objednávka" na seriál o programovaní, kde by nabol potrebný žiadny hardvér. Preto sme operatívne zaradili seriál o programovaní Android aplikácií. Potom boli prázdniny a tak seriál bude pokračovať až teraz. Preto znovu uverejňujeme prvý diel a s periodicitou 3 x do týždňa budú pribúdať ďalšie.
Po prečítaní nadpisu sa zrejme pozastavíte nad tým, že v ňom chýba prívlastok „pre začiatočníkov“. Veď čo už môže byť zaujímavé na softvérovej obsluhe LED diód? Pripojíme cez rezistor na pin mikrokontroléra a privedením úrovne HIGH LED diódu rozsvietime a úrovňou LOW diódu zhasneme. Prípadne budeme regulovať jej jas nastavením napäťovej úrovne na analógovom, alebo PWM výstupe. Schválne si to skúste a pokúste sa zmenou napätia dosiahnuť efekt pulzujúcej, čiže plynulo sa rozsvecujúcej a stmievajúcej diódy. Zistíte, že s jednoduchým algoritmom inkrementácie a dekrementácie napäťovej úrovne nepochodíte, pretože LED dióda má exponenciálnu závislosť jasu od napätia.
Ale poďme pekne po poriadku. V konštrukciách s mikrokontrolérmi sa často používajú svietiace, alebo technokraticky presnejšie povedané svetlo emitujúce diódy, známe ako LED (Light-Emitting Diode). Dióda teda pri prechode prúdu emituje svetlo. Má dva vývody – anódu, ktorá sa pripája na kladný pól napájania a katódu, ktorá sa pripája na záporný pól. Na rozlíšenie je vývod anódy dlhší a katóda je označená zbrúsenou plôškou zboku na spodnej strane puzdra. Katóda má u väčšiny LED diód kratší vývod. Pri pozornejšom pohľade do vnútra uvidíte väčšiu a menšiu plôšku. Väčšia plôška je pripojená na katódu.
V praktických zapojeniach budete najčastejšie anódu cez rezistor obmedzujúci prúd pripájať na výstupný port mikrokontroléra a katódu na elektrickú zem. Prúd tečúci LED diódou a taktiež prúd prechádzajúci výstupným pinom by nemal prekročiť 10 – 20 mA, preto sa do série s LED diódou VŽDY pripája obmedzovací odpor. Pre 5 V odporúčame rezistor 330 Ohm, pre 3.3 V rezistor 220 Ohm. Jedinou výnimkou sú LED diódy, ktoré sú už konštruované na napájacie napätie 5V.
V príklade pre populárnu dosku Arduino budeme blikať LED diódou pripojenou na vhodný výstupný port. V zdrojovom kóde pre Arduino je LED dióda pripojená na port 2. Parameter príkazu delay() je v milisekundách. My sme použili dosku Totemduino, ktorá je kompatibilná s Arduino UNO a prepojovacie pole na stojane zo stavebnice totem
Blikanie LED diódou máme zdanlivo vyriešené. Prečo zdanlivo? Ste spokojní s tým, že počas pol sekundových periód vytvorených príkazom delay (500), keď LED dióda svieti, prípadne je zhasnutá mikrokontrolér nerobí NIČ?
V ďalšom príklade ukážeme ako blikať LED diódou bez použitia funkcie delay(). Využijeme funkciu millis() ktorá vracia čas v milisekundách od spustenia programu. Výsledok je vrátený ako dátový typ unsigned long. Táto hodnota sa ukladá ako 4 bajty a maximálna hodnota je 4 294 967 295. Inak povedané k pretečeniu dôjde približne za 49 dní. V nasledujúcom príklade teda pretečenie nebudeme riešiť.
Ako vyriešiť problém s pretečením po 49 dňoch nájdete v článku https://www.baldengineer.com/arduino-how-do-you-reset-millis.html
Regulácia jasu pomocou PWM
PWM znamená Pulse Width Modulation, čiže pulzne – šírková modulácia, ktorá umožňuje meniť výstupné napätie na pine nie analógovo, ale prostredníctvom premenlivej šírky pulzov.
Na výstupe sú impulzy s amplitúdou 5V s premenlivým pomerom medzi časom zapnutia a vypnutia. Ak na PWM výstup pripojíte LED diódu, maximálny jas sa dosiahne ak je na výstupe trvalo hodnota HIGH. Ak má byť hodnota napätia polovičná, pomer impulzov zapnuté/vypnuté je 50: 50. Ak potrebujete štvrtinový jas, pomer zapnuté/vypnute je 25:75 Pri tomto princípe regulácie, ktorá sa mimochodom využíva aj na reguláciu jasu podsvietenia lacnejších monitorov LED diódy nesvietia kontinuálne, ale blikajú mnohokrát za sekundu a čím je doba ich zopnutia kratšia, tým je nižšia intenzita podsvietenia.
PWM na Arduine podporujú len niektoré digitálne výstupy, preto použijeme napríklad výstup D11. Piny podporujúce PWM sú označené vlnovkou
Ukážeme príklad s lineárnym prírastkom, či úbytkom jasu.
Takéto „lineárne“ stmievanie však vizuálne nefunguje príliš dobre. Spočiatku to vyzerá ako rýchle exponenciálne rozjasnenie - veľký skok jasu na začiatku, potom dosť dlho žiadna poznateľná zmena. Závislosť jasu na intenzite LED diódy nie je lineárna, ale exponenciálna, takže vyššie úrovne jasu od seba nerozoznáte. Preto funkcia nastavovania jasu by mala mať logaritmický priebeh. Napríklad
Pre bežné účely stačí použiť funkciu sinus
A znovu tu máme avizovaný problém. Teraz je oneskorenie medzi jednotlivými krokmi stmievania len 5 milisekúnd, takže zvyšok kódu, ktorý by teraz nebol v hlavnej slučke ale vo vnútri cyklu for sa dostane k slovu oveľa častejšie, ale aj tak 5 milisekúnd je pre mikroprocesor dlhá doba, kde by mohol robiť niečo užitočné, prípadne u platforiem, ktoré to umožňujú hlboko spať, aby nespotrebovával energiu. Aj v tomto prípade upravíme program tak aby na určenie času, kedy je potrebné zmeniť hodnotu napätia na LED dióde pomocou PWM využíval funkciu millis().
Blikanie LED v prerušení od časovača
Ešte elegantnejšie je blikať s LED diódou, alebo riadiť jej stmievanie v obsluhe prerušenia od časovača. Takéto riešenie je však závislé na platforme. Ukážeme komplet ako naprogramovať prerušenie od časovača. Mikrokontrolér ATmega328P v Arduine má tri časovače. Na náš účel potrebujeme časovač, ktorý v pravidelných intervaloch vyvolá prerušenie. Využijeme režim časovača CTC (Clear Timer on Compare), ktorý po dosiahnutí hodnoty v registri OCRA vyvolá prerušenie. Využijeme 16 bitový časovač 1, takže register bude mať označenie OCR1A. Budeme ešte pracovať aj s registrami TCCR1A, TCCR1B a TCNT1. Pred nastavením časovača, ktorý vyvolá prerušenie je potrebné zakázať prerušenia a po ukončení nastavenia ich zasa povoliť.
Pri nastavovaní časovača je potrebné najskôr vynulovať registre TCCR1A, TCCR1B a TCNT1. Časovač je riadený frekvenciou a tá je v prípade Arduina UNO 16 MHz. Na naše účely blikania LED v sekundových intervaloch je to však vysoká frekvencia, takže musíme použiť deličky. K dispozícii máme deličky deličky 8, 64, 256 a 1024
Frekvencia mikrokontroléra ATmega328P je 16 MHz. To môže byť pre naše časovanie príliš vysoká hodnota. Preto máme k dispozícii deličky frekvencie. Pre každý časovač sú tieto deličky mierne iné, ale dá sa povedať, že obvykle sú k dispozícii deličky 8, 64, 256 a 1024. Napríklad delička 8 nám zníži základnú frekvenciu zo 16 na 2 MHz.
Vzorec na výpočet frekvencie je OCRA = ftakt / (N x (1 + OCRA)), kde ftakt je taktovacia frekvencia procesora a N je hodnota deličky. Ak chceme dosiahnuť frekvencie 1 Hz tak dosadíme vypočítame rovnicu
16000000 Hz / (1024 x (1 + OCRA)) = 1 Hz
OCRA = 15624
Tu je zdrojový kód. V hlavne slučke môže nerušene bežať váš program
Kód nemusíte písať sami. Na adrese https://www.arduinoslovakia.eu/application/timer-calculator nájdete kalkulačku, ktorá vám na základe zadanej frekvencie procesora a frekvencie, ktorú chcete dosiahnuť vygeneruje rovno kód pre Arduino
Pre naše hodnoty 16 MHz a 1 Hz bude vygenerovaný kód
V budúcom pokračovaní ukážeme obsluhu RGB LED diód a dión Neopixel
Zobrazit Galériu