Taula de continguts:

Matriu LED RGB: 5 passos
Matriu LED RGB: 5 passos

Vídeo: Matriu LED RGB: 5 passos

Vídeo: Matriu LED RGB: 5 passos
Vídeo: Arduino Compatible Led Cube RGB 8x8x8 Palta Style 2024, Desembre
Anonim
Image
Image
Disseny de maquinari
Disseny de maquinari

Cerqueu instruccions i podeu trobar molts projectes de matriu de LED. Cap d’ells no era el que volia, que consistia en explorar les interaccions del disseny de maquinari i programari per produir alguna cosa, i produir el producte final en un bonic PCB amb un controlador que em permetrà dibuixar a la "pantalla LED" mitjançant un nivell alt construccions (per exemple, dibuixant una línia en lloc d’establir píxels específics). Aquesta part va ser important per a mi, ja que molts dels controladors de matriu de LED són ossos nus i no proporcionen gaire manera de crear una imatge o una animació per programació. Això no vol dir que no pugueu crear imatges i animacions amb els altres controladors, només que haureu de fer un treball més repetitiu de projecte en projecte.

Així que em vaig proposar complir la meva visió. El primer pas va ser dissenyar el maquinari. Aquest va ser probablement el més difícil per a mi, ja que els meus antecedents són més programari. De nou, hi havia molts dissenys precuinats i, sens dubte, els vaig utilitzar per inspirar-me, però volia aprendre fent, així que vaig prototipar una matriu 4x4 en una taula de treball. Vaig aprendre molt en aquest procés, ja que les meves primeres iteracions no funcionaven. Però vaig fer un disseny de maquinari que funcionava, cosa que em va permetre començar a desenvolupar un controlador.

Vaig triar l'Arduino com a plataforma de controladors perquè està àmpliament disponible i té moltes referències en línia. Tot i que l’experiència professional em va permetre arribar a una versió de treball d’un controlador més rígida que els esforços de maquinari, encara hi havia moltes iteracions mentre optimitzava el rendiment del controlador per al microcontrolador ATMega i desenvolupava una API de programació que m’agradava.

Aquest document instructiu documenta el disseny i alguns aprenentatges clau del meu projecte. Podeu trobar més informació sobre aquest projecte al meu lloc web, inclosos els kits complets que podeu comprar per construir la vostra pròpia matriu LED RGB.

Pas 1: disseny de maquinari

L’objectiu principal del meu disseny de maquinari era crear una sèrie de LED RGB que pogués programar, però tampoc no volia gastar molts diners. L’enfocament en què em vaig decidir va ser utilitzar els registres de desplaçament 74HC595 per controlar els LED. Per tal de minimitzar el nombre de registres de desplaçament necessaris, vaig disposar els LED RGB en un disseny de matriu on els ànodes comuns estaven lligats entre si en files i els cables del càtode vermell, verd i blau es lligaven en columnes. Per a la matriu 4x4, el diagrama del circuit semblava el diagrama del circuit adjunt.

Una cosa que notareu de seguida és que tenint en compte el circuit matricial, hi ha algunes configuracions d’il·luminació LED que no es poden fer amb tots els LED desitjats encesos al mateix temps. Per exemple, la matriu no pot il·luminar simultàniament dos LED diagonals els uns dels altres perquè l'alimentació de les files i les columnes farà que els dos LEDs oposats s'encenguin a la diagonal perpendicular als LED desitjats. Per solucionar-ho, utilitzarem el multiplexat per escanejar cada fila. Hi ha molts recursos al web que cobreixen la tècnica del multiplexat, no intentaré replicar-los aquí.

Com que faig servir LED d’ànode comuns, això significa que les files proporcionen energia positiva i les columnes s’enfonsen a terra. La bona notícia és que els registres de desplaçament 74HC595 poden generar i enfonsar energia, però la mala notícia és que tenen un límit en la quantitat d’energia que poden obtenir o enfonsar. Els pins individuals del 74HC595 tenen un consum de corrent màxim de 70 mA, però és millor mantenir menys de 20 mA. Els colors individuals dels nostres LED RGB tenen un dibuix aproximat de 20 mA. Això significa que el 74HC595 no pot alimentar directament tota una fila de LEDs si desitjo encendre'ls tots.

Per tant, en lloc d’alimentar la fila directament, el 74HC595 accionarà un transistor per a cada fila i el transistor activarà o desactivarà el corrent que alimenta la fila. Atès que el disseny utilitza un LED ànode comú, el transistor de commutació serà PNP. Si utilitzéssim un LED de càtode comú, el transistor de commutació seria NPN. Tingueu en compte que amb l’ús d’un transistor PNP per accionar una fila, la configuració del registre de desplaçament per activar-la ara es redueix, ja que un transistor PNP necessita un voltatge negatiu entre l’emissor i la base, que permetrà que el corrent positiu flueixi cap a la fila.

Una altra cosa a tenir en compte és la disposició de bits desitjada dels registres de desplaçament. És a dir, entre els registres de desplaçament, quins bits controlen quines files o columnes de la matriu. El disseny amb el qual he enviat és on el primer bit, o "bit més significatiu", enviat als registres de desplaçament encadenats en margarida, controla l'element vermell de la columna dels LEDs, el segon bit controla l'element verd de la primera columna, el tercer bit controla la primera columna element blau, el quart bit controla l'element vermell de la segona columna, … aquest patró es repeteix a través de les columnes d'esquerra a dreta. A continuació, el següent bit enviat controla l'última fila, o inferior, la següent, la segona a l'última fila, … això es repeteix fins que l'últim bit enviat, o "bit menys significatiu", controla la primera fila o superior de la matriu.

Finalment, havia de determinar quines resistències utilitzaria per a cadascun dels LED del LED RGB. Tot i que podríeu utilitzar la fórmula estàndard que combina el voltatge directe i el corrent desitjat per calcular la resistència necessària, vaig trobar que configurar el corrent de cada LED a 20 miliamperis resultava en un color blanc trencat quan tots els LED vermells, verds i blaus estaven engegats.. Així que vaig començar a fer-li un cop d’ull. Massa vermell al blanc significava augmentar els ohms de la resistència del LED vermell per reduir el corrent. Vaig repetir intercanviant resistències d’ohms diferents fins que vaig trobar una combinació que produïa un color blanc que em semblava correcte. La combinació final va ser de 180 Ω per al LED vermell, 220 Ω per al LED verd i 100 Ω per al LED blau.

Pas 2: construcció de maquinari: tauler de pa

Construcció de maquinari - Taula de pa
Construcció de maquinari - Taula de pa
Construcció de maquinari: tauler de pa
Construcció de maquinari: tauler de pa

La primera fase del constructor de maquinari va ser l’embarcament de pa. Aquí vaig fer una matriu 4x4 amb els LED RGB. Aquesta matriu requeriria 16 bits per controlar, 12 per a les columnes RGB i 4 per a cada fila. Dos registres de desplaçament 74HC595 ho poden gestionar tot. Primer vaig investigar i vaig dissenyar un circuit que pensava que funcionaria, i després el vaig construir a la taula de treball.

Probablement, el repte més gran de la construcció de taulers de suport va ser gestionar tots els cables. Vaig agafar un kit de filferro preformat per a taulers, però va ser una mica difícil. Un truc que em va semblar útil era crear un "port" per connectar-se a la placa Arduino. És a dir, en lloc de connectar els pins de l’Arduino directament als diversos pins IC de la placa de paret, dediqueu unes quantes files a la placa de configuració a ser el punt de connexió de l’Arduino i, a continuació, connecteu els pins d’ID corresponents a aquestes files. Per a aquest projecte, només necessiteu cinc connexions a l'Arduino: + 5 V, terra, dades, rellotge i latch.

Un cop feta la construcció de la taula, calia provar-la. No obstant això, sense cap mena de controlador que enviés els senyals adequats als registres de desplaçament, no vaig poder provar si el disseny del maquinari funcionava.

Pas 3: disseny de programari de controladors

Image
Image

Donada la meva pròpia experiència professional amb el desenvolupament de programari, aquesta va ser la part del projecte que probablement tenia més clara sobre un camí a seguir. Vaig examinar molts dels altres controladors de matriu LED basats en Arduino. Tot i que certament hi ha bons controladors disponibles, cap tenia el disseny que volia. Els meus objectius de disseny del conductor eren:

  • Proporcioneu una API d’alt nivell per poder crear imatges i animacions per programació. La majoria dels conductors que vaig veure estaven més centrats en imatges codificades. A més, com que sóc programador de C ++ d’ofici, volia utilitzar un bon disseny orientat a objectes per implementar i gestionar les activitats de dibuix a la matriu LED.
  • Utilitzeu un enfocament de doble memòria intermèdia per gestionar la imatge a la pantalla. Una memòria intermèdia és la que s'aconsegueix mitjançant la programació, mentre que l'altra representa l'estat dels píxels de la matriu en un moment donat. L’avantatge d’aquest enfocament és que no se us demana que renderitzeu completament la següent actualització de fotogrames per a la pantalla entre els cicles d’actualització del multiplexat.
  • Utilitzeu PWM per permetre més dels set colors primitius que un RGB pot representar mitjançant combinacions simples dels elements vermell, verd i blau.
  • Escriviu el controlador de manera que "només funcioni" amb matrius LED RGB de diferent mida que seguien el meu enfocament general de disseny de matrius. Tingueu en compte que, tot i que el meu disseny de maquinari utilitza registres de desplaçament 74HC595, espero que el meu controlador funcioni amb qualsevol mecanisme d’encès / apagat d’estil de registre de desplaçaments que es distribueix utilitzant un disseny de bits similar al disseny del maquinari. Per exemple, espero que el meu controlador funcioni amb un disseny de maquinari que utilitzava xips DM13A per controlar les columnes i un xip 74HC595 per controlar les files.

Si voleu mirar directament el codi del controlador, podeu trobar-lo a GitHub aquí.

La primera iteració del meu controlador va ser una mica una corba d’aprenentatge sobre les capacitats de la plataforma Arduino. La limitació més evident és la memòria RAM, que és de 2K bytes per a Arduino Uno i Nano. Sovint no es recomana utilitzar objectes C ++ en aquest escenari a causa de la sobrecàrrega de la memòria dels objectes. Tot i això, em va semblar que si es feia bé, l’avantatge dels objectes en C ++ superava el seu cost (en memòria RAM).

El segon gran repte va ser determinar la nostra manera d’implementar la modulació d’amplada de pols mitjançant els registres de desplaçament per poder generar més dels set colors primitius del LED RGB. Després d’haver-me programat durant molts anys en plataformes Linux, estava acostumat a utilitzar construccions com a fils per gestionar processos que requereixen un temps coherent. El moment de l'operació d'actualització del registre de desplaçaments acaba sent força crític quan es fa un controlador per a una matriu de LED que utilitza multiplexació. La raó és que, tot i que el multiplexat es produeix tan de pressa que els vostres ulls no poden veure els LED individuals parpellejant i apagant-se, els vostres sí poden detectar diferències en el temps total agregat durant el qual hi ha un LED. Si una fila de LEDs està sempre encesa durant un període de temps més llarg que les altres, es veurà més brillant durant el multiplexat. Això pot provocar una brillantor desigual a la matriu o un estroboscòpic periòdic de la matriu en general (això passa quan un cicle d’actualització triga més que els altres).

Com que necessitava un mecanisme de sincronització consistent per provocar el consentiment de les actualitzacions del registre de desplaçament, però l'Arduino no admet formalment el fil, vaig haver de crear el meu propi mecanisme semblant al fil. La meva primera iteració va ser simplement crear un temporitzador de bucle que depengués de la funció Arduino loop () i activés una acció quan hagi transcorregut un cert temps des de la darrera vegada que es va disparar l'acció. Aquesta és una forma de "multitasca cooperativa". Sona bé, però a la pràctica això va resultar inconsistent quan es va mesurar la velocitat de tret en microsegons. La raó d'això és que si tenia dos d'aquests temporitzadors en bucle, una de les seves accions sovint trigava prou per provocar que la segona acció s'executés més tard del desitjat.

Vaig trobar que la solució a aquest problema és utilitzar el mecanisme d’interrupció del rellotge natiu d’Arduino. Aquest mecanisme us permet executar una mica de codi a intervals molt consistents. Per tant, vaig dissenyar el codi del controlador al voltant de l'element de disseny d'utilitzar una interrupció de rellotge per activar el codi per enviar els registres de desplaçament de la matriu la propera actualització del cicle de multiplex. Per fer-ho i permetre que es produeixin actualitzacions a la imatge de la pantalla per no interferir amb un abocament actiu als registres de desplaçament (cosa que anomenaríem "condició de carrera"), vaig utilitzar un enfocament de tenir búfers bessons per als bits de registre de desplaçament, un per escriure i un per llegir. Quan l'usuari actualitza la imatge de la matriu, aquestes operacions es produeixen al buffer d'escriptura. Quan aquestes operacions es completen, les interrupcions es suspendran temporalment (això vol dir que la interrupció del rellotge no pot activar-se) i la memòria intermèdia d’escriptura s’intercanvia amb la memòria intermèdia de lectura anterior i no és la memòria intermèdia de lectura nova, llavors les interpretacions es tornen a activar. Aleshores, quan la interrupció del rellotge s'activa indicant que és hora d'enviar la següent configuració de bits als registres de desplaçament, aquesta informació es llegeix des del buffer de lectura actual. D'aquesta manera, no es produeix cap escriptura en cap memòria intermèdia que es pugui llegir actualment durant una interrupció de rellotge, cosa que podria corrompre la informació enviada als registres de desplaçament.

Dissenyar la resta del controlador va ser un cas relativament senzill de disseny orientat a objectes. Per exemple, he creat un objecte per gestionar la imatge de bit de registre de desplaçament per a qualsevol estat de pantalla determinat. En encapsular el codi pertanyent a la gestió d’imatges de bits, la creació de l’esmentat enfocament de memòria intermèdia bessó va ser un exercici senzill. Però no vaig escriure aquest manual per exaltar les virtuts del disseny orientat a objectes. Un altre element de disseny inclou el concepte d’un glifo i una imatge RGB. Un glifo és una construcció bàsica d’imatges que no té informació de color innata. Es pot pensar com una imatge en blanc i negre. Quan el glifo es dibuixa a la pantalla LED, es proporciona informació de color per indicar com s'han de pintar els píxels "blancs". Una imatge RGB és una imatge on cada píxel té la seva pròpia informació de color.

Us animo a revisar els exemples d'esbossos d'Arduino i revisar la documentació de la capçalera del controlador per familiaritzar-vos amb l'ús del controlador per crear imatges i animacions en una matriu LED RGB.

Pas 4: LED Ghosting

LED Ghosting
LED Ghosting
LED Ghosting
LED Ghosting

En una matriu de LED, el "fantasma" és el fenomen d'un LED de la matriu que brilla quan no es vol, normalment un nivell molt reduït. El meu disseny de maquinari original era susceptible a la creació de fantasmes, sobretot a la darrera fila. La causa d'això es deu a dues coses: els transistors no s'apaguen immediatament i la capacitat paràsita als LED RGB.

Mentre explorem les files, a causa del fet que els transistors no s'apaguen immediatament, la fila anterior del cicle d'escaneig encara s'alimenta parcialment quan s'activa la fila següent. Si una columna determinada que estava apagada a la fila anterior s'encén recentment quan s'encén la nova fila, el LED de la columna de la fila anterior brillarà durant una estona mentre el transistor de commutació d'aquesta fila anterior encara està en procés de gir apagat. El que fa que el transistor trigui un temps notable a apagar-se és la saturació a la base del transistor. Això fa que el camí del transistor col·lector-emissor continuï conduint-se quan s’elimina el corrent de la base, almenys fins que es dissipa la saturació. Tenint en compte que el nostre cicle d’actualització de multiplexació fa que les files s’activen a propòsit durant un període de temps mesurat en microsegons, la quantitat de temps que el transistor saturat de la fila anterior es manté conductor pot ser una fracció notable d’aquesta. Com a resultat, el vostre ull pot percebre aquella quantitat molt petita de temps que s’encén el LED de la fila anterior.

Per solucionar el problema de saturació del transistor, es pot afegir un díode Schottky al transistor entre la base i el col·lector per provocar una mica de corrent posterior a la base quan el transistor està engegat, evitant que el transistor es saturi. Això al seu torn farà que el transistor s'apagui més ràpidament quan s'elimini el corrent de la base. Consulteu aquest article per obtenir una explicació en profunditat d’aquest efecte. Com es pot veure a la imatge d’aquesta secció, sense el díode, el fantasma és bastant notable, però si afegiu el díode al circuit de cada fila, s’elimina significativament el fantasma.

Els LED RGB són susceptibles a un altre fenomen anomenat capacitat paràsita. La causa fonamental d’això és el fet que cadascun dels tres LED de colors de la unitat de LED RGB té diferents tensions cap endavant. Aquesta diferència de tensions directes pot causar l’efecte de la capacitat elèctrica entre cadascun dels colors LED individuals. Atès que es genera una càrrega elèctrica a la unitat LED quan s’alimenta, quan s’elimina l’alimentació, cal descarregar la capacitat paràsita. Si aquesta columna LED està activada d'una altra manera per alimentar una altra fila, la càrrega paràsita es descarregarà a través d'aquest LED de columnes i farà que brilli breument. Aquest efecte s’explica molt bé en aquest article. La solució és afegir un camí de descàrrega per a aquesta càrrega paràsita que no sigui a través del propi LED, i després donar-li temps al LED perquè es descarregui abans que la columna es torni a alimentar. En el meu disseny de maquinari, això s'aconsegueix afegint una resistència a la línia elèctrica de cada fila que connecta la força a terra. Això provocarà que es generi més corrent amb la fila que s’alimenta, però proporciona un camí de descàrrega per a la capacitat paràsita quan la fila no s’alimenta.

Val a dir, però, que a la pràctica trobo que l’efecte de la capacitat paràsita amb prou feines es nota (si el cerqueu, el podreu trobar) i, per tant, considero opcional l’addició d’aquesta resistència addicional. L’efecte del temps d’aturada lent dels transistors saturats és molt més notable i notable. Tot i això, si inspeccioneu les tres fotos que es proporcionen en aquesta secció, podreu veure que les resistències eliminen completament els fantasmes que encara es produeixen més enllà dels temps d’aturada del transistor lent.

Pas 5: fabricació final i passos següents

Image
Image

La fase final d’aquest projecte va consistir en crear una placa de circuit imprès (PCB). Vaig utilitzar el programa de codi obert Fritzing per dissenyar el meu PCB. Tot i que hi havia moltes tasques repetitives a realitzar per dissenyar 100 LEDs en una placa de 10x10, realment em va semblar estranyament satisfactòria aquesta fase del projecte. Esbrinar com es traçaria cada ruta elèctrica va ser com un trencaclosques i resoldre aquest trencaclosques va crear una sensació d’acompliment. Com que no estic configurat per fabricar les plaques de circuit, he utilitzat un dels molts recursos en línia que fan petites proves de PCB personalitzades. Soldar les peces juntes era bastant senzill, ja que el meu disseny feia servir totes les peces del forat.

En el moment d’escriure aquest Manual d’instruccions, tinc els següents plans per als meus projectes RGB LED Matrix:

  1. Continueu millorant el controlador a la capa API per permetre al programador més funcions d'alt nivell, sobretot el desplaçament de text.
  2. Creeu dissenys de matriu més grans, com ara 16x16 o fins i tot 16x32.
  3. Exploreu l'ús de MOSFET en lloc de BJT per canviar l'alimentació de la fila
  4. Exploreu utilitzant controladors de corrent constant DM13As en lloc de 74HC595 per al canvi de columna
  5. Creeu controladors per a altres plataformes de microcontrol, com ara Teensy, ODROID C2 o Raspberry Pi.

Tingueu en compte que tant el disseny de maquinari com el controlador s'han llançat sota la llicència de codi obert GPL v3 en aquest dipòsit de GitHub. A més, ja que tot i que els fabricants de PCB fan "petites proves" del meu disseny de PCB, encara tinc molt més del que necessito personalment. Així que estic venent kits complets per als meus diversos dissenys de matriu LED RGB (PCB i totes les parts incloses) des del meu lloc web aquí.

Recomanat: