Schema de conectare a afișajului Arduino 8x8.

Afișaj matrice - un dispozitiv format dintr-o matrice LED 8x8 și o placă de control bazată pe cipul MAX7219 cu conducta minimă necesară. În fotografie puteți vedea deja dispozitivul terminat, dar mi-a venit prin poștă în acest formular, așa că a trebuit să iau un fier de lipit și să lipim totul în mod corect.

Conexiunea de bază la placa Arduino Nano este prezentată în schema de circuit.

După cum puteți vedea din diagramă, totul este simplu, trebuie doar să conectați contactele ambelor plăci cu fire în următoarea ordine:

Arduino NanoMatrice 8x8
PIN 12PIN DIN
PIN 11PIN CLK
PIN 10PIN CS
PIN 5VPIN 5V
PIN GNDPIN GND

Deci, în sfârșit, este timpul să lucrați cu codul și, pentru a rula matricea LED, trebuie să descărcați și să instalați biblioteca LedControl. Biblioteca acceptă microcircuite MAXIM 7221 și 7219. Matricea LED folosește ca driver MAX7219, de asta avem nevoie. Cred că ar trebui să începem cu o mică schiță care să demonstreze funcțiile de bază ale acestei biblioteci. În schiță, funcția setRow() este folosită pentru a porni/opri LED-urile. Sintaxa pentru apelarea funcției setRow() este:

matrix.setRow(0, row, col, set);

Unde matrice- obiect de clasă LedControl

0 - adresa dispozitivului pe magistrala SPI, în acest caz există un singur dispozitiv, iar numerotarea începe de la adresa zero

rând- rând (valori posibile de la 0 la 7)

col- coloană (Valorile posibile sunt de la 0 la 7)

a stabilit- valoarea de setare( Adevărat- aprinde, fals- opriți)

matrix.setRow(0, 1, 4, adevărat)

Porniți LED-ul de pe matrice, situat în primul rând și în a 4-a coloană.

Alt exemplu:

int x = 1;

int y = 4;

matrix.setRow(0, x, y, true);

matrix.setRow(0, x, y, false);

Același lucru este numai cu utilizarea variabilelor și stingerea ulterioară a LED-ului aprins la coordonatele date. Deci, în schiță, mai multe animații sunt redate folosind funcția setRow ().

#include "LedControl.h" //Sintaxă pentru crearea clasei LedControl(dataPin,clockPin,csPin,numDevices) //Unde LedControl este un obiect al clasei //dataPin este pinul de pe placa Arduino la care va fi pinul DIN fi conectat //clockPin este pinul de pe placa Arduino la care va fi conectat pinul CLK //csPin - pinul de pe placa Arduino la care se va conecta pinul CS //numDevices - numărul de dispozitive de pe magistrală / /Creează un obiect din clasa matricei în cazul nostru cu un dispozitiv conectat LedControl matrice = LedControl(12, 11 , 10, 1); //Timp de întârziere pentru pornirea/oprirea LED-ului de pe matrice const int delayValue = 100; //Prototipuri de funcții //Activare/oprire secvenţială void PointSerialSet(); //Sarpe de la dreapta la stânga void PointRigthToLeft(); //Sarpe de jos în sus void PointDownToUp(); //Sarpe de la stânga la dreapta void PointLeftToRigth(); //Sarpe de sus în jos void PointUpToDown(); //Efect - fading pulse void PointFading(); //Efect - puls void PointPulse(); //Efect - impuls în creștere void PointClimbing(); //Efectul de răsucire a spiralei în interiorul void PointToSpiralIn(); //Efectul de rotire a spiralei spre exterior void PointToSpiralOut(); void setup() ( // Dispozitivul cu adresa 0 trezire implicit matrix.shutdown(0, false); //Setați luminozitatea matricei Led la 8 //Valorile posibile sunt de la 0 la 15 matrix.setIntensity( 0, 8) ; //Ștergeți afișarea matrix.clearDisplay(0); ) void loop() ( //Apelați funcțiile unul câte unul PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading (); PointPulse() ; PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Corpii funcție void PointSerialSet() ( //Utilizați funcția setLed(adresă, rând, col, set) //Pornire secvențială prin rânduri pentru(int i = 0; i< 8; i ++) { for(int j = 0; j < 8; j ++) { //Включить светодиод matrix.setLed(0, i, j, true); delay(delayValue); //Выключить светодиод matrix.setLed(0, i, j, false); } } } void PointRigthToLeft() { //Используем функцию setLed(address, row, col, set) //Змейка справа - налево for(int i = 7; i >= 0; i --) ( pentru(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointDownToUp() ( //Utilizați funcția setLed(adresă, rând, col, set) //Șarpe de jos în sus pentru (int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointLeftToRigth() ( //Utilizați funcția setLed(adresă, rând, col, set) //Șarpe de la stânga la dreapta pentru (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointUpToDown() ( //Utilizați funcția setLed(adresă, rând, col, set) //Șarpe de sus în jos pentru (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointFading() ( //Utilizați funcția setLed(adresă, rând, col, set) //Efect de estompare int upValue = 0 ; int downValue = 7; for(int i = 0; i< 8; i ++) { if(i % 2) { for(int n = downValue; n >= upValue; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue --; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue ++; } } } void PointClimbing() { //Используем функцию setLed(address, row, col, set) //Эффект затухания int upValue = 4; int downValue = 4; for(int i = 0; i < 8; i ++) { if(i % 2) { for(int n = downValue; n >= upValue; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue ++; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue --; } } } void PointPulse() { //Используем функцию setLed(address, row, col, set) //Эффект пульса for(int i = 0; i < 8; i ++) { if(i == 4) { for(int climb = i; climb >= 0; climb --) ( matrix.setLed(0, climb, i, true); delay(delayValue / 4); matrix.setLed(0, climb, i, false); ) for(int fade = 1; fade< 8; fade ++) { matrix.setLed(0, fade, i, true); delay(delayValue / 4); matrix.setLed(0, fade, i, false); } } else { matrix.setLed(0, 4, i, true); delay(delayValue); matrix.setLed(0, 4, i, false); } } } void PointToSpiralIn() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внутрь int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 0; int pointY = 0; int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 0; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= lungimeX - 1 - offset) ( dir = 1; ) continua; ) if(dir == 1) (punctY ++; if(punctY ><= offset) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset + 1) { dir = 0; offset ++; pointY = offset; } continue; } } } void PointToSpiralOut() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внаружу int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 3; //начать с этих координат int pointY = 3; //начать с этих координат int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 3; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= lungimeX - 1 - offset) ( dir = 1; ) continua; ) if(dir == 1) ( punctY ++; if(punctY >= lungimeY - 1 - offset) ( dir = 2; ) continua; ) if(dir == 2) ( punctX --; if(punctX)<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }

Video cu schița:


Vă rugăm să activați javascript pentru ca comentariile să funcționeze.

În lecțiile anterioare, am învățat cu ajutorul unui registru de schimbare. Acest lucru s-a dovedit a fi puțin mai dificil decât direct din ace de uz general. Problema pe care a trebuit să o rezolvăm apoi a fost numărul limitat de ieșiri controlate de pe controlerul Arduino. Apogeul cercetării noastre a fost utilizarea indicației dinamice pentru. Acum este timpul să complicăm puțin mai mult sarcina: învățăm să lucrăm cu matricea 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 un postscript „cu un catod comun”, în caz contrar – „cu un anod comun”. Și 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? Se va dovedi a fi 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 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 8×8 pixeli. Dacă este necesară o matrice LED cu rezoluție mai mare, atunci aceasta este pur și simplu alcătuită din mai mulți indicatori 8x8. Cum se face asta, vom vedea 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 deja cu un anod comun. Obtii urmatoarea schema:
Să presupunem că sarcina este să aprindeți LED-ul R6C3. Pentru a face acest lucru, trebuie să aplicăm un nivel ridicat de semnal pinului R6 și să conectăm pinul C3 la masă. Fără a opri acest punct, să încercăm să aprindem altul - R3C7. Conectați pinul de alimentare pozitiv la R3 și împământare la C7. Dar în acest caz, rândurile R6 și R3 se vor intersecta cu coloanele C3 și C7 nu în două, ci în patru locuri! În consecință, nu două, ci patru puncte se vor aprinde. Problemă! Evident, același lucru poate ajuta. Dacă activăm punctele R6C3 și R3C7 la rândul lor foarte repede, putem folosi persistența vederii - capacitatea de a interpreta imaginile care se schimbă rapid în ansamblu.

2. Matrice LED și registre de deplasare

În lecția noastră, vom conecta cea mai simplă matrice LED roșie 8 × 8 la Arduino Uno. Numerotarea PIN î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 indicația dinamică, să încercăm să folosim registre de deplasare de 8 biți în schema de control al indicatorului matriceal. Conectăm un registru la ieșirile indicatorului responsabile pentru coloane, iar al doilea la ieșirile de rând. schema circuitului
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ă evidențiem un zâmbet pe indicator. După cum sa menționat deja, pentru a afișa imaginea pe matrice, vom folosi indicația dinamică. Și anume, ne vom evidenția imaginea linie cu linie. Mai întâi, aprindem coloanele necesare în rândul de sus, apoi în al doilea, în al treilea și așa mai departe pentru toate cele 8 rânduri. Primul registru de schimbare va fi responsabil pentru coloane, iar al doilea pentru rânduri. Prin urmare, ieșirea unui șir va consta în două scrieri consecutive în registru: mai întâi trecem codul șirului, apoi codul punctelor din acest șir. În acest program, vom folosi și o versiune accelerată a funcției digitalWrite. Acest lucru este necesar pentru ca procesul de indicare dinamică să decurgă foarte rapid. În caz contrar, vom vedea o pâlpâire vizibilă a matricei. 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(car 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 complet(~(1)<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flickși funcția completati deja cunoscute nouă 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 au fost completate. După încărcarea programului pe Arduino, pe indicator va apărea un zâmbet.

4. Animație pe matricea LED

Și acum vom finaliza programul în așa fel î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. 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, 0B0011100), (0B0011100 void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(car 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; fill(~(1)<<(7-line))); fill(data); latchOn(); } tm = micros(); if(tm >next_switch)( next_switch = tm + to_switch; frame = !frame; ) ) Încărcăm programul Arduino și observăm rezultatul.

5. Scalare matrice LED

O matrice LED 8×8 este potrivită pentru afișarea a două numere sau a unui caracter 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 16 × 16. Mărirea în continuare a dimensiunii afișajului LED va duce la o pâlpâire vizibilă.

Sarcini

  • 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ă.
  • Joc cu șarpe. Implementați un joc atât de cunoscut ca un șarpe pe o matrice LED 8×8. Este necesar să adăugați patru butoane la circuit pentru a controla direcția de mișcare, precum și un sonerie pentru a semnala evenimentul de a mânca mere (sau orice mănâncă șarpele acolo...).
  • 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), atunci punctul este în centru. Când nivelul electronic este înclinat spre stânga, punctul este deplasat proporțional spre dreapta.

Concluzie

După ce au asamblat circuitul de control al matricei, mulți ar putea avea o întrebare: „Ei bine, nu a venit nimeni cu o modalitate mai simplă de a lucra cu matricea în 30 de ani?” De fapt, și-au dat seama. Există microcircuite specializate pentru lucrul cu diferite tipuri de afișaje, inclusiv pentru lucrul cu o matrice LED. Într-una dintre lecțiile următoare, 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 cu un afișaj mare, fără a fi nevoie să complicăm foarte mult circuitul electric.

Acum doi ani, când am început prima dată multicoptere, a trebuit să fac un mic . Întrucât quadcopterul a fost conceput ca fiind pur autonom, tot ceea ce era necesar de la această telecomandă era controlul dronei în timpul testării și reglajului.

În principiu, telecomanda a făcut față cu succes tuturor sarcinilor care i-au fost atribuite. . Dar au existat și deficiențe serioase.

  1. Bateriile nu intrau în carcasă, așa că a trebuit să le lipesc pe carcasă cu bandă electrică :)
  2. Setarea parametrilor a fost efectuată pe patru potențiometre, care s-au dovedit a fi foarte sensibile la temperatură. În cameră ai stabilit niște valori, ieși în stradă - și sunt deja diferite, au plecat.
  3. Arduino Nano pe care l-am folosit la telecomandă are 8 intrări analogice în total. Patru au fost ocupate de potențiometre de reglare. Un potențiometru a servit drept gaz. Două intrări au fost conectate la un joystick. O singură ieșire a rămas liberă și sunt mult mai mulți parametri de configurat.
  4. Singurul joystick nu era deloc pilot. Controlul gazului cu un potențiometru a fost, de asemenea, destul de deprimant.
  5. Și telecomanda nu a scos niciun sunet, ceea ce uneori este extrem de util.

Pentru a elimina toate aceste neajunsuri, am decis sa refac radical telecomanda. Atât hardware cât și software. Iată ce am vrut să fac:

  • Faceți o carcasă mare, astfel încât să puteți introduce tot ce doriți în ea acum (inclusiv bateriile) și ceea ce doriți mai târziu.
  • Rezolvați cumva problema cu setările, nu prin creșterea numărului de potențiometre. În plus, adăugați posibilitatea de a salva parametrii în consolă.
  • Faceți două joystick-uri, ca pe consolele pilot normale. Ei bine, pune joystick-urile în sine ortodoxe.

Cladire nouă

Ideea este extrem de simplă și de eficientă. Tăiem două plăci din plexiglas sau alt material subțire și le conectăm cu suporturi. Întregul conținut al carcasei este atașat fie de placa superioară, fie de jos.

Controale și meniuri

Pentru a controla o grămadă de parametri, fie trebuie să plasați o grămadă de potențiometre pe telecomandă și să adăugați un ADC, fie să faceți toate setările prin meniu. După cum am spus, reglarea cu potențiometre nu este întotdeauna o idee bună, dar nici nu ar trebui să o refuzați. Așadar, s-a decis să se lase patru potențiometre în telecomandă și să se adauge un meniu cu drepturi depline.

Butoanele sunt de obicei folosite pentru a naviga prin meniu și pentru a modifica parametrii. Stânga, dreapta, sus, jos. Dar am vrut să folosesc un encoder în loc de butoane. Am primit această idee de la un controler de imprimantă 3D.


Desigur, din cauza adăugării meniului, codul telecomenzii s-a umflat de mai multe ori. Pentru început, am adăugat doar trei elemente de meniu: „Telemetrie”, „Parametri” și „Store parametri”. Prima fereastră afișează până la opt indicatori diferiți. Până acum folosesc doar trei: puterea bateriei, busola și altitudinea.

În a doua fereastră sunt disponibili șase parametri: coeficienții controlerului PID pentru axele X/Y,Z și unghiurile de corecție ale accelerometrului.

Al treilea element vă permite să salvați parametrii în EEPROM.

Joystick-uri

Nu m-am gândit mult timp la alegerea joystick-urilor pilot. S-a întâmplat că am primit primul joystick Turnigy 9XR de la un coleg din afacerea cu quadcopter - Alexander Vasiliev, proprietarul site-ului notoriu alex-exe.ru. Al doilea l-am comandat direct de la Hobbyking.


Primul joystick a fost încărcat cu arc în ambele coordonate - pentru a controla rotirea și înclinarea. Pe al doilea l-am luat la fel, apoi pentru a-l converti într-un joystick pentru a controla împingerea și rotația.

Nutriție

În vechea telecomandă am folosit un regulator de tensiune simplu LM7805 alimentat cu o grămadă de 8 baterii AA. O variantă teribil de ineficientă, în care 7 volți au mers pentru a încălzi regulatorul. 8 baterii - pentru ca exista doar un astfel de compartiment la indemana, si LM7805 - pentru ca la acea vreme aceasta optiune mi se parea cea mai simpla, si cel mai important, cea mai rapida.

Acum am decis să fiu mai înțelept și să pun un regulator destul de eficient pe LM2596S. Și în loc de 8 baterii AA am instalat un compartiment pentru două baterii LiIon 18650.


Rezultat

Punând totul împreună, am obținut un astfel de dispozitiv. Vedere din interior.


Iată-l cu capacul închis.


Nu există suficiente capac pe un potențiometru și capace pe joystick-uri.

În sfârșit, un videoclip despre cum sunt configurate setările prin meniu.


Rezultat

Din punct de vedere fizic, telecomanda este asamblată. Acum sunt angajat în faptul că finalizez codul telecomenzii și al quadrocopterului pentru a restabili fosta lor prietenie puternică.

În timpul instalării telecomenzii, au fost identificate deficiențe. În primul rând, colțurile inferioare ale telecomenzii se sprijină de mâini: (Probabil că voi reproiecta puțin plăcile, voi netezi colțurile. În al doilea rând, nici un afișaj 16x4 nu este suficient pentru o ieșire frumoasă de telemetrie - trebuie să reduc numele parametrilor la două litere. În următoarea versiune a dispozitivului, voi instala un afișaj cu puncte sau imediat matrice TFT.

Acest articol a fost creat pentru cei care au cumpărat o matrice goală 8x8 și registre de schimbare 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 am găsit fie nu pentru registrele mele, fie cu schițe care nu funcționează, așa că am decis că mai trebuie să lucrez cu mâinile și cu capul pentru a-mi face plăcere. 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 sens să blochezi registrele în momente diferite. Unii dintre pinii matricei (anozi) sunt conectați prin rezistențe limitatoare de curent 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 afișate linie cu linie (altfel cu matrici similare nu există nicio cale), cu o mică întârziere (ochiul uman practic nu face distincția între o întârziere de 1ms).

Am încercat să explic totul în schiță. La încărcarea pe placă, afișajul va afișa numerele pe care le vom trimite către monitorul portului arduino (vezi videoclipul)

Fotografie a dispozitivului finit (în 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.