8 minute read

mikroupravljača (13

Next Article
Pogled unatrag

Pogled unatrag

ELEKTRONIKA

Shield-A, učilo za programiranje mikroupravljača (13)

Advertisement

Nastavljamo proučavati višebojne (RGB) svjetleće diode koje u razvojnom sustavu Shield-A nose oznake D8-D11 (Slika 36. iz prošlog nastavka). Razmatrali smo kako povezati njihovih 16 izvoda na optimalan način, a da bi se sačuvala mogućnost nezavisnog upravljanja crvenim, zelenim i plavim čipovima unutar tih dioda sa što manjim brojem izvoda mikroupravljača i ukazati na poteškoće koje pritom nastaju. Kada razvojni sustav Shield-A postavimo na pločicu Arduino Uno, izvodi svjetlećih dioda D8-D11 povežu se s izvodima mikroupravljača ATmega328P kao na shemi sa Slike 39. Prepoznajemo da se radi o spoju koji punu funkcionalnost postiže tek u multipleksiranom načinu rada. Izvodi PB0-PB3 mikroupravljača (8-11 u notaciji Arduino) služe za izbor diode, a PD5-PD7 (5-7 u notaciji Arduino) za izbor boje. Otpornici otpora 560 Ω ograničavaju struju kroz pojedini čip RGB-dioda na oko 6 mA. Ovdje još moramo prodiskutirati izbor vrijednosti tih otpornika. Na prvu bi se reklo, kako za najbolji balans između boja oni trebaju imati iste vrijednosti. Pod balansom smatramo da niti jedna boja nije primjetno većeg intenziteta od ostalih. Nažalost, to nije uvijek slučaj. Prvi je problem u tome što padovi napona na crvenom, zelenom i plavom čipu nisu jednaki: pad napona na crvenom čipu je oko 2 V, na plavom oko 2,8 V, a na zelenom negdje između tih vrijednosti. Zbog toga će, pri naponu napajanja od 5 V, struja kroz crveni čip biti 36% jača od struje kroz plavi čip. Pa čak i da su te struje jednake, postoji i drugi, još veći problem: intenziteti svjetlosti koje kod iste struje emitiraju crveni, zeleni i plavi čip nisu jednaki; kod jeftinih “no-name” RGB-dioda mogu se i jako razlikovati. Zato ćemo optimalne vrijednosti otpornika najbolje odabrati eksperimentalno, pomoću jednostavnog sklopa sa Slike 40. Diode na razvojnom sustavu najčešće ćemo promatrati iz male udaljenosti, pa ne želimo da prejako svijetle. Zato ćemo za početak odabrati za Rr-, Rg- i Rb-otpornike otpora 2,2 kΩ, kod kojih je struja kroz čipove oko 1 mA. Uključimo sve tri sklopke i, ako smo dobili (približno) bijelu svjetlost željenog intenziteta, postigli smo što tražimo. Češći će slučaj biti da je neka boja jače izražena i onda treba povećati otpor njenog otpornika. U mom slučaju, crvena i plava bile su dobro izbalansirane od samog početka, ali je zelena bila toliko intenzivna da sam njen otpornik morao povećati na 11 kΩ! Ovo se ne smije shvatiti kao generalna preporuka, nego se treba malo potruditi oko optimalnog izbora: moramo postići da su sve tri boje, kada ih uključujemo jednu po jednu, “na oko” približno istog intenziteta, da se kombinacijama dviju boja dobiju lijepa narančasta, ljubičasta i modrozelena te da je, kad se uključe sve tri boje, svjetlost što sličnija bijeloj. Kada smo odabrali optimalne vrijednosti otpornika, podijelimo ih s četiri (zbog multipleksiranja srednja vrijednost struje kroz pojedinu diodu je četvrtina maksimalne struje!) i ugradimo na Shield-A. Na originalnoj tiskanoj pločici, Rr ima oznaku R11, Rb = R12, a Rg = R13. U mom konkretnom slučaju, za R11 i R12 odabrao sam otpornike otpora 470 Ω, dok sam za R13 ugradio 2,7 kΩ. Kod drugog tipa RGB-diode zelena boja bila je manje naglašena pa je kod nje optimalna vrijednost “zelenog” otpornika R13 bila 1 kΩ. Vrijedi se potruditi oko izbora vrijednosti ovih otpornika, jer o dobrom balansu boja ovisi konačni doživljaj!

Slika 39. Ovako su izvodi svjetlećih dioda D8-D11 povezani s izvodima mikroupravljača ATmega328P Slika 40. Ovakvom provjerom možemo izabrati optimalne vrijednosti otpornika za RGB-diode

Nakon što smo odabrali i ugradili optimalne otpornike za RGB-diode, napisat ćemo prvi program kojim ćemo ih “oživjeti”. 13. programski zadatak: Na RGB-diodi D8 treba redom upaliti svjetlo crvene, zelene i plave boje, isto ponoviti na D9, D10 i D11 i zatim na sve četiri diode istovremeno. Dodatno, istim redoslijedom treba na diodama upaliti i kombinacije boja: ljubičastu (= crvena + plava), narančastu (= crvena + zelena), modrozelenu (= plava + zelena) i bijelu (= crvena + zelena + plava). Rješenje Bascom-AVR-a (program ShieldA_13a.bas) Najprije ćemo sve pinove mikroupravljača na koje su spojeni izvodi RGB-dioda konfigurirati kao izlazne: Config Portd.5 = Output Config Portd.6 = Output Config Portd.7 = Output Config Portb.0 = Output Config Portb.1 = Output Config Portb.2 = Output Config Portb.3 = Output Podsjetimo se, to smo mogli učiniti i sa samo dvije naredbe: Config Portd = &B11100000 Config Portb = &B00001111 Zatim ćemo sve pinove na koje su spojene katode RGB-dioda postaviti u stanje logičke jedinice: Portb = &B00001111 Ostali pinovi su u stanju logičke nule (standardno, ako ne konfiguriramo drukčije), pa će sve RGB-diode biti inverzno polarizirane i niti jedna neće svijetliti. Efekt je isti, kao da smo priključke ostavili “u zraku”, taj termin smo pojasnili u prethodnom nastavku. Bascom-AVR nudi mogućnost dodjele alternativnih naziva pojedinim dijelovima mikroupravljača, pa ćemo pinove PB0 do PB3 nazvati prema oznakama dioda koje su na njih spojene: Led8 Alias Portb.0 Led9 Alias Portb.1 Led10 Alias Portb.2 Led11 Alias Portb.3 Isto tako, pinove PD5 do PD7 nazvat ćemo prema bojama koje uključuju: Crvena Alias Portd.5 Plava Alias Portd.6 Zelena Alias Portd.7 Ovo nije nužno, ali nam program čini čitljivijim. Boje ćemo mijenjati u potprogramu Boje, smještenom na kraju programa. Najprije ćemo uključiti crveni čip, pričekati jednu sekundu i onda ga isključiti:

Boje: Crvena = 1 Wait 1 Crvena = 0 Isto ćemo ponoviti sa zelenim, a zatim i s plavim čipom: Zelena = 1 Wait 1 Zelena = 0 Plava = 1 Wait 1 Plava = 0 Return Naredba Return vraća nas u glavni program gdje uključujemo jednu po jednu RGB-diodu. Najprije ćemo uključiti diodu D8, pozvati potprogram Boje koji će na njoj “izredati” crvenu, zelenu i plavu boju i odmah zatim isključiti D8: Do Led8 = 0 Gosub Boje Led8 = 1 Isto ćemo ponoviti s diodama D9-D11: Led9 = 0 Gosub Boje Led9 = 1 Led10 = 0 Gosub Boje Led10 = 1 Led11 = 0 Gosub Boje Led11 = 1 Konačno, uključit ćemo sve LED-ice, pozvati Boje i zatim ih isključiti: Portb = Portb And &B11110000 Gosub Boje Portb = Portb Or &B00001111 Loop Kako se glavni program nalazi unutar beskonačne Do-Loop-petlje, ponavljat će se dokle god ne obrišemo program ili dok ne isključimo napajanje. Rješenje Bascom-AVR-a za dodatni zadatak (program Shield-A_13b.bas): Želimo li prikazati kombinacije boja na RGB-diodi, morat ćemo uključiti po dva ili sva tri čipa istovremeno. Drugim riječima, na pinove D7, D6 i D5 trebat ćemo dovesti sve binarne kombinacije od 001 do 111 (isključujemo kombinaciju 000 jer bi tada dioda bila ugašena). Za ovo će nam u potprogramu Boje dostajati samo jedna petlja For-Next: Boje: For Portd = &B00100000 To &B11100000 Step &B00100000 Waitms 500 Next Return Ostatak programa istovjetan je programu Shield-A_13a.bas! Rješenje Arduina (program Shield-A_13a.ino) Kako u programskom jeziku C ne postoji naredba alias, za potrebe jednostavnijeg čitanja programskog koda koristit ćemo varijable sa samoobjašnjavajućim nazivima. Njihova će vrjednost biti broj pina: byte led8 = 8; byte led9 = 9; byte led10 = 10; byte led11 = 11; byte crvena = 5; byte plava = 6; byte zelena = 7; Nakon toga ćemo u funkciji setup() sve pinove mikroupravljača, na koje su spojeni izvodi RGB-dioda, konfigurirati kao izlazne: pinMode(crvena, OUTPUT); pinMode(plava, OUTPUT); pinMode(zelena, OUTPUT); pinMode(led8, OUTPUT); pinMode(led9, OUTPUT); pinMode(led10, OUTPUT); pinMode(led11, OUTPUT); Isto to možemo učiniti i s funkcijama DDRB i DDRD (DDR je kratica od Data Direction Register): DDRB (za registar B, odnosno pinove PB0-PB5) i DDRD (za registar D, odnosno pinove PD0-PD7). Pomoću tih funkcija direktno upravljamo pinovima. Vrijednost 0 označava da je pin konfiguriran kao ulazni pin, a vrijednost 1 označava da je pin konfiguriran kao izlazni pin. Binarni prikaz vrijednosti koji dodjeljujemo registru koristimo zbog jednostavnije vizualizacije konfiguracije koja će biti dodijeljena pojedinom pinu. Na primjer, konfiguraciju pina D0, odnosno PD0 definiramo pomoću funkcije DDRD i krajnjom desnom znamenkom binarnog broja. Također, konfiguraciju pina D7, odnosno PD7 definiramo pomoću funkcije DDRD i krajnjom lijevom znamenkom binarnog broja. DDRD = B11100000;

DDRB = B00001111; Zatim ćemo sve pinove na koje su spojene katode RGB-dioda postaviti u stanje logičke jedinice: digitalWrite(led8, HIGH); digitalWrite(led9, HIGH); digitalWrite(led10, HIGH); digitalWrite(led11, HIGH); Isto to možemo učiniti i s funkcijom PORTB (PORT je oznaka za Port Data Register, a B je oznaka registra): PORTB = B00001111; Pomoću ove funkcije direktno upravljamo stanjem pinova. Vrijednost 0 označava da je pin u stanju logičke nule, a vrijednost 1 označava da je pin u stanju logičke jedinice. Binarni prikaz vrijednosti koji dodjeljujemo registru koristimo zbog jednostavnije vizualizacije vrijednosti koja će biti dodijeljena pojedinom pinu. Na primjer, vrijednost pina D8, odnosno PB0 definiramo pomoću funkcije PORTB i krajnjom desnom znamenkom binarnog broja. Također, konfiguraciju pina D11, odnosno PB3 definiramo pomoću funkcije PORTB i četvrtom znamenkom zdesna ulijevo binarnog broja. Boje ćemo mijenjati u funkciji boje(), smještenoj na kraju programa. Najprije ćemo uključiti crveni čip, pričekati jednu sekundu i onda ga isključiti: void boje(){ digitalWrite(crvena, HIGH); delay(1000); Isto ćemo ponoviti sa zelenim, a zatim i s plavim čipom: digitalWrite(crvena, LOW); digitalWrite(zelena, HIGH); delay(1000); digitalWrite(zelena, LOW); digitalWrite(plava, HIGH); delay(1000); digitalWrite(plava, LOW); } Zatim ćemo u funkciji loop() uključivati jednu po jednu RGB-diodu. Najprije ćemo uključiti diodu D8, pozvati funkciju boje() koja će na njoj “izredati” crvenu, zelenu i plavu boju i odmah zatim isključiti D8: void loop() { digitalWrite(led8, LOW); boje(); digitalWrite(led8, HIGH); Isto ćemo ponoviti s diodama D9-D11: digitalWrite(led9, LOW); boje(); digitalWrite(led9, HIGH); digitalWrite(led10, LOW); boje(); digitalWrite(led10, HIGH); digitalWrite(led11, LOW); boje(); Konačno, uključit ćemo sve LED-ice, pozvati funkciju boje() i zatim ih isključiti: PORTB &= B11110000; boje(); PORTB |= B00001111; } Kako se glavni program nalazi unutar funkcije loop(), ponavljat će se dokle god ne obrišemo program ili dok ne isključimo napajanje. Rješenje Arduina za dodatni zadatak (program Shield-A_13b.ino) Kao i u rešenju s Bascom-AVR-om, napravit ćemo izmjenu samo u funkciji boje() koristeći petlju for, dok će ostatak programa ostati isti. Primijetite da prvo mijenjamo vrijednost varijable i, a zatim vrijednost varijable prosljeđujemo u podatkovni registar porta D pomoću funkcije PORTD. Ovo je preporučeni način rada s registrima zbog lakšeg praćenja programske logike i načina rada funkcije for u odnosu na vrstu varijable. O detaljnim primjerima možda ćemo pisati u zasebnom članku. void boje(){ for (int i = B00100000; i <= B11100000; i += B00100000){ PORTD = i; delay(1000); } } *** Ako pažljivo gledate, primijetit ćete kako je intenzitet svjetlosti pojedine diode slabiji kada su uključene sve četiri diode. To je u skladu s našim očekivanjem, jer ovaj postupak ne koristi postupak multipleksiranja. S njim ćemo se upoznati u sljedećem nastavku! Napomena: Programi Shield-A_13a.bas, Shield-A_13a.ino, Shield-A_13b.bas i ShieldA_13b.ino mogu se besplatno dobiti od uredništva časopisa ABC tehnike. Vladimir Mitrović i Robert Sedak

This article is from: