Čína poskytuje za malú cenu obrovské množstvo nielen elektronických zariadení, ale aj ich komponentov. Malé pole svetelných diód môže zobraziť informácie, ktoré potrebujete, pravdepodobne čísla, pretože rozlíšenie nie je príliš vysoké, 8 x 8 LED diód, každý priemer 3 mm. Táto matrica svieti červenou farbou, pretože je najviac viditeľná a púta pozornosť viac ako iné farby.
Ak máte niekoľko takýchto matríc na LED diódach, môžete ich spojiť a vytvoriť tak veľké informačné tabule.
Maticový displej - zariadenie pozostávajúce z matice 8x8 LED a riadiacej dosky na báze čipu MAX7219 s minimálnym potrebným potrubím. Na fotke už vidíte hotové zariadenie, no v tejto podobe mi prišlo poštou, takže som si musel zobrať spájkovačku a všetko zaspájkovať správnym spôsobom.
Základné pripojenie k Arduino Nano doske je znázornené na schéme zapojenia.
Ako vidíte z diagramu, všetko je jednoduché, stačí prepojiť kontakty oboch dosiek s drôtmi v nasledujúcom poradí:
Arduino Nano | Matica 8x8 |
PIN 12 | PIN DIN |
PIN 11 | PIN CLK |
PIN 10 | PIN CS |
PIN 5V | PIN 5V |
PIN GND | PIN GND |
Takže konečne je čas pracovať s kódom a na spustenie matice LED je potrebné stiahnuť a nainštalovať knižnicu LedControl. Knižnica podporuje mikroobvody MAXIM 7221 a 7219. Matica LED používa ako ovládač MAX7219, to je to, čo potrebujeme. Myslím, že by sme mali začať malým náčrtom demonštrujúcim základné funkcie tejto knižnice. V náčrte sa funkcia setRow() používa na zapnutie/vypnutie LED diód. Syntax pre volanie funkcie setRow() je:
matrix.setRow(0, riadok, stĺpec, sada);
Kde matice- triedny predmet LedControl
0 - adresa zariadenia na zbernici SPI, v tomto prípade je len jedno zariadenie a číslovanie začína od adresy nula
riadok- riadok (možné hodnoty od 0 do 7)
kol- stĺpec (možné hodnoty sú od 0 do 7)
nastaviť- hodnota nastavenia ( pravda- zapnúť, falošné- vypnúť)
matrix.setRow(0; 1; 4; pravda)
Zapnite LED na matici, ktorá sa nachádza v 1. riadku a v 4. stĺpci.
Ďalší príklad:
int x = 1;
int y = 4;
matrix.setRow(0, x, y, pravda);
matrix.setRow(0, x, y, nepravda);
To isté je len s použitím premenných, a následným zhasnutím rozsvietenej LED na daných súradniciach. V náčrte sa teda prehrá niekoľko animácií pomocou funkcie setRow ().
#include "LedControl.h" //Syntax na vytvorenie triedy LedControl(dataPin,clockPin,csPin,numDevices) //Kde je LedControl objekt triedy //dataPin je kolík na doske Arduino, ku ktorému sa pripojí pin DIN byť pripojený //clockPin je pin na doske Arduino, ku ktorému bude pripojený pin CLK //csPin - pin na doske Arduino, ku ktorému bude pripojený pin CS //numDevices - počet zariadení na zbernici / /Vytvorte objekt triedy matrix v našom prípade s jedným pripojeným zariadením matica LedControl = LedControl(12, 11 , 10, 1); //Čas oneskorenia zapnutia/vypnutia LED na matici const int delayValue = 100; //Prototypy funkcií //Sekvenčné zapnutie/vypnutie void PointSerialSet(); //Had sprava doľava void PointRigthToLeft(); //Had zdola nahor void PointDownToUp(); //Had zľava doprava void PointLeftToRigth(); //Had zhora nadol void PointUpToDown(); //Efekt - miznúci pulz void PointFading(); //Efekt - pulz void PointPulse(); //Efekt - rastúci impulz void PointClimbing(); //Efekt krútenia špirály vo vnútri void PointToSpiralIn(); //Efekt otáčania špirály smerom von void PointToSpiralOut(); void setup() ( // Zariadenie s adresou 0 sa predvolene prebudí matrix.shutdown(0, false); //Nastaví jas LED matice na 8 //Možné hodnoty sú od 0 do 15 matrix.setIntensity( 0, 8) ; //Vymazať matricu displeja.clearDisplay(0); ) void loop() ( //Volať funkcie jednu po druhej PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading (); PointPulse() ; PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Tely funkcií void PointSerialSet() ( //Použite funkciu setLed(adresa, riadok, stĺpec, sada) //Sekvenčné zapnutie riadky pre (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 --) ( 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 PointDownToUp() ( //Použite funkciu setLed(address, row, col, set) //Snake zdola nahor na (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() ( //Použite funkciu setLed(address, row, col, set) //Snake zľava doprava pre (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() ( //Použite funkciu setLed(address, row, col, set) //Snake zhora nadol na (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() ( //Použite funkciu setLed(address, row, col, set) //Fading effect 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; stúpanie --) ( matrix.setLed(0, stúpanie, i, pravda); oneskorenie (delayValue / 4); matrix.setLed(0, stúpanie, i, nepravda); ) 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 >= dĺžkaX - 1 - posun) ( dir = 1; ) pokračovať; ) if(dir == 1) ( bodY ++; if(bodY ><= 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 >= dĺžkaX - 1 - posun) ( dir = 1; ) pokračovať; ) if(dir == 1) ( bodY ++; if(bodY >= dĺžkaY - 1 - posun) (dir = 2; ) pokračovať; ) if(dir == 2) ( bodX --; if(bodX<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }
Video zo skice:
Tento článok bol vytvorený pre tých, ktorí si kúpili holú maticu 8x8 a posuvné registre 74hc595 a nevedia, ako to všetko prepojiť.
Dlho som hľadal na internete návod, ako spojiť vyššie uvedené komponenty, ale našiel som buď nie pre moje registre alebo s nefunkčnými náčrtmi, a tak som sa rozhodol, že stále musím pracovať rukami a hlavou, aby som sa páčil s 8 * 8 obrázkami.
Po nájdení údajových listov pre maticové a posuvné registre na internete som nakreslil nasledujúci diagram:
12. vetva oboch mikroobvodov (západkový kolík), kvôli šetreniu portov, je spoločná, pretože nemá zmysel zaskakovať registre v rôznych časoch. Niektoré maticové kolíky (anódy) sú pripojené cez odpory obmedzujúce prúd s nominálnou hodnotou 220 ohmov. Všetko ostatné podľa schémy je veľmi jednoduché. Pre každý prípad obrázky s pinoutom matice.
Obrázky sa budú musieť zobrazovať riadok po riadku (inak s podobnými maticami to nejde), s malým oneskorením (ľudské oko prakticky nerozlišuje oneskorenie 1 ms).
Snažil som sa všetko v náčrte vysvetliť. Pri nahrávaní na dosku sa na displeji zobrazia čísla, ktoré pošleme na monitor portu arduino.(Pozri video)
Fotografia hotového zariadenia (cik-cak na obrazovke, v náčrte je jeho obrázok uložený v poli obrázkov)
V budúcnosti sa pokúsim urobiť niečo zaujímavé na tomto displeji.
Nakoniec z Číny dorazili maticové moduly. Každý modul pozostáva z čipu MAX7219 (), matice LED, jedného kondenzátora a jedného odporu sú v zväzku.
Ovládané MAX7219 cez rozhranie SPI.
Mikroobvody v klastri sú zapojené do série. Na internete som sa dočítal, že maximálne možné sériové pripojenie umožňuje len 8 kusov MAX7219. Neverte. Je pripojených 16 modulov a všetko funguje dobre.
Moduly prezentované na Ali prichádzajú v niekoľkých verziách. Najpopulárnejšie sú 2 typy: s mikroobvodom v DIP a v balíkoch SOIC. Modul čipu DIP je väčší a nie je taký pohodlný, keď je pripojený v klastri. Budete musieť pripojiť veľa drôtov.
Moduly s čipom v puzdre SOIC majú veľkosť LED matice a spájajú sa spájkovaním alebo prepojkami. Ukazuje sa to pekne a úhľadne.
Najznámejšie knižnice na prácu s maticami a klastrami sú Panel MAX72xx od Marka Ricea a Parola od MajicDesigns: Prvá knižnica sa používa jednoduchšie, druhá je zložitejšia s viacerými funkciami. Napíšem to podrobnejšie.
Pri používaní panela MAX72xx je potrebná inštalácia knižnice Adafruit GFX.
Ak chcete text rusifikovať, musíte si ho stiahnuť TENTO SÚBOR a nahraďte predvolený súbor glcdfont.c v adresári Arduino/Libraries/Adafruit-GFX-Library-master. Aj v tomto súbore je okrem potrebných písmen a číslic popísaná kopa všemožných znakov. Nie všetky môžu byť užitočné. Nasledujúci obrázok vysvetľuje, ako sa symboly tvoria.
V prípade potreby si môžete vytvoriť svoje vlastné symboly a nahradiť ich akýmikoľvek nepoužitými symbolmi v súbore. Takmer všetky bitmapové fonty používané v rôznych knižniciach sú vytvorené týmto spôsobom.
Takže sú nainštalované knižnice MAX72xx Panel a Adafruit GFX, súbor glcdfont.c je nahradený. Spustite Arduino IDE, otvorte FILE. V náčrte je funkcia utf8rus. Poskytuje prekódovanie tabuľky znakov pre ruský jazyk. Je potrebný iba pre normálny výstup z programu, to znamená, že v programe je požadovaný text napísaný v ruštine. Ak je text zadaný cez COM port, potom sa kódy znakov opravia vo funkcii Serial_Read. V IDE a v konzole vývojári používali rôzne kódovania.
Na začiatku súboru sú riadky potrebné na fungovanie knižnice.
int pocetHorizontalnychZobrazeni = 1;
int početVertikálnychDisplejov = 16;
Mám moduly s čipom v obale SOIC. Majú malú vlastnosť. Matica modulov je inštalovaná otočená o 90 stupňov. Je to poplatok za pohodlie. Ak spustíte náčrty, ktoré sa dodávajú s knižnicami, budú v každom module vydávať text zdola nahor. Text sa zobrazí cik-cak. Na liečbu tohto neduhu treba knižnici „povedať“, že existuje 16 vertikálnych displejov (fyzicky sú umiestnené horizontálne). A potom v nastavení void zadajte riadok pre knižnicu
matrix.setRotation(matrix.getRotation() + 1);
Programovo prevráti každú maticu. A všetko sa zobrazí normálne.
Moduly s balíkom čipov DIP toto nemajú. Všetko je krásne, až na kopu drôtov.
Knižnica panelov MAX72xx je pomerne skromná. Neexistujú žiadne vizuálne výstupné efekty. Klaster je vnímaný ako jeden celok. S MD Parola je to oveľa lepšie.
Majitelia modulov s čipom v obale SOIC budú čeliť aj problému orientácie modulov v klastri. Len to vyzerá trochu inak ako v MAX72xx. Tu sa moduly objavia akoby mimo poradia.
Náčrt HelloWorld zo vzoriek dodaných s knižnicou.
Programovo v náčrte sa mi tento neduh nepodarilo vyliečiť. Správal som sa k nemu inak. V súbore Adruino/libraries/MD_MAX72xx_lib.h na konci treba nájsť riadky ako na obrázku.
A opravte vybraný riadok od 1 do 0. Uložte súbor. Arduino IDE nie je potrebné reštartovať. Nalievame, pozeráme.
Teraz môžete použiť 24 animačných efektov. Animácia sa spustí príkazom P.displayText(“Text na zobrazenie”, “zarovnanie textu”, rýchlosť, oneskorenie zobrazenia, efekt zoslabenia, efekt zoslabenia). Ako vidíte, existuje veľa nastavení.
A najviac potešujúce je rozdelenie klastra na virtuálne zóny. Práca so zónami nie je veľmi náročná. Náčrt nezverejňujem, je vo vzorkách, ktoré sú súčasťou knižnice. Teraz môžete takmer bez problémov zobraziť hodiny na začiatku klastra a ticker správ na zostávajúcich moduloch.
Ako už možno tušíte, problém je s písmenami azbuky. Tá je tiež riešiteľná. Vedľa predchádzajúceho súboru v rovnakom adresári je súbor MD_MAX72xx_font.cpp. Toto je súbor písma. Znaky v ňom sú tvorené podobne ako súbor fontov GFX knižnice. Je v tom malý rozdiel. Tu môže byť veľkosť postavy menšia ako 5 bodov. Napríklad v knižnici Adafruit GFX zaberá výkričník rovnako širokých 5 bodov ako ktorýkoľvek iný symbol, používa sa len jeden rad bodiek. Ostatné nežiaria, ale používajú sa ako symbol. V Parole ten istý výkričník zaberá aj jeden rad bodiek, len v blízkosti nie sú prázdne bodky, ale susedné znaky môžu byť. Bude jasnejšie porozumieť obrázku.
Na doplnenie súboru znakmi azbuky podobne ako v súbore z prvej uvažovanej knižnice nie je čas. Ak to niekto urobí a pošle mi súbor, pridám ho do tohto článku a ja aj hostia mojej stránky vám budeme vďační.
Výsledok. Knižnica panelov MAX72xx od Marka Ricea je ľahko použiteľná a zrozumiteľná, ale má slabú funkčnosť.
Knižnica Parola od MajicDesigns je komplexnejšia a má dostatok možností pre takmer akúkoľvek aplikáciu.
V predchádzajúcich lekciách sme sa učili pomocou posuvného registra. Ukázalo sa, že je to o niečo ťažšie ako priamo z kolíkov na všeobecné použitie. Problém, ktorý sme potom museli riešiť, bol obmedzený počet riadených výstupov na Arduino ovládači. Vrcholom nášho výskumu bolo využitie dynamickej indikácie pre. Teraz je čas túto úlohu trochu viac skomplikovať: učíme sa pracovať s maticou LED.