Arduino care conectează o matrice LED 8x8

Acest articol a fost creat pentru cei care au cumpărat o matrice goală 8x8 și registre de deplasare 74hc595 și nu știu cum să le conecteze pe toate.

Am căutat mult timp pe Internet instrucțiuni despre cum să conectez componentele de mai sus, dar le-am găsit fie nu pentru registrele mele, fie cu schițe care nu funcționează, așa că am decis că va trebui să lucrez în continuare cu mâinile și capul înăuntru. pentru a mă mulțumi cu poze 8*8.

După ce am găsit fișele de date pentru registrele de matrice și de deplasare pe Internet, am desenat următoarea diagramă:

Al 12-lea picior al ambelor microcircuite (pin de blocare), pentru a salva porturile, este comun, deoarece nu are rost să blocați registrele în timpuri diferite. Unii dintre pinii matricei (anozi) sunt conectați prin rezistențe de limitare a curentului cu o valoare nominală de 220 ohmi. Orice altceva conform schemei este extrem de simplu. Pentru orice eventualitate, poze cu pinout-ul matricei.

Imaginile vor trebui să fie scoase linie cu linie (nici un alt mod cu astfel de matrici), cu o mică întârziere (ochiul uman practic nu distinge o întârziere de 1 ms).

Am încercat să explic totul în schiță. Când este încărcat pe placă, afișajul va afișa numere pe care le vom trimite către monitorul portului Arduino (vezi videoclipul).

Fotografie a dispozitivului terminat (există un zig-zag pe ecran, în schiță imaginea sa este stocată în matricea de imagini)

Pe viitor voi încerca să fac ceva interesant pe acest display.

În cele din urmă, modulele matrice au sosit din Regatul Mijlociu. Fiecare modul constă dintr-un microcircuit MAX7219 (), o matrice LED și există un condensator și un rezistor în cablaj.


Controlat de MAX7219 prin interfața SPI.


Cipurile din cluster sunt conectate în serie. Am citit pe internet că conexiunea serială maximă posibilă permite doar 8 bucăți MAX7219. Nu crede. Am conectat 16 module și totul funcționează excelent.

Modulele prezentate pe Ali vin în mai multe versiuni. Cele mai populare sunt 2 tipuri: cu un cip în DIP și în pachete SOIC. Modul cu cip DIP dimensiune mai mareși nu atât de convenabil atunci când vă conectați la un cluster. Va trebui să vă conectați cu o grămadă de fire.


Modulele cu un cip într-un pachet SOIC au dimensiunea unei matrice LED și sunt conectate prin lipire sau jumperi. Se dovedește frumos și îngrijit.


Cele mai cunoscute biblioteci pentru lucrul cu matrice și clustere sunt Panou MAX72xx de Mark RiceŞi Parola de MajicDesigns: Prima bibliotecă este mai ușor de utilizat, a doua este mai complexă, cu mai multe capabilități. O voi descrie mai detaliat.

Panou MAX72xx

Când utilizați MAX72xx Panel, biblioteca trebuie să fie instalată Adafruit GFX.

Pentru a rusifica textul, va trebui să descărcați ACEST FIȘIERși înlocuiți fișier standard glcdfont.c în directorul Arduino/Libraries/Adafruit-GFX-Library-master. Tot în acest fișier, pe lângă literele și cifrele necesare, sunt descrise o grămadă de tot felul de simboluri. Nu toate pot fi utile. Imaginea de mai jos explică modul în care sunt formate simbolurile.

Dacă este necesar, puteți crea propriile simboluri și puteți înlocui cu ele pe cele neutilizate din fișier. Aproape toate fonturile cu puncte utilizate în diferite biblioteci sunt formate într-un mod similar.

Deci, MAX72xx Panel și bibliotecile Adafruit GFX sunt instalate, fișierul glcdfont.c este înlocuit. Lansați Arduino IDE, deschideți FIŞIER. Schița conține funcția utf8rus. Oferă conversia tabelului de caractere pentru limba rusă. Este necesar numai pentru ieșirea normală din program, adică în program textul necesar este scris în rusă. Dacă textul este introdus prin portul COM, atunci codurile de caractere sunt corectate în funcția Serial_Read. Dezvoltatorii au folosit diferite codificări în IDE și în consolă.

La începutul fișierului există linii necesare pentru ca biblioteca să funcționeze.

int numberOfHorizontalDisplays = 1;

int numberOfVerticalDisplays = 16;

Am module cu microcircuit într-un pachet SOIC. Au o mică particularitate. Matricea modulelor este instalată rotită la 90 de grade. Aceasta este o taxă pentru confortul conexiunii. Dacă rulați schițele care vin cu bibliotecile, acestea vor scoate text de jos în sus în fiecare modul. Textul va apărea în zig-zag. Pentru a rezolva această problemă, bibliotecii trebuie „spus” că există 16 afișaje verticale (din punct de vedere fizic, acestea sunt situate orizontal). Și apoi, în void Setup, specificați linia către bibliotecă

matrix.setRotation(matrix.getRotation() + 1);

Va inversa fiecare matrice în mod programatic. Și totul va fi afișat normal.

Modulele cu pachete de cip DIP nu au acest lucru. Totul este frumos acolo, cu excepția unei grămadă de fire.

Biblioteca MAX72xx Panel este destul de modestă. Nu există efecte vizuale de ieșire. Clusterul este perceput ca un întreg. Lucrurile stau mult mai bine cu MD Parola.

Parola de MajicDesigns.

Proprietarii de module cu un cip într-un pachet SOIC se vor confrunta și cu problema orientării modulelor în cluster. Arată puțin diferit față de MAX72xx. Aici modulele vor părea să nu fie în ordine.


Schiță HelloWorld din mostre incluse cu biblioteca.

Nu am reușit să vindec această boală în mod programatic în schiță. L-am tratat diferit. În fișierul Adruino/libraries/MD_MAX72xx_lib.h la sfârșit trebuie să găsiți liniile ca în imagine.


Și corectați 1 la 0 evidențiat în linia selectată Salvați fișierul. Arduino IDE nu trebuie repornit. Hai să-l umplem și să aruncăm o privire.


Acum puteți folosi 24 de efecte de animație. Animația este pornită cu comanda P.displayText("Text to display", "text alignment", viteza, întârziere afișare, efect de apariție, efect de dispariție). După cum puteți vedea, există destul de multe setări.

Și cea mai bună parte este împărțirea clusterului în zone virtuale. Lucrul cu zonele nu este foarte dificil. Nu postez schița, este în mostrele care vin cu bibliotecă. Acum puteți afișa un ceas la începutul clusterului și un ticker de știri pe modulele rămase fără probleme, aproape.

După cum ați ghicit deja, problema este cu literele chirilice. Este, de asemenea, rezolvabil. Lângă fișierul anterior din același director se află fișierul MD_MAX72xx_font.cpp. Acesta este un fișier cu fonturi. Caracterele din acesta sunt formate în mod similar cu fișierul de fonturi din bibliotecă GFX. Există o mică diferență. Aici dimensiunea simbolului poate fi mai mică de 5 puncte. În biblioteca Adafruit GFX, un semn de exclamare, de exemplu, ocupă aceeași lățime de 5 puncte ca orice alt simbol, este folosit doar un rând de puncte. Restul nu se aprind, ci sunt folosite ca simbol. În Parola, același semn de exclamare ocupă și un rând de puncte, doar că nu există puncte goale în apropiere, dar pot apărea simboluri adiacente. Va fi mai clar din imagine.


Nu există încă timp să adăugați caractere chirilice la fișier în același mod ca fișierul din prima bibliotecă discutată. Dacă cineva face asta și îmi trimite un fișier, îl voi adăuga la acest articol, iar atât eu, cât și oaspeții site-ului meu vă vom fi recunoscători.

Concluzie. Biblioteca MAX72xx Panel de la Mark Rice este ușor de utilizat și de înțeles, dar are o funcționalitate slabă.

Biblioteca Parola de la MajicDesigns este mai complexă și capabilitățile sale sunt suficiente pentru aproape orice aplicație.


China oferă un preț scăzut cantitate uriașă nu numai dispozitivele electronice, ci și componentele acestora. O matrice mică formată din diode emițătoare de lumină poate afișa informațiile de care aveți nevoie, probabil că acestea sunt numere, deoarece rezoluția nu este foarte mare, 8 x 8 LED-uri, fiecare cu un diametru 3 mm. Această matrice strălucește în roșu, deoarece este cea mai vizibilă și atrage atenția mai mult decât alte culori.


Cel mai convenabil este să utilizați această matrice pentru a controla Arduino, pentru că este digital. Dacă scrieți un program simplu, puteți afișa informatiile necesare pe acest „ecran” LED. Există la vânzare matrici mai scumpe în trei culori, în care puteți crea aproape orice culoare combinând cele trei culori principale.


Această matrice are 16 pini mai sus este o diagramă care arată clar modul în care sunt conectate componentele elementare ale matricei - LED-urile - urmând-o puteți conecta corect modulul pentru a reproduce informații atât cu un dispozitiv digital, cât și cu un dispozitiv analog; Nu uitați de rezistențele de limitare a curentului, va fi trist dacă unii pixeli se vor arde. Curentul nominal continuu al unui punct este egal cu 20 mA, curent de vârf 100 mA, tensiune de alimentare 2,1-2,1 V, lungime de undă 625-630 nm, puterea maximă de disipare este de 40 mW, anodul este comun aici, adică un plus. Dimensiuni matrice LED 37 pe 37 pe 8 mm. Trebuie să lipiți cu atenție, nu atingeți fierul de lipit la o temperatură de 260 de grade mai mult de 5 secunde, temperatura de funcționare recomandată este -40 - +70 Celsius.

Dacă aveți mai multe dintre aceste matrice LED, le puteți conecta pentru a crea afișaje mari de informații.

În lecțiile anterioare am învățat folosind un registru de deplasare. Acest lucru s-a dovedit a fi puțin mai dificil decât direct din pinii de uz general. Problema pe care a trebuit să o rezolvăm apoi a fost numărul limitat de pini controlabili de pe controlerul Arduino. Apogeul cercetării noastre a fost utilizarea afișajului dinamic pentru. Acum este timpul să complicăm puțin mai mult sarcina: să învățăm cum să lucrăm cu o matrice LED.

1. Indicator matrice

După cum știm deja, indicatorii de segment, fie că sunt scale sau numere, constau din LED-uri individuale conectate împreună. De exemplu, un grup de LED-uri poate avea toți catozii conectați. Un astfel de indicator are prefixul „cu un catod comun”, în caz contrar - „cu un anod comun”. Ce se va întâmpla dacă plasăm LED-urile nu sub forma unui număr sau a unei scale, ci sub forma unei grile? Acum veți avea un indicator destul de grafic. Adică unul pe care puteți afișa nu numai un număr, ci și un fel de imagine. O astfel de grilă se numește un indicator de matrice, iar în cazul utilizării LED-urilor, o matrice LED. Rezoluția unui indicator de matrice este numărul de puncte orizontale și verticale. De exemplu, cei mai comuni indicatori au o rezoluție de 8x8 pixeli. Dacă este necesară o matrice LED cu rezoluție înaltă, atunci aceasta este pur și simplu alcătuită din mai mulți indicatori 8x8. Vom vedea cum să facem asta mai târziu. Între timp, să ne dăm seama cum sunt conectate toate cele 64 de LED-uri din interiorul matricei. Desigur, ar fi posibil, ca și în cazul unui indicator cu șapte segmente, să se conecteze toate LED-urile cu un catod sau anod comun. În acest caz, am avea nevoie fie de 64 de pini de controler, fie de 8 registre de deplasare. Ambele variante sunt foarte risipitoare. O opțiune mai corectă este să combinați LED-urile în grupuri de 8 bucăți cu un catod comun. Fie acestea să fie coloanele matricei. Apoi, LED-urile paralele din aceste coloane sunt combinate din nou în grupuri de 8 bucăți cu un anod comun. Veți obține această diagramă:
Să presupunem că sarcina este să aprindeți LED-ul R6C3. Pentru a face acest lucru, va trebui să trimitem nivel înalt semnal la pinul R6 și conectați pinul C3 la masă. Fără a opri acest punct, să încercăm să aprindem altul - R3C7. Conectam contactul de putere pozitiv la R3 și masa la C7. Dar, în acest caz, rândurile R6 și R3 se vor intersecta cu coloanele C3 și C7 în nu două, ci patru locuri! În consecință, nu două, ci patru puncte se vor aprinde. Problemă! Evident, același lucru poate ajuta. Dacă activăm pe rând punctele R6C3 și R3C7 foarte repede, putem folosi persistența vederii - capacitatea de a interpreta imaginile care se schimbă rapid ca un întreg.

2. Matrice LED și registre de deplasare

În tutorialul nostru vom conecta cea mai simplă matrice LED roșie 8x8 la Arduino Uno. Numerotarea pinului începe din colțul din stânga jos. În același timp, numerotarea picioarelor 1-16 nu este conectată prin nicio logică cu numerotarea coloanelor și a rândurilor C și R.
Concentrându-ne pe lecția despre afișarea dinamică, vom încerca să folosim registre de deplasare de 8 biți în circuitul de control al indicatorului matriceal. Vom conecta un registru la ieșirile indicatorului responsabile pentru coloane, iar al doilea la ieșirile de rând. Diagrama schematică
Notă importantă #1. Este necesar ca rezistențele din acest circuit să fie pe liniile care vin din primul registru de deplasare. Acest registru de deplasare este responsabil pentru coloane. Cu această conexiune, fiecare rezistor va seta curentul pentru un singur LED la fiecare pas al algoritmului dinamic. Prin urmare, toate LED-urile vor străluci uniform. Notă importantă #2. Diagrama de mai sus are doar scop informativ. Ar fi mai corect să se includă un microcircuit suplimentar de putere, de exemplu un ansamblu tranzistor ULN2003, în decalajul dintre al doilea registru și matrice.

3. Program

Pentru a face mai distractiv, să încercăm să afișăm o față zâmbitoare pe indicator. După cum sa menționat deja, pentru a afișa imaginea pe matrice vom folosi afișarea dinamică. Și anume, ne vom evidenția imaginea linie cu linie. Mai întâi, haideți să aprindem difuzoarele necesare chiar în loc linia de sus, apoi în a doua, în a treia și așa mai departe pentru toate cele 8 linii. Primul registru de schimbare va fi responsabil pentru coloane, iar al doilea pentru rânduri. Prin urmare, ieșirea unei linii va consta din două intrări consecutive în registru: mai întâi transmitem codul liniei, apoi codul punctelor din această linie. În acest program vom folosi și o versiune mai rapidă a funcției digitalWrite. Acest lucru este necesar pentru ca procesul de afișare dinamică să aibă loc foarte rapid. În caz contrar, vom vedea o pâlpâire vizibilă a matricei. Cod sursă const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; unsigned long tm, next_flick; const unsigned int to_flick = 500; linia octet = 0; date const byte = ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b001); void latchOn())( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; line++; if(line == 8) line = 0; // trece codul de linie de umplere(~(1)<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flickși funcția umple ne sunt deja cunoscute din lecţiile despre şi despre. Matrice date stochează opt rânduri din imaginea noastră. Pentru a economisi memorie, am înregistrat fiecare combinație de puncte în formă binară. Funcţie latchOn deschide zăvorul registrului. Acest lucru ar trebui făcut numai după ce ambele registre de deplasare sunt pline. După descărcarea programului pe Arduino, pe indicator va apărea un zâmbet.

4. Animație pe matricea LED

Acum să modificăm programul, astfel încât imaginea de pe indicator să se schimbe la fiecare jumătate de secundă. Pentru a face acest lucru, să ne amintim din nou.<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; unsigned long tm, next_flick, next_switch; const unsigned int to_flick = 500; const unsigned long to_switch = 500000; linia octet = 0; cadru octet = 0; const byte data = ( ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b001, 0b001, 0b001), 0 00010, 0b10100101, 0b10000001, 0b10000001, 0b10111101, 0b01000010, 0b00111100 )); void latchOn())( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<<(7-line))); fill(data); latchOn(); } tm = micros(); if(tm >next_flick)( next_flick = tm + to_flick; line++; if(line == 8) line = 0; fill(~(1)

next_switch)( next_switch = tm + to_switch; frame = !frame; ) ) Încărcați programul pe Arduino și observați rezultatul.

5. Scalare matrice LED

O matrice LED 8x8 este potrivită pentru afișarea a două numere sau a unui simbol simplu. Dacă doriți să afișați o imagine mai mult sau mai puțin utilă pe indicator, trebuie să combinați matricele. Acest lucru se realizează prin adăugarea de noi registre de deplasare atât pe verticală, cât și pe orizontală. Trebuie remarcat faptul că viteza controlerului Arduino Uno împreună cu registrele de deplasare este suficientă doar pentru un afișaj de 16x16. Creșterea în continuare a dimensiunii afișajului LED va duce la o pâlpâire vizibilă.

  • Misiuni
  • Hipnoza. Programați controlerul în așa fel încât pe matricea LED-urilor să apară cercuri concentrice cu o rază în continuă creștere cu o perioadă de 1 secundă.
  • Nivel electronic. Adăugați un accelerometru la circuit. Scrieți un program care va afișa un punct pe matricea LED, ale cărui coordonate depind de înclinarea întregului dispozitiv. De exemplu, atunci când dispozitivul este fixat paralel cu solul (perpendicular pe vectorul gravitațional), punctul este în centru. Când nivelul electronic este înclinat spre stânga, punctul se deplasează proporțional spre dreapta.

Concluzie

După ce au asamblat un circuit de control al matricei, mulți ar putea avea o întrebare: „Ei bine, în 30 de ani, nimeni nu a venit cu o modalitate mai simplă de a lucra cu matricea?” De fapt, au venit cu asta. Există microcircuite specializate pentru lucrul cu diferite tipuri de afișaje, inclusiv pentru lucrul cu o matrice LED. Într-una dintre următoarele lecții vom învăța cum să controlăm indicatorul folosind cipul MAX7219. Această metodă ne va permite să combinăm cu ușurință mai multe matrice într-un singur afișaj mare, fără a fi nevoie să complicăm foarte mult circuitul electric.