Kina tillhandahåller för ett litet pris en enorm mängd av inte bara elektroniska enheter utan också deras komponenter. En liten uppsättning lysdioder kan visa den information du behöver, förmodligen siffror, eftersom upplösningen inte är särskilt hög, 8 gånger 8 lysdioder, varje diameter 3 mm. Denna matris lyser i rött, eftersom den är den mest synliga och drar till sig uppmärksamhet mer än andra färger.
Om du har flera sådana matriser på lysdioder kan du koppla ihop dem för att skapa stora informationstavlor.
Matrisdisplay - en enhet som består av en 8x8 LED-matris och ett styrkort baserat på MAX7219-chippet med minsta nödvändiga rörledning. På bilden kan du redan se den färdiga enheten, men den kom till mig via post i det här formuläret, så jag var tvungen att plocka upp en lödkolv och löda allt på rätt sätt.
Den grundläggande anslutningen till Arduino Nano-kortet visas i kretsschemat.
Som du kan se från diagrammet är allt enkelt, du behöver bara ansluta kontakterna på båda korten med ledningar i följande ordning:
Arduino Nano | Matrix 8x8 |
PIN 12 | PIN DIN |
PIN 11 | PIN CLK |
PIN 10 | PIN CS |
PIN 5V | PIN 5V |
PIN-kod GND | PIN-kod GND |
Så, äntligen är det dags att arbeta med koden, och för att köra LED-matrisen måste du ladda ner och installera LedControl-biblioteket. Biblioteket stöder mikrokretsar MAXIM 7221 och 7219. LED-matrisen använder MAX7219 som drivrutin, detta är vad vi behöver. Jag tycker att vi ska börja med en liten skiss som visar de grundläggande funktionerna i detta bibliotek. I skissen används funktionen setRow() för att slå på/stänga av lysdioderna. Syntaxen för att anropa funktionen setRow() är:
matrix.setRow(0, rad, kol, set);
Var matris- klassobjekt LedControl
0 - enhetens adress på SPI-bussen, i detta fall finns det bara en enhet, och numreringen börjar från adress noll
rad- rad (möjliga värden från 0 till 7)
kol- kolumn (möjliga värden är från 0 till 7)
uppsättning- inställningsvärde( Sann- sätta på, falsk- Stäng av)
matrix.setRow(0, 1, 4, true)
Slå på lysdioden på matrisen, placerad i den första raden och i den fjärde kolumnen.
Ett annat exempel:
int x = 1;
int y = 4;
matrix.setRow(0, x, y, sant);
matrix.setRow(0, x, y, false);
Detsamma är endast med användningen av variabler, och efterföljande släckning av den tända lysdioden vid de givna koordinaterna. Så i skissen spelas flera animationer upp med funktionen setRow ().
#include "LedControl.h" //Syntax för att skapa LedControl-klassen(dataPin,clockPin,csPin,numDevices) //Där LedControl är ett objekt i klassen //dataPin är stiftet på Arduino-kortet som DIN-stiftet kommer till vara ansluten //clockPin är stiftet på kortet Arduino som CLK-stiftet kommer att anslutas till //csPin - stiftet på Arduino-kortet som CS-stiftet kommer att anslutas till //numDevices - antalet enheter på bussen / /Skapa ett objekt av matrisklassen i vårt fall med en ansluten enhet LedControl matrix = LedControl(12, 11 , 10, 1); //Fördröjningstid för att slå på/av lysdioden på matrisen const int delayValue = 100; //Funktionsprototyper //Sekventiell på/av void PointSerialSet(); //Snake från höger till vänster void PointRigthToLeft(); //Snake från botten till toppen void PointDownToUp(); //Snake från vänster till höger void PointLeftToRigth(); //Snake från topp till botten void PointUpToDown(); //Effekt - fading puls void PointFading(); //Effekt - pulsvoid PointPulse(); //Effekt - växande impulsvoid PointClimbing(); //Effekt av att vrida spiralen inuti void PointToSpiralIn(); //Effekt av att snurra spiralen utåt tomrummet PointToSpiralOut(); void setup() ( // Enhet med adress 0 väcks som standard matrix.shutdown(0, false); //Ställ in ljusstyrkan på LED-matrisen till 8 //Möjliga värden är från 0 till 15 matrix.setIntensity( 0, 8); //Clear display matrix.clearDisplay(0); ) void loop() ( //Call-funktioner en efter en PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading (); PointPulse(); PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Funktionskroppar void PointSerialSet() ( //Använd funktionen setLed(adress, rad, kol, set) //Sekventiell påslagning av rader för(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 --) ( för(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() ( //Använd funktionen setLed(adress, rad, kol, set) //Snake från botten till toppen för (int i = 7; i >= 0; i --) ( för(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() ( //Använd funktionen setLed(adress, rad, kol, set) //Snake från vänster till höger för (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() ( //Använd funktionen setLed(adress, rad, kol, set) //Snake från topp till botten för (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() ( //Använd funktionen setLed(address, row, col, set) //Fadningseffekt int upValue = 0 ; int downValue = 7; for(int i = 0; i< 8; i ++) { if(i % 2) { for(int n = downValue; n >= uppVärde; n --) ( matrix.setLed(0, n, i, sant); 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 >= uppVärde; n --) ( matrix.setLed(0, n, i, sant); 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 >= längdX - 1 - offset) ( dir = 1; ) fortsätt; ) if(dir == 1) (punkt Y ++; om(punkt Y ><= 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 >= längdX - 1 - offset) ( dir = 1; ) fortsätt; ) if(dir == 1) (punktY ++; if(punktY >= längdY - 1 - offset) (dir = 2; ) fortsätt; ) if(dir == 2) (punktX --; if(punktX<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }
Video på sketchen:
Den här artikeln skapades för dem som köpte en bar 8x8 matris och 74hc595 skiftregister och inte vet hur man kopplar ihop allt.
Jag sökte länge på Internet efter instruktioner om hur man ansluter ovanstående komponenter, men jag hittade antingen inte för mina register eller med icke-fungerande skisser, så jag bestämde mig för att jag fortfarande måste arbeta med mina händer och huvud för att behaga mig själv med 8 * 8 bilder.
Efter att ha hittat datablad för matrisen och skiftregistren på Internet ritade jag följande diagram:
Det 12:e benet på båda mikrokretsarna (låsstift) för att spara portar är vanligt, eftersom det inte är meningsfullt att låsa registren vid olika tidpunkter. Vissa av matrisstiften (anoderna) är anslutna via strömbegränsande motstånd med ett nominellt värde på 220 ohm. Allt annat enligt schemat är extremt enkelt. För säkerhets skull, bilder med pinout av matrisen.
Bilder måste visas rad för rad (annars med liknande matriser finns det ingen möjlighet), med en liten fördröjning (det mänskliga ögat skiljer praktiskt taget inte mellan en fördröjning på 1 ms).
Jag försökte förklara allt i skissen. När du laddar upp till tavlan kommer displayen att visa siffrorna som vi skickar till arduino portmonitorn. (Se video)
Foto av den färdiga enheten (sick-sack på skärmen, i skissen lagras dess bild i bildmatrisen)
I framtiden kommer jag att försöka göra något intressant på denna display.
Äntligen kom matrismoduler från Kina. Varje modul består av ett MAX7219-chip (), en LED-matris, en kondensator och ett motstånd finns i kabelnätet.
Styrs av MAX7219 via SPI-gränssnitt.
Mikrokretsar i ett kluster är seriekopplade. Jag läste på Internet att den maximala seriella anslutningen tillåter endast 8 stycken MAX7219. Tro inte. 16 moduler anslutna, och allt fungerar bra.
Modulerna som presenteras på Ali finns i flera versioner. De mest populära är 2 typer: med en mikrokrets i DIP och i SOIC-paket. DIP-chipmodulen är större och inte lika bekväm när den är ansluten i ett kluster. Du måste ansluta ett gäng ledningar.
Moduler med ett chip i ett SOIC-paket är storleken på en LED-matris och kopplas ihop med lödning eller byglar. Det blir snyggt och snyggt.
De mest kända biblioteken för att arbeta med matriser och kluster är MAX72xx Panel av Mark Rice och Parola av MajicDesigns: Det första biblioteket är lättare att använda, det andra är mer komplext med fler funktioner. Jag ska skriva ut det mer i detalj.
Biblioteksinstallation krävs när du använder MAX72xx Panel Adafruit GFX.
För att russifiera texten måste du ladda ner DEN HÄR FILEN och ersätt standardfilen glcdfont.c i katalogen Arduino/Libraries/Adafruit-GFX-Library-master. Också i den här filen, förutom de nödvändiga bokstäverna och siffrorna, beskrivs en massa alla möjliga tecken. Alla kanske inte är användbara. Bilden nedan förklarar hur symbolerna bildas.
Om det behövs kan du skapa dina egna symboler och ersätta dem med eventuella oanvända i filen. Nästan alla bitmappsteckensnitt som används i olika bibliotek bildas på detta sätt.
Så, biblioteken MAX72xx Panel och Adafruit GFX är installerade, filen glcdfont.c ersätts. Starta Arduino IDE, öppna FIL. Det finns en utf8rus-funktion i skissen. Det ger omkodning av teckentabellen för det ryska språket. Det behövs bara för normal utmatning från programmet, det vill säga i programmet är den önskade texten skriven på ryska. Om texten skrivs in via COM-porten korrigeras teckenkoderna i Serial_Read-funktionen. I IDE och i konsolen använde utvecklarna olika kodningar.
I början av filen finns rader nödvändiga för att biblioteket ska fungera.
int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 16;
Jag har moduler med ett chip i ett SOIC-paket. De har en liten funktion. Modulernas matris installeras roterad 90 grader. Det är en bekvämlighetsavgift. Om du kör skisserna som följer med biblioteken kommer de att mata ut text från botten till toppen i varje modul. Texten kommer att visas i sicksack. För att behandla denna åkomma behöver biblioteket "berättas" att det finns 16 vertikala displayer (de är fysiskt placerade horisontellt). Och sedan i void Setup ange raden för biblioteket
matrix.setRotation(matrix.getRotation() + 1);
Den vänder programmatiskt varje matris. Och allt kommer att visas normalt.
Moduler med ett DIP-chippaket har inte detta. Allt är vackert, förutom ett gäng sladdar.
MAX72xx Panel-biblioteket är ganska blygsamt. Det finns inga visuella uteffekter. Klustret uppfattas som en helhet. Det går mycket bättre med MD Parola.
Ägare av moduler med ett chip i ett SOIC-paket kommer också att möta problemet med att orientera moduler i ett kluster. Bara det ser lite annorlunda ut än i MAX72xx. Här kommer modulerna att dyka upp så att säga ur tur.
HelloWorld-skiss från prover som ingår i biblioteket.
Programmässigt i skissen kunde jag inte bota denna åkomma. Jag behandlade honom annorlunda. I filen Adruino/libraries/MD_MAX72xx_lib.h i slutet behöver du hitta linjerna som på bilden.
Och fixa den valda raden från 1 till 0. Spara filen. Arduino IDE behöver inte startas om. Vi häller, vi tittar.
Nu kan du använda 24 animationseffekter. Animeringen startas med kommandot P.displayText(“Text att visa”, “textjustering”, hastighet, visningsfördröjning, intoningseffekt, uttoningseffekt). Som du kan se finns det många inställningar.
Och det mest njutbara är uppdelningen av klustret i virtuella zoner. Att arbeta med zoner är inte särskilt svårt. Jag lägger inte upp skissen, den finns i proverna som följer med biblioteket. Nu kan du nästan utan problem visa klockan i början av klustret och nyhetstickern på de återstående modulerna.
Som du kanske redan gissar är problemet med kyrilliska bokstäver. Hon är också lösbar. Bredvid föregående fil i samma katalog finns filen MD_MAX72xx_font.cpp. Detta är en teckensnittsfil. Tecknen i den är utformade på samma sätt som bibliotekets GFX-teckensnittsfil. Det finns en liten skillnad. Här kan teckenstorleken vara mindre än 5 poäng. I Adafruit GFX-biblioteket tar utropstecken till exempel upp samma 5 punkter lika breda som alla andra symboler, endast en rad med punkter används. Resten lyser inte, utan används som symbol. I Parola upptar samma utropstecken också en rad med prickar, bara det finns inga tomma prickar i närheten, men intilliggande tecken kan vara det. Det blir tydligare att förstå bilden.
Det finns ingen tid att komplettera filen med kyrilliska tecken på samma sätt som filen från det första övervägda biblioteket. Om någon gör detta och skickar mig en fil kommer jag att lägga till den i den här artikeln, och både jag och gästerna på min sida kommer att vara dig tacksamma.
Resultat. MAX72xx Panel-biblioteket av Mark Rice är lätt att använda och förstå, men med dålig funktionalitet.
Parola-biblioteket från MajicDesigns är mer komplext och har tillräckligt med kapacitet för nästan alla applikationer.
På tidigare lektioner har vi lärt oss med hjälp av ett skiftregister. Detta visade sig vara lite svårare än direkt från stift för allmänt bruk. Problemet som vi sedan var tvungna att lösa var det begränsade antalet kontrollerade utgångar på Arduino-kontrollern. Höjdpunkten för vår forskning var användningen av dynamisk indikation för. Nu är det dags att komplicera uppgiften lite mer: vi lär oss att arbeta med LED-matrisen.