Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2018_259_40
V tem delu se bomo posvetili LED trakovom (strip) in LED prstanom (ring). Na tržišču je na voljo zanimiv izbor teh proizvodov, od katerih so nekateri prikazani na sliki 13. Prstane delajo s 6, 8, 12, 16, 18, 24 in več LED-icami in če so od istega proizvajalca, se lahko lepo zložijo v koncentrične kroge. LED trakovi so lahko nefleksibilni, kot te v sredini slike 13, ali pa se nahajajo na fleksibilni podlagi. V tem primeru se prodajajo “na metre”. Tipično število LED-ic na meter se giblje od 30 do več kot 100.
Najbolj interesantni LED trakovi in prstani so zasnovani na čipu WS2812B. V njemu so integrirane rdeča, zelena in modra LED ter PWM krmilnik – driver, ki jih krmili. Krmilni del omogoča postavljanje 256 različnih intenzitet svetlosti vsake od LED-ic, kar se odraža s paleto več od 16 milijonov barv. Aktivne površine – piksli LED-ic so malih dimenzij in fizično postavljeni zelo blizu, zato je mešanje barv izvrstno.
Ta vsebina je samo za naročnike
Programiranje, oziroma določanje želene barve vsakemu krmilniku je zamišljeno na originalen način, ki omogoča povezovanje čipov v nize do nekaj sto enot. Prav tako je možno serijsko povezovati prstane in trakove, ali pa z rezanjem skrajševati fleksibilne trakove na potrebno dolžino.
Slika 14 prikazuje vse, kar je potrebno vedeti o načinu povezovanja in komunikaciji z LED trakovi in prstani, ki bazirajo na čipu WS2812B. Razlikujemo tri vrste krmilnih impulzov (na sliki so prikazani desno spodaj) katerih vir (mikrokontroler) jih pošilja prvemu čipu v vrsti:
- RESET je negativni impulz (pavza), ki traja dalj kot 50 µs;
- logična “0” je pozitivni impulz, ki traja 0,4 µs za katerim sledi pavza dolga 0,85 µs;
- logična “1” je pozitivni impulz, ki traja 0,85 µs za katerim sledi pavza dolga 0,4 µs.
Po resetu bo prvi RGB čip v vrsti razdelil prve tri skupine osmih impulzov in jih bo interpretiral kot intenzivnosti zelenega, rdečega in modrega piksla (intenziteta vsake barve je podana kot 8-bitna številka, najpomembnejši bit – MSB – je na prvem mestu). Ostale impulze bo posredoval naslednjemu čipu, ki bo izsejal svojih 24 bitov in ostanek posredoval naprej. Vsak čip vsebuje preoblikovalnik impulzov, zato da se s povezovanjem čipov v daljše verige ne bi izgubila kvaliteta impulzov. Ko je poslal informacijo za vse čipe v verigi, bo mikrokontroler generiral pavzo. Pavza lahko traja toliko časa, dokler ni potrebno zamenjati barve nekega piksla. Dokler traja pavza, bodo krmilni sklopi vsakega čipa sami vzdrževali dano barvo s PWM impulzi frekvence okoli 400 Hz.
Čeprav je opisani princip komunikacije enostaven, se ob pisanju programa za mikrokontroler soočamo s problemom trajanja krmilnih impulzov. Impulz logične “0” in pavza po impulzu logične “1” trajata samo 0,4 µs – toliko časa traja 8 ciklov mikrokontrolerja kadar dela na frekvenci 20 MHz oziroma samo 3,2 cikla, če dela na 8 MHz. Programiranje v Bascom-AVR-ju ne pride v poštev; primerne rutine je potrebno pisati v asemblerju, in še v tem primeru je doseganje pravilnega timinga pravi programerski izziv! Da bi olajšal delo z RGB prstani in trakovi zasnovanimi na WS2812B in kompatibilnimi čipi, sem napisal ustrezne knjižnice, WS2812B$SE.sub in WS2812Bmaster$SE.sub. Ukazi in knjižnic so primerni za nize do 255 RGB čipov. (Opomba: število čipov je omejeno z razpoložljivim RAM-om mikrokontrolerja).
Knjižnica WS2812B$SE.sub
Knjižnica WS2812B$SE.sub vsebuje konstante s konfiguracijskimi podatki, globalne spremenljivke, rutine (podprograme) za komunikacijo z LED trakovi in prstani zasnovanimi na integriranem vezju WS2812B, kot tudi rutine za pripravo in obdelavo podatkov v RAM-u mikrokontrolerja.
Med globalnimi spremenljivkami, ki so z vključitvijo WS2812B$SE.sub knjižnice postale sestavni del vašega programa, je najvažnejši byte niz Ws2812b$led:
Dim Ws2812b$led(ws2812b__led_number_x3) As Byte
Število členov niza je odvisno od števila RGB čipov. Določa ga vrednost konstante Ws2812B__led_number_x3, ki se definira med prevajanjem programa in ki ustreza številu pikslov uporabljenega LED prstana ali LED traku. V niz se shranjujejo jakosti posameznih pikslov v razponu od 0 (ugasnjen) do 255 (maksimalna jakost).
Prvi trije členi niza vsebujejo jakost zelenega, rdečega in modrega piksla prvega čipa, naslednji trije tri jakosti piksla drugega čipa itd. Niz uporabljajo ukazi iz knjižnice za shranjevanje in pripravo podatkov, do elementov niza se lahko dostopa tudi neposredno iz uporabniškega programa.
Dim Ws2812b$$led_lo As Word Dim Ws2812b$$led_hi As Word
Te spremenljivke služijo za izmenjavo podatkov med podprogrami iz knjižnice. Prva vsebuje naslov prvega, druga zadnjega iz skupine pikslov, ki se obdelujejo z nekim ukazom. Priporočljivo je, da se jih ne uporablja iz uporabniškega programa. Isto velja tudi za naslednji spremenljivki, ki ju podprogrami uporabljajo za indeksiranje elementov iz Ws2812b$led niza:
Dim Ws2812b$$led_ind1 As Word Dim Ws2812b$$led_ind2 As Word
Na mestu na katerem ste WS2812B$SE.sub knjižnico vključili v svoj program bo Bascom prevajalnik namestil definicije navedenih spremenljivk in ukaze, katere izbrani pin mikrokontrolerja konfigurirajo in pripravijo za komunikacijo z nizom WS2812B čipov. Sami podprogrami (rutine) iz knjižnice se bodo namestili na konec programa. Vsi podprogrami so vidni kot “običajni” Bascom-AVR ukazi. Sledi njihov opis:
Ukaz Ws2812b$show_all
Ws2812b$show_all
Parametri: | nima |
Namen: | Prenaša vrednost vseh elementov niza Ws2812b$led na LED trak ali prstan. |
Opombe: | Ukaz uporablja Bascom-ovo _xtal konstanto za nastavljanje hitrosti komunikacije. Za pravilen timing, je nujno da je vrednost vpisana v $crystal ukaz ustreza dejanski frekvenci, na kateri mikrokontroler dela.
Med izvrševanjem tega ukaza so onemogočene prekinitve. Če so bile prekinitve predhodno omogočene, jih bo ukaz avtomatsko vključil, ko zaključi pošiljanje niza impulzov. |
Ukaz Ws2812b$show
Ws2812b$show par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki kaže kakšnemu številu RGB čipov je potrebno vpisati nove vrednosti |
Namen: | Prenaša vsebino prvih 3n elementov niza Ws2812b$led v prve n RGB čipe LED traku ali prstana. | |
Opombe: | Ni možno direktno dostopati do n-tega RGB čipa LED traku ali prstana; za izmenjavo njegovih postavk je potrebno zaporedno poslati podatke vsem predhodnim čipom.
Ukaz uporablja Bascom-ovo _xtal konstanto za nastavljanje hitrosti komunikacije. Za pravilen timing, je nujno, da vrednost, ki je vpisana v $crystal ukazu ustreza dejanski stvarni frekvenci na kateri mikrokontroler dela. Med izvajanjem tega ukaza so onemogočene prekinitve. Če so prekinitve predhodno bile omogočene, jih bo ukaz avtomatsko vključil, ko zaključi pošiljanje niza impulzov. |
Ukaz Ws2812b$set_pixel_color
Ws2812b$set_pixel_color par1, par2, par3, par4
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko RGB čipa (1-255) |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje intenzivnost zelenega piksla izbranega čipa (0-255) | |
par3 | konstanta ali ime byte spremenljivke, ki vsebuje intenzivnost rdečega piksla izbranega čipa (0-255) | |
par4 | konstanta ali ime byte spremenljivke, ki vsebuje intenzivnost modrega piksla izbranega čipa (0-255) | |
Namen: | Določa intenzitete zelenega, rdečega in modrega piksla izbranega čipa. |
Ukaz Ws2812b$set_pixel_igrb
Ws2812b$set_pixel_igrb par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko RGB čipa (1-255) |
par2 | konstanta ali ime word spremenljivke, ki vsebuje intenzivnost svetlosti in barvo G, R in B piksla izbranega čipa (0-FFFFh) v formatu IGRB:
I = intenzivnost (0-15) G = relativna intenzivnost zelenega piksla (0-15) R = relativna intenzivnost rdečega piksla (0-15) B = relativna intenzivnost modrega piksla (0-15) |
|
Namen: | Določa intenzitete zelenega, rdečega in modrega piksla izbranega čipa. Absolutna intenzivnost posamezne barve je zmnožek I*G (zelena), I*R (rdeča) i I*B (modra). | |
Napomena: | Ta ukaz podpira manjšo paleto barv ukaza Ws2812b$set_pixel_color. |
Ukaz Ws2812b$clear_all
Ws2812b$clear_all
Parametri: | nima |
Namen: | Postavlja vsebino vseh elementov niza Ws2812b$led v stanje 0. |
Ukaz Ws2812b$clear_ring
Ws2812b$clear_ring par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko prvega RGB čipa naslovljenega prstana |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko zadnjega RGB čipa naslovljenega prstana | |
Namen: | Postavlja vsebino tistih elementov niza Ws2812b$led, ki so pridruženi naslovljenemu prstanu v stanje 0. | |
Napomena: | Ukaz je uporaben tudi za LED trakove, v tem primeru par1 in par2 naslavljajo del traku, ki ga je potrebno zbrisati. |
Ukaz Ws2812b$shift_ring
Ws2812b$shift_ring par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko prvega RGB čipa naslovljenega prstana |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko zadnjega RGB čipa naslovljenega prstana | |
Namen: | Će je par1 < par2, se premakne vsebino tistih elementov niza Ws2812b$led, ki so pridruženi naslovljenemu prstanu en LED čip proti naprej oziroma v smeri gibanja urinega kazalca; vse tri piksle prvega naslovljenega LED čipa se postavi v stanje 0.
Če je par1 > par2, premika vsebino tistih elementov niza Ws2812b$led, ki si pridruženi naslovljenemu prstanu en LED čip proti nazaj, oziroma v smeri nasprotni urinem kazalcu; vse tri piksle zadnjega naslovljenega LED čipa se postavi v stanje 0. |
|
Opombe: | Ukaz je uporaben tudi za LED trakove, v tem primeru slučaju par1 in par2 naslavljajo del traku, ki ga je potrebno premakniti.
Ukaz funkcionalno zamenjuje ukaze Ws2812b$shift_ring_fwd in Ws2812b$shift_ring_bwd. |
Ukaz Ws2812b$shift_ring_fwd
Ws2812b$shift_ring_bwd par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko prvega RGB čipa naslovljenega prstana |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko zadnjega RGB čipa naslovljenega prstana | |
Namen: | Premika vsebino tistih elementov niza Ws2812b$led, ki so pridruženi naslovljenemu prstanu en LED čip naprej, oziroma v smeri gibanja urinega kazalca; vse tri piksle prvega naslovljenega LED čipa se postavi v stanje 0. | |
Opombe: | Ukaz je uporaben tudi za LED trakove, v tem primeru par1 in par2 naslavljata del traku, ki ga je potrebno premakniti. Ukaz je možno funkcionalno zamenjati z ukazom Ws2812b$shift_ring, v tem primeru je potrebno zadovoljiti pogoj par1 < par2. |
Ukaz Ws2812b$shift_ring_bwd
Ws2812b$shift_ring_fwd par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko prvega RGB čipa naslovljenega prstana |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko zadnjega RGB čipa naslovljenega prstana | |
Namen: | Premika vsebino tistih elementov niza Ws2812b$led, ki so pridruženi naslovljenem prstanu en LED čip nazaj, oziroma v nasprotni smeri gibanju urinega kazalca; vse tri piksle zadnjega naslovljenega LED čipa se postavljajo v stanje 0. | |
Opombe: | Ukaz je je uporaben tudi za LED trakove, v tem primeru par1 in par2 naslavljata del traku, ki ga je potrebno premakniti. Ukaz je možno funkcionalno zamenjati z ukazom Ws2812b$shift_ring, v tem primeru je potrebno zagotoviti pogoj par1 > par2. |
Ukaz Ws2812b$shift_all_fwd
Ws2812b$shift_all_fwd
Parametri: | nima |
Namen: | Premika vsebino vseh elementov niza Ws2812b$led en LED čip proti naprej, oziroma v smeri urinega kazalca; vse tri piksle prvega LED čipa se postavlja v stanje 0. |
Ukaz Ws2812b$shift_all_bwd
Ws2812b$shift_all_bwd
Parametri: | nima |
Namen: | Premika vsebino vseh elementov niza Ws2812b$led en LED čip nazaj, oziroma proti smeri urinega kazalca; vse tri piksle zadnjega LED čipa postavlja se v stanje 0. |
Ukaz Ws2812b$rotate_ring
Ws2812b$rotate_ring par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko prvega RGB čipa naslovljenega prstana |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko zadnjega RGB čipa naslovljenega prstana | |
Namen: | Če je par1 < par2, premika vsebino tistih elementov niza Ws2812b$led, ki so pridruženi naslovljenemu prstanu en LED čip proti naprej, oziroma v smeri urinega kazalca; vse tri piksle prvega naslovljenega LED čipa se postavlja v stanje, ki so ga pred izvršitvijo ukaza imeli piksli zadnjega naslovljenega LED čipa.
Če je par1 > par2, premika vsebino tistih elementov niza Ws2812b$led, ki so pridruženi naslovljenemu prstanu en LED čip nazaj, oziroma proti smeri urinega kazalca; vse tri piksle zadnjega naslovljenega LED čipa se postavlja v stanje, ki so ga imeli pred izvršitvijo ukaza imeli piksli prvega naslovljenega LED čipa. |
|
Opombe: | Ukaz je je uporaben tudi za LED trakove, v tem primeru par1 in par2 naslavljata del traku, ki ga je potrebno premakniti.
Ukaz funkcionalno zamenjuje ukaze Ws2812b$rotate_ring_cw in Ws2812b$rotate_ring_ccw. |
Ukaz Ws2812b$rotate_ring_cw
Ws2812b$rotate_ring_cw par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko prvega RGB čipa naslovljenega prstana |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko zadnjega RGB čipa naslovljenega prstana | |
Namen: | Premika vsebino tistih elementov niza Ws2812b$led, ki so pridruženi naslovljenemu prstanu en LED čip proti naprej, oziroma v smeri urinega kazalca; vse tri piksle prvega naslovljenega LED čipa se postavi v stanje, ki so ga pred izvršitvijo ukaza imeli piksli zadnjega naslovljenega LED čipa. | |
Opombe: | Ukaz je je uporaben tudi za LED trakove, v tem primeru par1 in par2 naslavljata del traku, ki ga je potrebno premakniti. Ukaz je možno funkcionalno zamenjati z ukazom Ws2812b$rotate_ring, v tem primeru je potrebno zagotoviti pogoj par1 < par2. |
Ukaz Ws2812b$rotate_ring_ccw
Ws2812b$rotate_ring_ccw par1, par2
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko prvega RGB čipa naslovljenega prstana |
par2 | konstanta ali ime byte spremenljivke, ki vsebuje redno številko zadnjega RGB čipa naslovljenega prstana | |
Namen: | Premika vsebino tistih elementov niza Ws2812b$led, ki so pridruženi naslovljenemu prstanu en LED čip nazaj, oziroma proti smeri urinega kazalca; vse tri piksle zadnjega naslovljenega LED čipa se postavlja v stanje, ki so ga pred izvršitvijo imeli piksli prvega naslovljenega LED čipa. | |
Opombe: | Ukaz je je uporaben tudi za LED trakove, v tem primeru par1 in par2 naslavljata del traku, ki ga je potrebno premakniti. Ukaz je možno funkcionalno zamenjati z ukazom Ws2812b$rotate_ring, v tem primeru potrebno zadovoljiti pogoj par1 > par2. |
Ukaz Ws2812b$rotate_all_cw
Ws2812b$rotate_all_cw
Parametri: | nima |
Namen: | Premika vsebino vseh elementov niza Ws2812b$led en LED čip proti naprej, oziroma v smeri urinega kazalca; vse tri piksle prvega LED čipa se postavlja v stanje, ki so ga pred izvršitvijo imeli piksli zadnjega LED čipa v nizu. |
Ukaz Ws2812b$shift_all_bwd
Ws2812b$rotate_all_ccw
Parametri: | nima |
Namen: | Premika vsebino vseh elementov niza Ws2812b$led en LED čip nazaj, oziroma proti smeri urinega kazalca; vse tri piksle zadnjega LED čipa se postavlja v stanje, ki so ga pred izvršitvijo imeli piksli prvega LED čipa v nizu. |
Ukaz Ws2812b$receive
Ws2812b$receive par1
Parametri: | par1 | ime byte spremenljivke, ki bo sprejel podatek |
Namen: | Sprejme 1 byte, ki ga master pošlje slave mikrokontrolerju v master-slave konfiguraciji. | |
Opombe: | Uporablja se v programu slave mikrokontrolerja. |
Makro definicija Ws2812b$receive&execute
Ws2812b$receive&execute
Parametri: | nima |
Namen: | Makro definicija generira osnovno strukturo programa slave mikrokontrolerja v master-slave konfiguraciji. Program konfigurira vhodne pine mikrokontrolerja, ki se uporabljajo v komunikaciji z master mikrokontrolerjem in sprejema, analizira in izvršuje ukaze, ki jih master pošilja slave mikrokontrolerju. |
Opombe: | Uporablja se v programu slave mikrokontrolerja. |
Knjižnica WS2812Bmaster$SE.sub
Knjižnica WS2812Bmaster$SE.sub se uporablja v master mikrokontrolerju v master-slave konfiguraciji, ki vsebuje konstante s konfiguracijskimi podatki in rutine (podprograme) za komunikacijo s slave mikrokontrolerjem.
Na mestu na katerem ste WS2812Bmacro$SE.sub knjižnico vključili v svoj program, Bascom-AVR prevajalnik bo namestil definicije navedenih konstant in ukaze, ki izbrane pine mikrokontrolerja konfigurirajo in pripravljajo za komunikacijo s slave mikrokontrolerjem. Sami podprogrami (rutine) iz knjižnice se bodo namestili na konec programa. Vsi podprogrami so vidni kot “običajni” Bascom-AVR ukazi. Sledi njihov opis:
Ukazi Ws2812b$show, Ws2812b$show_all, Ws2812b$set_pixel_color, Ws2812b$set_pixel_igrb, Ws2812b$clear_all, Ws2812b$clear_ring, Ws2812b$shift_ring, Ws2812b$shift_ring_fwd, Ws2812b$shift_ring_bwd, Ws2812b$shift_all_fwd, Ws2812b$shift_all_bwd, Ws2812b$rotate_ring, Ws2812b$rotate_ring_cw, Ws2812b$rotate_ring_ccw, Ws2812b$rotate_all_cw, Ws2812b$rotate_all_ccw
Te ukazi so identični ukazom iz WS2812B$SE.sub knjižnice in se uporabljajo na isti način, vendar pa nimajo izvršnega dela, pač pa posredujejo parametre slave mikrokontrolerju preko Ws2812b$send ukaza.
Ukaz Ws2812b$send
Ws2812b$send par1
Parametri: | par1 | konstanta ali ime byte spremenljivke, ki vsebuje podatek, ki ga master pošlje slave mikrokontrolerju v master-slave konfiguraciji |
Namen: | Pošlje 1 byte slave mikrokontrolerju v master-slave konfiguraciji. | |
Opombe: | se uporablja v programu master mikrokontrolerja. |
Opomba: WS2812Bmaster$SE.sub knjižnica ne dimenzionira Ws2812b$led niza niti ostalih globalnih spremenljivk!
Ko smo spoznali ukaze iz WS2812B$SE.sub in WS2812Bmaster$SE.sub knjižnic, moramo pokazati, kako se uporabljata. S tem se bomo pozabavali v naslednjem članku; fotografija na sliki 15 je dokaz, da vse to zares dela!
Opomba: WS2812B$SE.sub in WS2812Bmaster$SE.sub knjižnice lahko brezplačno dobite v uredništvu revije Svet elektronike.
www.svet-el.siBarduino (5)