Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2018_268_53
V preteklem delu smo opisali svetlobno igračko; če ste medtem nabavili potrebne komponente in izdelali svoj primerek svetlobne igračke, je zdaj čas, da se naučimo, kako jo oživeti. Za to je potrebno znati programirati mikrokontroler ATtiny2313 ali ATtiny4313 (IC1 na sliki 3), ki krmili z njenim delom. Programirali ga bomo v programskem jeziku Bascom-AVR.
Ta vsebina je samo za naročnike
Program KR_2017_svetilo_1.bas
S prvim programom želimo preveriti, ali je svetlobna igračka dobro spojena: vklapljali bomo po vrsti vse kombinacije barv na vsaki od LEDic. Najprej moramo pravilno konfigurirati priključke mikrokontrolerja:
Config Portd = &B01111000 Config Portb = &B00000111
S tema dvema ukazoma se bodo vsi priključki, na katere so spojene LEDice konfigurirali kot izhodni (“1”), medtem ko bodo preostali priključki ostali kot vhodni (“0”). Barve bomo menjali v podprogramu Zasveti, s spremembo vsebine spremenljivke Barva v razponu od 0 do 7:
Zasveti: For Barva = 0 To 7
Desetiške vrednosti v razponu 0 do 7 v binarnem številčnem sistemu ustrezajo vrednostim od 000 do 111, vsako od teh binarnih števil (bitov) krmili eno barvo: prva (leva) številka ustreza zeleni, druga modri in tretja rdeči. Nam je bolj naravno sklepati, da “1” vključuje neko barvo in da “0” jo izključuje, vendar samo vezje deluje ravno obrnjeno. Zaradi tega se bodo vrednosti iz spremenljivke Barva med prenosom na priključke PB morale komplementirati (spremeniti “0” v “1” in obratno). Nato bomo pustili, da LEDica sveti z izbrano barvo pol sekunde in končali podprogram:
Portb = Not Barva Waitms 500 Next Return
Povezanost med spremenljivko Barva, stanjem priključkov mikrokontrolerja in barve s katero sveti LEDica prikazuje Tabela 1.
Barva | Barva binarno | PB2 | PB1 | PB0 | LED |
0 | 00000000 | 1 | 1 | 1 | ugasnjena |
1 | 00000001 | 1 | 1 | 0 | rdeča |
2 | 00000010 | 1 | 0 | 1 | modra |
3 | 00000011 | 1 | 0 | 0 | vijolična |
4 | 00000100 | 0 | 1 | 1 | zelena |
5 | 00000101 | 0 | 1 | 0 | rumena |
6 | 00000110 | 0 | 0 | 1 | modrozelena |
7 | 00000111 | 0 | 0 | 0 | bela |
Tabela 1: Povezanost med spremenljivko Barva, priključki PB2-PB0 in barvo s katero sveti LEDica
Opomba: barve svetenja LEDice navedene v Tabeli 1 in drugod v tekstu ustrezajo LEDicam, katerih razpored priključkov je tak, kot na slikah 3 in 8. V prodaji so tudi LEDice z drugačnim razporedom barv po priključkih; če uporabljate takšne LEDice, dioda ne bo svetila tako, kot smo napisali, princip delovanja pa bo enak!
V glavnem programu vključujemo eno po eno LEDico s spremembo vrednosti spremenljivke Pin v razponu od 3 do 6 (anode LEDic D1-D4 so spojene na PD3-PD6!) in nato kličemo prej opisani podprogram Zasveti, ki bo na izbrani LEDici “prikažemo” vse barve:
Do For Pin = 3 To 6 Portd.pin = 1 Gosub Zasveti Portd.pin = 0 Next
Svetila bo samo tista LEDica, pri kateri je PD priključek trenutno v stanju “1”. Na koncu s postavljanjem vseh štirih PD priključkov v stanje “1”, sočasno vključujemo vse štiri LEDice in ponovno s klicanjem podprograma Zasveti na njih “prikažemo” vse barve:
Portd = &B01111000 Gosub Zasveti Portd = &B00000000 Loop
Tukaj smo analizirali samo najvažnejše dele programa; celoten program lahko brezplačno dobite v uredništvu revije Svet elektronike. Ko ga vpišete v Bascom-AVR, ga je potrebno prevesti in prenesti v mikrokontroler s pomočjo ustreznega programatorja. Na ploščici svetlobne igračke je predviden konektor za priključitev USBasp programatorja, podobnega tistemu na sliki 9.
V isti konektor je možno povezati tudi druge programatorje, ki imajo enak razpored priključkov, npr. STK200/300/500. Če uporabljate Proggy II bo potrebno napraviti enostaven adapter, kot je prikazan na sliki 10.
Če bodo po programiranju mikrokontrolerja LEDice pričele svetiti kot je bilo opisano, bo to potrditev, da je svetlobna igračka pravilno napravljena! Če ne, poiščite napake v povezovanju komponent, spajkanju ali pač v programu…
Če pazljivo opazujete LEDice med izvajanjem programa boste ugotovili, da je svetilnost posamezne LEDice slabša, kadar so vključene vse štiri LEDice kot takrat, ko je vključena samo ena. Pojav je lahko pojasniti s pomočjo sheme na spodnjem delu slike 8. Predpostavimo najprej, da so PB0 = “0” in PD3 = “1”, medtem ko so vsi ostali PD priključki enaki “0”, vsi ostali PB priključki pa “1”; v tem primeru bo tok tekel samo preko rdečega segmenta LEDice D1 in le-ta bo zasvetila z neko svetilnostjo. Velikost toka določa upornost upora R5. Če sedaj postavimo tudi PD4 v stanje “1”, bo zasvetil tudi rdeč segment LEDice D2. Preko vsake od LEDic bo teklo pol toka, ki teče preko upora R5 in ker se jakost toka ni spremenila, bosta LEDici svetili slabše. Zmanjšanje intenzivnosti svetilnosti posamezne LEDice je toliko bolj vidno, kolikor več diod “iz iste vrste” je sočasno vključenih.
To bi lahko bila resna pomanjkljivost vezja s slike 8, če mu ne bi mogli pomagati. Pravzaprav kadar so LEDice povezane na način, prikazan na sliki 8 (in v naši svetlobni igrački!), nikoli ne smemo sočasno postaviti v stanje “1” več od enega PD priključka. Če pa želimo, da sočasno zasveti več LEDic iz iste vrste, uporabimo tehniko multipleksiranja, v kateri se pozitivne napetosti LEDic vključujejo ena za drugo. Čisto tehnično rečeno, zaradi tega te diode niti ne bodo svetile sočasno ampak ena za drugo ali, ker je vrstni red vklapljanja dovolj hiter, naše oči ne bodo videle utripanja, ampak se bo videlo, da LEDice svetijo kontinuirano in sočasno.
Program KR_2017_svetilo_2
Program ki smo ga ravnokar analizirali je enostaven, vendar ni ravno korektno napisan, ker ne uporablja tehnike multipleksiranja. Če jo želimo uporabiti, moramo najprej zakomplicirati podprogram Zasveti. Potrebovali bomo štiri spremenljivke, Barva(1)-Barva(4), ki bodo definirale barvo vsake LEDice posebej. Vsebino teh spremenljivk bomo eno za drugo postavljali na PB priključke in pri tem pazili, kateri PD priključek bomo vklopili:
Zasveti: ... Portb = Not Barva(1) Portd.3 = 1 Waitms 1 Portd.3 = 0
S tem smo LEDico D1 vklopili za čas trajanja 1 ms in na njej smo vklopili segmente po vsebini spremenljivke Barva(1). Sedaj isto ponavljamo z drugo LEDico:
Portb = Not Barva(2) Portd.4 = 1 Waitms 1 Portd.4 = 0 ... Return
in nato po vrsti še ostali dve. Celoten ciklus traja okoli 4 ms. Če želimo, da se postavljena kombinacija barv zadrži pol sekunde, kot v prvem primeru, je podprogram potrebno ponoviti 125-krat. Zaradi tega ukaze podprograma dajemo v zanko, ki bo to zagotovila:
Zasveti: For Brojac = 1 To 125 xxx Next Return
Na mestu označenem z “xxx” pridejo prej opisani ukazi podprograma. Da bi program delal kot prej, bomo v glavni programski zanki najprej na vsaki LEDici “izpisali” vse barve:
Do ... For Led = 1 To 4 For Barva(led) = 0 To 7 Gosub Zasveti Next Barva(led) = 0 Next
in nato bomo to isto sočasno napravili na vseh štirih LEDicah:
For Barva(1) = 0 To 7 Barva(2) = Barva(1) Barva(3) = Barva(1) Barva(4) = Barva(1) Gosub Zasveti Next Loop
Programirajte svetlobno igračko s tako zamenjanim programom: sedaj ni več razlike v intenziteti svetilnosti posamezne LEDice, brez obzira če ona sveti sama ali sočasno z isto barvo sveti več LEDic.
Pazljivi bralec bo opazil, da v tem primeru posamezna LEDica sveti samo 1/4 časa medtem, ko je “vklopljena”. Zaradi tega bo tudi intenzivnost svetilnosti s katero sveti manjša kot če bi bila stalno vključena. To je posledica postopka multipleksiranja, zmanjšanje intenzivnosti kompenziramo z zmanjšanjem vrednosti upornosti upora, ki določa tok skozi LEDice. V svetlobni igrački (slika 3), vrednost uporov R5-R7 je z optimalnih 1-1,5 kΩ zmanjšana na 470 Ω in zato LEDice svetijo s polno intenzivnostjo tudi med multipleksiranjem.
Program KR_2017_svetilo_3
Z malo modifikacijo tega programa bomo dosegli zanimiv svetlobni učinek, light-show. Namesto kontroliranega generiranja barv za LEDice, bomo barve določali slučajno. Za to nam bo dobro služil ukaz Rnd(7), ki generira naključno število v razponu od 0 do 6 in ga pridružuje spremenljivkam Barva(1)-Barva(4). Ker so nam za krmiljenje z barvo LEDic potrebne vrednosti med 1 in 7 (0 izklopi LEDico in je zato tukaj ne bomo uporabljali), dobljeno vrednost bomo povečati za 1:
Do Barva(1) = Rnd(7) Incr Barva(1)
Isto bomo ponovili za preostale tri LEDice in nato vključili naključno generirane barve s klicem podprograma Zasveti:
Barva(2) = Rnd(7) Incr Barva(2) Barva(3) = Rnd(7) Incr Barva(3) Barva(4) = Rnd(7) Incr Barva(4) Gosub Zasveti Loop
Podprogram Zasveti je isti kot prej; edina razlika je v tem, ker smo zmanjšali obseg vrednosti števca v For…Next zanki in s tem pohitrili izmenjavo barv.
Program KR_2017_svetilo_4
Šolo programiranja svetlobne igračke bomo zaključili s primerom, v katerem se vsaka od 7 števil “seli” z ene LEDice na naslednjo, pri čemer se intenzivnost izbrane barve na vsaki LEDici postopno povečuje do maksimuma in se nato postopno izklopi. Če sedaj v vsakem trenutku sveti samo ena LEDica, multipleksiranje ne bo potrebno.
Postopek generiranja barv n “selitev” svetilnosti z ene na drugo LEDico se odvija v glavni zanki:
Do For Barva = 1 To 7 Portb = Not Barva For Pin = 3 To 6 Gosub Zasveti Next Next Loop
Vsaka posamezna barva na vsaki od LEDic se nasledi v podprogramu Zasveti, ki je zadolžen za postopno “vklapljanje” in “izklapljanje”. Za to bomo potrebovali dve spremenljivki, Time_on in Time_off. Kakor njuno ime sugerira, prva določa koliko dolgo bo LEDica vklopljena, druga pa koliko dolgo bo izklopljena. V obeh primerih je govora o milisekundah, zato se posamezni vklopi in izklopi ne bodo mogli videti – namesto tega bo razmerje Time_on : Time_off določalo intenzivnost svetilnosti LEDic. V prvem delu podprograma trajanje stanja “vklopljeno” postopno povečujemo od 0 do 15 ms in sočasno zmanjšujemo trajanje stanja “izklopljeno” od 15 do 0 ms:
Zasveti: For Time_on = 0 To 15 Time_off = 15 - Time_on For I = 1 To 2 Portd.pin = 1 Waitms Time_on Portd.pin = 0 Waitms Time_off Next Next
Zunanja For Time_on…Next zanka bo rezultirala postopnim povečevanjem intenzivnosti svetilnosti izbrane barve na izbrani LEDici. Poizkus je pokazal, da je vsako novo kombinacijo vrednosti potrebno “zavrteti” najmanj dvakrat, da bi postala vidna; teme služi notranja For I…Next zanka.
V drugem delu podprograma zmanjšujemo trajanje stanja “vklopljeno” od 15 do 0 ms, in sočasno povečujemo trajanje stanja “izklopljeno”:
For Time_on = 15 To 0 Step -1 Time_off = 15 - Time_on For I = 1 To 2 Portd.pin = 1 Waitms Time_on Portd.pin = 0 Waitms Time_off Next Next Return
Rezultat bo postopno zmanjševanje jakosti svetilnosti izbrane barve na izbran LEDici.
S tem niso izključene vse možnosti, ki jih omogoča svetlobna igračka. Kot vedno, to kar se lahko potegne iz neke naprave je največ odvisno od domišljije programerja…
Ostali smo še dolžni pojasniti, kako prilagoditi programe, če želite uporabljati RGB LEDice s skupno katodo. Posamezno diodo sedaj vključujemo tako, da na priključke porta D postavljamo logično “0”, sočasno pa moramo na priključke porta B postaviti logično “1”. To bo zahtevalo spremembe v programu zaobjete v Tabeli 2.
postopek | skupna anoda | skupna katoda |
vklop LEDic | Portd.pin = 1 ili
Portd.3 = 1 |
Portd.pin = 0 ili
Portd.3 = 0 |
izklop LEDic | Portd.pin = 0 ili
Portd.3 = 0 |
Portd.pin = 1 ili
Portd.3 = 1 |
Vklop posameznih barv | Portb = Not Barva | Portb = Barva |
Tabela 2: Primerjava programskih ukazov pri RGB LEDici s skupno anodo in s skupno katodo
Vse programe o katerih smo govorili v tem nadaljevanju lahko brezplačno dobite v uredništvu revije.
(Članek je originalno objavljen v reviji ABC tehnike. Za potrebe Sveta elektronike ga je preuredil avtor.)