Kazalo:

RGB LED matrika: 5 korakov
RGB LED matrika: 5 korakov

Video: RGB LED matrika: 5 korakov

Video: RGB LED matrika: 5 korakov
Video: RGB светодиодный дисплей 64x32 P2.5/P3 в связке с Arduino 2024, Julij
Anonim
Image
Image
Oblikovanje strojne opreme
Oblikovanje strojne opreme

Poiščite Instructable in najdete veliko projektov LED matric. Nobeden od njiju ni bil ravno tisto, kar sem si želel, to je raziskati interakcije oblikovanja strojne in programske opreme, da bi nekaj izdelali, in končni izdelek izdelati v čednem tiskanem vezju z gonilnikom, ki ga lahko potegnem na "LED zaslon" z uporabo visoke ravni konstrukcije (npr. risanje črte v nasprotju z nastavljanjem določenih slikovnih pik). Ta del je bil zame pomemben, saj je veliko gonilnikov matrike LED golih kosti in ne predstavlja veliko programskega ustvarjanja slike ali animacije. To ne pomeni, da ne morete ustvarjati slik in animacij z drugimi gonilniki, samo da bi morali od projekta do projekta opravljati več ponavljajočih se del.

Zato sem se odločil uresničiti svojo vizijo. Prvi korak je bil oblikovanje strojne opreme. To je bilo zame verjetno najbolj zahtevno, saj je moje ozadje bolj programsko. Spet je bilo veliko vnaprej pripravljenih modelov in vsekakor sem jih uporabil za navdih, vendar sem se želel učiti skozi početje, zato sem na podlagi izdelal prototip matrice 4x4. S tem postopkom sem se veliko naučil, saj prvih nekaj ponovitev ni delovalo. Vendar sem naredil strojno zasnovo, ki je delovala, kar mi je omogočilo, da sem začel razvijati gonilnik.

Za vozniško platformo sem se odločil za Arduino, ker je široko dostopen in ima na spletu veliko referenc. Medtem ko so mi karierne izkušnje omogočile, da sem bolj gladko prišel do delovne različice gonilnika kot moja prizadevanja za strojno opremo, je bilo še vedno veliko ponovitev, medtem ko sem optimiziral zmogljivost gonilnika za mikro krmilnik ATMega in razvil programski API, ki mi je bil všeč.

Ta Instructuctable dokumentira zasnovo in nekaj ključnih spoznanj mojega projekta. Več informacij o tem projektu najdete na moji spletni strani, vključno s kompleti, ki jih lahko kupite za izdelavo lastne LED matrike RGB.

1. korak: Oblikovanje strojne opreme

Primarni cilj mojega oblikovanja strojne opreme je bil ustvariti niz RGB LED, ki bi jih lahko programiral, a tudi nisem hotel porabiti veliko denarja. Pristop, ki sem se ga odločil, je bil uporaba 74HC595 registrov premikov za krmiljenje LED. Da bi zmanjšali število potrebnih registrov premikov, sem LED RGB razporedil v matrično postavitev, kjer so bile skupne anode povezane v vrstice, rdeči, zeleni in modri katodni vodi pa so povezani v stolpce. Pri matriki 4x4 je vezje izgledalo kot priloženi diagram vezja.

Ena stvar, ki jo boste takoj opazili, je, da glede na matrično vezje obstaja nekaj konfiguracij LED osvetlitve, ki jih ni mogoče izvesti, če so hkrati vklopljene vse želene LED. Na primer, matrika ne more hkrati prižgati dveh LED, ki sta diagonalni drug od drugega, ker bosta z napajanjem vrstic in stolpcev dve nasprotni LED svetili na pravokotni diagonali na želene LED. Da bi se tega izognili, bomo za iskanje po vsaki vrstici uporabili multipleksiranje. Na spletu je veliko virov, ki pokrivajo tehniko multipleksiranja, tukaj jih ne bom poskušal ponoviti.

Ker uporabljam običajne anodne LED, to pomeni, da vrstice zagotavljajo pozitivno moč, stebri pa potonejo na tla. Dobra novica je, da lahko registri za prestavljanje 74HC595 napajajo tako vir kot potop, slaba novica pa je, da imajo omejitev, koliko energije lahko pridobijo ali potonejo. Posamezni zatiči 74HC595 imajo največji tok 70 mA, vendar je najbolje ohraniti manj kot 20 mA. Posamezne barve v naših RGB LED diodah imajo približno 20 mA. To pomeni, da 74HC595 ne more neposredno napajati celotne vrste LED, če jih želim vklopiti.

Namesto da napaja vrstico neposredno, bo 74HC595 namesto tega poganjal tranzistor za vsako vrstico, tranzistor pa bo vklopil ali izklopil tok, ki napaja vrstico. Ker zasnova uporablja skupne anodne LED, bo preklopni tranzistor PNP. Če bi uporabljali običajno katodno LED, bi bil preklopni tranzistor NPN. Upoštevajte, da z uporabo tranzistorja PNP za vožnjo vrstice nastavitev registra za premik za vklop zdaj postane nizka, saj tranzistor PNP potrebuje vklop negativne napetosti med oddajnikom in bazo, kar bo omogočilo pretok pozitivnega toka v vrstici.

Druga stvar, ki jo je treba upoštevati, je želena bitna postavitev registrov premikov. To je med registri premikov, ki bitov nadzorujejo, katere vrstice ali stolpce v matriki. Zasnova, s katero sem poslal, je tam, kjer prvi bit ali "najpomembnejši bit", poslan v matrične verižne premične registre, nadzoruje stolpec rdečih elementov LED, drugi bit nadzoruje zeleni element prvega stolpca, tretji bit pa prvega stolpca modri element, četrti bit nadzoruje rdeči element drugega stolpca, … ta vzorec se ponavlja čez stolpce od leve proti desni. Nato naslednji poslani bit nadzira zadnjo ali spodnjo vrstico, naslednja drugo do zadnjo vrstico, … to se ponavlja, dokler zadnji poslani bit ali "najmanj pomemben bit" ne nadzoruje prve ali zgornje vrstice v matriki.

Nazadnje sem se moral odločiti, katere upore bom uporabil za vsako od LED v RGB LED. Čeprav lahko za izračun zahtevanega upora uporabite standardno formulo, ki združuje napetost naprej in želeni tok, sem ugotovil, da je nastavitev toka vsake LED na 20 miliamperov povzročila sivobelo barvo, ko so bile vklopljene vse rdeče, zelene in modre LED. Tako sem začel z očmi. Preveč rdeče v beli barvi je pomenilo povečanje ohma rdečega LED za zmanjšanje toka. Ponavljal sem zamenjavo uporov z različnimi ohmi, dokler nisem našel kombinacije, ki je dala belo barvo, za katero se mi je zdelo, da je prava. Končna kombinacija je bila 180 Ω za rdečo LED, 220 Ω za zeleno LED in 100 Ω za modro LED.

2. korak: Konstrukcija strojne opreme - plošča

Konstrukcija strojne opreme - plošča
Konstrukcija strojne opreme - plošča
Konstrukcija strojne opreme - plošča
Konstrukcija strojne opreme - plošča

Prva faza konstruktorja strojne opreme je bila vkrcanje za kruh. Tu sem naredil matriko 4x4 z RGB LED diodami. Ta matrika bi zahtevala 16 bitov za nadzor, 12 za stolpce RGB in 4 za vsako vrstico. Dva registra za prestavljanje 74HC595 zmoreta vse. Najprej sem raziskal in oblikoval vezje, za katero sem mislil, da bo delovalo, nato pa ga postavil na mizo.

Verjetno največji izziv pri izdelavi načrta je bilo upravljanje vseh žic. Vzel sem že pripravljen komplet žice za plošče, toda dogodek je bil potem malo težak. Trik, ki se mi je zdel koristen, je bil ustvariti "vrata" za povezavo z Arduino ploščo. Namesto da priključke na Arduinu povežete neposredno z različnimi zatiči IC na plošči, namestite nekaj vrstic na plošči kot povezovalno točko za Arduino in nato v te vrstice priključite ustrezne zatiče ID. Za ta projekt potrebujete le pet povezav z Arduinom: +5V, ozemljitev, podatki, ura in zapah.

Ko je bila končnica izdelana, sem jo moral preizkusiti. Vendar brez nekakšnega gonilnika za pošiljanje pravih signalov v registre premikov nisem mogel preveriti, ali strojna postavitev deluje.

3. korak: Oblikovanje programske opreme gonilnika

Image
Image

Glede na lastne karierne izkušnje z razvojem programske opreme je bil to del projekta, ki mi je bil verjetno najbolj jasen glede poti. Pregledal sem številne druge gonilnike LED matric na osnovi Arduina. Čeprav so zagotovo na voljo dobri gonilniki, noben ni imel take zasnove, kot sem si jo želel. Moji oblikovalski cilji voznika so bili:

  • Zagotovite API na visoki ravni za programsko ustvarjanje slik in animacij. Večina voznikov, ki sem jih videl, je bila bolj osredotočena na slike s trdim kodom. Ker sem po poklicu programer C ++, sem želel uporabiti dobro objektno orientirano oblikovanje za izvajanje in upravljanje dejavnosti risanja na LED matriko.
  • Za upravljanje slike na zaslonu uporabite pristop z dvojnim medpomnilnikom. Eden vmesnik je tisto, kar se programsko vleče, drugi pa predstavlja stanje matričnih slikovnih pik v vsakem trenutku. Prednost tega pristopa je, da vam ni treba v celoti upodabljati naslednje posodobitve okvirja za zaslon med cikli posodabljanja multipleksiranja.
  • S PWM dovolite več kot sedem primitivnih barv, ki jih lahko RGB upodobi s preprostimi kombinacijami rdečih, zelenih in modrih elementov.
  • Napišite gonilnik tako, da bo "deloval" z RGB LED matrikami različnih velikosti, ki so sledile mojemu splošnemu pristopu oblikovanja matrik. Upoštevajte, da čeprav moja zasnova strojne opreme uporablja registre premikov 74HC595, bi pričakoval, da bo moj gonilnik deloval s katerim koli mehanizmom za vklop/izklop sloga registra premikov, ki je postavljen s podobno postavitvijo bitov kot moja zasnova strojne opreme. Na primer, pričakoval bi, da bo moj gonilnik deloval z zasnovo strojne opreme, ki je uporabljala čipe DM13A za nadzor stolpcev in čip 74HC595 za nadzor vrstic.

Če želite neposredno pogledati kodo gonilnika, jo lahko najdete na GitHubu tukaj.

Prva ponovitev mojega gonilnika je bila nekoliko učna krivulja zmogljivosti platforme Arduino. Najbolj očitna omejitev je RAM, ki je 2K bajtov za Arduino Uno in Nano. Uporaba predmetov C ++ v takem scenariju pogosto ni priporočljiva zaradi preobremenitve pomnilnika predmetov. Vendar pa se mi je zdelo, da če so stvari opravljene pravilno, je korist predmetov v C ++ odtehtala njihove stroške (v RAM -u).

Drugi velik izziv je bil ugotoviti, kako implementirati modulacijo širine impulza prek registrov premikov, tako da lahko ustvarim več kot sedem primitivnih barv LED RGB. Ker sem več let programiral na platformah Linux, sem bil navajen uporabljati konstrukte, kot so niti, za upravljanje procesov, ki zahtevajo dosledno časovno usklajevanje. Čas pri operaciji posodabljanja registra premikov je zelo pomemben pri izdelavi gonilnika za LED matriko, ki uporablja multipleksiranje. Razlog je v tem, da čeprav se multipleksiranje dogaja tako hitro, da vaše oči ne vidijo utripanja in izklopa posameznih LED, lahko vaše oči zaznajo razlike v skupnem skupnem času, ko je katera od LED vklopljena. Če ena vrsta LED sveti dlje časa kot druge, bo med multipleksiranjem videti svetlejša. To lahko privede do neenakomerne svetlosti matrike ali periodičnega strobiranja matrike kot celote (to se zgodi, ko en cikel posodabljanja traja dlje kot drugi).

Ker sem potreboval dosleden časovni mehanizem, s katerim so bile posodobitve registra premikov soglasne, vendar Arduino formalno ne podpira niti, sem moral ustvariti lasten mehanizem, podoben niti. Moja prva ponovitev tega je bila preprosto ustvariti časovnik zanke, ki je bil odvisen od funkcije Arduino loop () in bi sprožil dejanje, ko je od zadnjega sprožitve dejanja pretekel določen čas. To je oblika "večopravilnega sodelovanja". Sliši se dobro, vendar se je v praksi to izkazalo za nedosledno, ko so hitrost streljanja izmerili v mikrosekundah. Razlog za to je, da če bi imela vklopljena dva merilnika časa, je eno njihovo dejanje pogosto trajalo dovolj dolgo, da je sprožilo drugo dejanje pozneje, kot je bilo želeno.

Ugotovil sem, da je rešitev tega problema uporaba mehanizma za prekinitev domače ure Arduino. Ta mehanizem vam omogoča izvajanje majhnega koda v zelo doslednih intervalih. Tako sem zasnoval gonilniško kodo okoli elementa oblikovanja z uporabo prekinitve ure za sprožitev kode za pošiljanje matričnih premikov registrov naslednje posodobitve v ciklu multipleksa. Če želite to narediti in omogočiti, da se na zaslonu pojavijo posodobitve, da ne motijo aktivnega izpisa v registre premikov (nekaj, čemur bi rekli "pogoj dirke"), sem uporabil pristop, da imam dvojne medpomnilnike za bite v registru premikov, enega za pisanje in enega za branje. Ko uporabnik posodablja sliko matrice, se te operacije zgodijo v vmesnem pomnilniku za pisanje. Ko so te operacije končane, se prekinitve začasno prekinejo (to pomeni, da se prekinitev ure ne more sprožiti), medpomnilnik za pisanje pa zamenjate s prejšnjim vmesnim pomnilnikom za branje in to ni nov vmesni pomnilnik za branje, nato pa se razlage ponovno omogočijo. Potem, ko se sproži prekinitev ure, kar kaže, da je čas za pošiljanje naslednje konfiguracije bitov v registre premikov, se te informacije preberejo iz trenutnega vmesnega pomnilnika za branje. Na ta način do vmesnega pomnilnika, iz katerega se trenutno bere med prekinitvijo ure, ne pride do zapisovanja, kar bi lahko poškodovalo informacije, poslane v registre premikov.

Oblikovanje preostalega dela voznika je bil razmeroma preprost primer objektno usmerjenega oblikovanja. Na primer, ustvaril sem predmet za upravljanje bitne slike registra premika za vsako stanje zaslona. Z vključitvijo kode, ki se nanaša na upravljanje bitnih slik, je bilo ustvarjanje omenjenega pristopa dvojnih vmesnih pomnilnikov sama po sebi enostavna vaja. A tega Instructable -a nisem napisal, da bi poveličal prednosti objektno usmerjenega oblikovanja. Drugi elementi oblikovanja vključujejo koncept glifa in slike RGB. Glif je osnovni konstrukt slike, ki nima prirojenih barvnih informacij. To si lahko predstavljate kot črno -belo sliko. Ko simbol privleče na LED zaslon, se podajo informacije o barvah, ki označujejo, kako naj bodo "bele" slikovne pike obarvane. RGB slika je slika, pri kateri ima vsak piksel svoje barvne podatke.

Spodbujam vas, da si ogledate primere skic Arduino in pregledate dokumentacijo glave gonilnika, da se seznanite z uporabo gonilnika za ustvarjanje slik in animacij na matriki LED RGB.

4. korak: LED zrcaljenje

LED Ghosting
LED Ghosting
LED Ghosting
LED Ghosting

V LED matriki je "ghosting" pojav LED v matriki, ki sveti, ko ni zaželena, običajno zelo zmanjšana raven. Moja prvotna zasnova strojne opreme je bila dovzetna za utripanje, predvsem v zadnji vrsti. Vzrok za to sta dve stvari: tranzistorji se ne izklopijo takoj in parazitska kapacitivnost v RGB LED.

Med pregledovanjem vrstic se zaradi dejstva, da se tranzistorji ne izklopijo takoj, prejšnja vrstica v ciklu skeniranja še vedno delno napaja, ko se vklopi naslednja vrstica. Če se dani stolpec, ki je bil izklopljen v prejšnji vrstici, na novo vklopi, ko se nova vrstica napaja, bo LED za ta stolpec v prejšnji vrstici za kratek čas svetila, medtem ko je tranzistor za preklapljanje te vrstice še v obračanju izklopljeno. Kar povzroči, da tranzistor vzame opazen čas za izklop, je nasičenost v dnu tranzistorja. To povzroči, da se pot tranzistor kolektor-oddajnik še naprej izvaja, ko se tok odstrani iz baze, vsaj dokler se nasičenost ne razprši. Glede na to, da naš cikel posodabljanja multipleksiranja povzroči, da so vrstice namenoma vklopljene za časovno obdobje, merjeno v mikrosekundah, je lahko čas, v katerem nasičeni tranzistor prejšnje vrstice ostane prevoden, opazen del tega. Posledično lahko vaše oko zazna tisti zelo majhen čas, ko se prižge LED prejšnje vrstice.

Če želite odpraviti problem nasičenosti tranzistorja, lahko tranzistorju med bazo in zbiralnikom dodate Schottkyjevo diodo, da povzroči malo povratnega toka na bazo, ko je tranzistor vklopljen, kar preprečuje nasičenje tranzistorja. To bo povzročilo, da se tranzistor hitreje izklopi, ko se tok odstrani iz baze. Za poglobljeno razlago tega učinka si oglejte ta članek. Kot lahko vidite na sliki v tem razdelku, je brez diode odsev precej opazen, vendar dodajanje diode v vezje za vsako vrstico bistveno odstrani ožiganje.

RGB LED diode so dovzetne za drug pojav, imenovan parazitska kapacitivnost. Glavni vzrok za to je dejstvo, da ima vsaka od treh barvnih LED v enoti RGB LED različne napetosti naprej. Ta razlika v napetosti naprej lahko povzroči učinek električne kapacitivnosti med vsako od posameznih barv LED. Ker se v LED -enoti ob napajanju nabere električni naboj, je treba ob izpadu napajanja izprazniti parazitsko kapacitivnost. Če je ta LED stolpec sicer vklopljen za napajanje druge vrstice, se parazitski naboj izprazni skozi LED tega stolpca in povzroči, da na kratko zasveti. Ta učinek je lepo razložen v tem članku. Rešitev je v tem, da za to parazitsko polnjenje dodamo izpustno pot, razen skozi samo LED, in nato damo LED -ju čas, da se izprazni, preden se stolpec ponovno napaja. V moji zasnovi strojne opreme je to doseženo z dodajanjem upora na napajalni vod vsake vrstice, ki povezuje moč z maso. To bo povzročilo, da bo z napajanjem vrstice potegnjen večji tok, vendar zagotavlja pot praznjenja parazitske kapacitivnosti, ko vrstica ni napajana.

Omeniti velja, da se v praksi zdi učinek parazitske kapacitivnosti komaj opazen (če ga iščete, ga lahko najdete), zato menim, da je dodajanje tega dodatnega upora neobvezno. Učinek upočasnjenega časa nasičenih tranzistorjev je veliko močnejši in opazen. Kljub temu, če pregledate tri fotografije, navedene v tem razdelku, lahko vidite, da upori popolnoma odstranijo morebitne odseve, ki se še pojavljajo nad časom počasnega izklopa tranzistorja.

5. korak: Končna proizvodnja in naslednji koraki

Image
Image

Zadnja faza tega projekta je bila zame ustvariti tiskano vezje (PCB). Za oblikovanje tiskanega vezja sem uporabil odprtokodni program Fritzing. Čeprav je bilo treba postaviti veliko ponavljajočih se nalog, da postavimo 100 LED na ploščo 10x10, se mi je ta faza projekta dejansko zdela nenavadno zadovoljiva. Ugotovitev, kako bi se določila vsaka električna pot, je bila kot uganka, reševanje te uganke pa je ustvarilo občutek dosežka. Ker nisem nastavljen za proizvodnjo tiskanih vezij, sem uporabil enega od številnih spletnih virov, ki izvajajo majhne naklade tiskanih vezij po meri. Spajanje delov je bilo precej preprosto, saj je moj dizajn uporabil vse dele skozi luknje.

V času pisanja tega Instructable -a imam za svoje projekte RGB LED Matrix naslednje načrte:

  1. Nadaljujte z izboljševanjem gonilnika na sloju API, da programerju omogočite več funkcij na visoki ravni, predvsem drsenje besedila.
  2. Ustvarite večje matrične zasnove, na primer 16x16 ali celo 16x32.
  3. Raziščite uporabo MOSFET -ov namesto BJT -jev za preklapljanje moči vrstice
  4. Raziščite z uporabo gonilnikov konstantnega toka DM13A namesto 74HC595s za preklapljanje stolpcev
  5. Ustvarite gonilnike za druge platforme za mikro nadzor, na primer Teensy, ODROID C2 ali Raspberry Pi.

Upoštevajte, da sta bila zasnova strojne opreme in gonilnik izdana v okviru odprtokodne licence GPL v3 v tem skladišču GitHub. Poleg tega, čeprav proizvajalci tiskanih vezij izvajajo "majhne naklade" mojega tiskanega vezja, še vedno dobim veliko več, kot osebno potrebujem. Tako prodajam celotne komplete za različne modele RGB LED matric (PCB in vsi vključeni deli) na moji spletni strani tukaj.

Priporočena: