Mobilné telefóny a gadgety

Mobilné telefóny a gadgety

» maticové ovládanie 8x8

maticové ovládanie 8x8


Čí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.


Na ovládanie je najvhodnejšie použiť túto maticu Arduino pretože je digitálny. Ak napíšete jednoduchý program, môžete na tejto LED „obrazovke“ zobraziť potrebné informácie. V predaji sú drahšie trojfarebné matrice, v ktorých kombináciou troch hlavných farieb vytvoríte takmer akúkoľvek.


Táto matica má 16 kolíkov, schéma je uvedená vyššie, ktorá jasne ukazuje, ako sú základné komponenty matice spojené - LED diódy, vedené ňou, môžete správne pripojiť modul na reprodukciu informácií digitálnymi aj analógovými zariadeniami. Nezabudnite na súčasné obmedzujúce odpory, bude smutné, ak niektorý z pixelov vyhorí. Menovitý trvalý prúd jedného bodu sa rovná 20 mA, špičkový dopredný prúd 100 mA, napájacie napätie 2,1-2,1V, vlnová dĺžka 625-630 nm, maximálny stratový výkon je 40 mW, anóda je tu bežná, teda plus. Celkové rozmery LED matrice 37 na 37 na 8 mm. Spájkovať treba opatrne, nedotýkať sa spájkovačky s teplotou 260 stupňov dlhšie ako 5 s, odporúčaná prevádzková teplota je -40 - +70 Celzia.

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 NanoMatica 8x8
PIN 12PIN DIN
PIN 11PIN CLK
PIN 10PIN CS
PIN 5VPIN 5V
PIN GNDPIN 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:


Povoľte javascript, aby komentáre fungovali.

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.

Panel MAX72xx

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.

Parola od MajicDesigns.

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.

1. Maticový indikátor

Ako už vieme, segmentové indikátory, či už sú to stupnice alebo čísla, pozostávajú z jednotlivých LED diód spojených dohromady. Napríklad skupina LED diód môže mať pripojené všetky katódy. Takýto indikátor má postscript "so spoločnou katódou", inak - "so spoločnou anódou". A čo sa stane, ak LED diódy umiestnime nie vo forme čísla alebo stupnice, ale vo forme mriežky? Ukáže sa, že ide o celkom grafický indikátor. Teda taký, na ktorom si môžete zobraziť nielen číslo, ale aj nejaký ten obrázok. Takáto mriežka sa nazýva maticový indikátor a v prípade LED matica LED. Rozlíšenie maticového indikátora je počet horizontálnych a vertikálnych bodov. Napríklad najbežnejšie indikátory majú rozlíšenie 8×8 pixelov. Ak je potrebná matica LED s vyšším rozlíšením, potom sa jednoducho skladá z niekoľkých indikátorov 8x8. Ako to urobiť, uvidíme neskôr. Medzitým poďme zistiť, ako je pripojených všetkých 64 LED diód vo vnútri matice. Samozrejme by bolo možné, ako v prípade sedemsegmentového indikátora, pripojiť všetky LED diódy spoločnou katódou alebo anódou. V tomto prípade by sme potrebovali buď 64 pinov ovládača alebo 8 posuvných registrov. Obe možnosti sú veľmi nehospodárne. Správnejšou možnosťou je spojiť LED diódy do skupín po 8 kusoch so spoločnou katódou. Nech sú to stĺpce matice. Potom sa paralelné LED v týchto stĺpcoch opäť spoja do skupín po 8 kusoch už so spoločnou anódou. Získate nasledujúcu schému:
Predpokladajme, že úlohou je rozsvietiť LED R6C3. Aby sme to dosiahli, musíme použiť vysokú úroveň signálu na kolík R6 a pripojiť kolík C3 k zemi. Bez vypnutia tohto bodu skúsme zapáliť ďalší - R3C7. Pripojte kladný napájací kolík k R3 a uzemnenie k C7. Ale v tomto prípade sa riadky R6 a R3 pretínajú so stĺpcami C3 a C7 nie na dvoch, ale na štyroch miestach! Následne sa nerozsvietia dva, ale štyri body. Problém! Je zrejmé, že to isté môže pomôcť. Ak postupne veľmi rýchlo zapneme body R6C3 a R3C7, môžeme využiť perzistenciu videnia – schopnosť interpretovať rýchlo sa meniace obrazy ako celok.

2. LED matica a posuvné registre

V našej lekcii pripojíme najjednoduchšiu maticu 8 × 8 červených LED k Arduino Uno. Číslovanie pinov začína od ľavého dolného rohu. Číslovanie nôh 1-16 zároveň nie je logicky spojené s číslovaním stĺpcov a riadkov C a R.
Zamerajúc sa na lekciu o dynamickej indikácii, skúsme použiť 8-bitové posuvné registre v schéme riadenia maticového indikátora. Jeden register pripájame k výstupom indikátorov zodpovedných za stĺpce a druhý k výstupom riadkov. schému zapojenia
Dôležitá poznámka #1. Je potrebné, aby odpory v tomto obvode boli na vedeniach prichádzajúcich z prvého posuvného registra. Tento posuvný register je zodpovedný za stĺpce. Pri tomto zapojení každý rezistor nastaví prúd iba pre jednu LED v každom kroku dynamického algoritmu. Preto budú všetky LED svietiť rovnomerne. Dôležitá poznámka #2. Vyššie uvedený diagram slúži len na informačné účely. Správnejšie by bolo zahrnúť ďalší výkonový mikroobvod do medzery medzi druhým registrom a matricou, napríklad zostava tranzistora ULN2003.

3. Program

Aby to bolo zábavnejšie, skúsme na indikátore zvýrazniť smajlíka. Ako už bolo spomenuté, na zobrazenie obrazu na matici použijeme dynamickú indikáciu. Totiž, zvýrazníme náš obrázok riadok po riadku. Najprv zapálime potrebné stĺpiky v najvrchnejšom rade, potom v druhom, treťom a tak ďalej pre všetkých 8 riadkov. Prvý posuvný register bude zodpovedný za stĺpce a druhý za riadky. Preto výstup reťazca bude pozostávať z dvoch po sebe idúcich zápisov do registra: najprv prejdeme kód reťazca, potom kód bodov v tomto reťazci. V tomto programe použijeme aj zrýchlenú verziu funkcie digitalWrite. Je to potrebné na to, aby proces dynamickej indikácie prebiehal veľmi rýchlo. V opačnom prípade uvidíme viditeľné blikanie matice. Zdroj 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; byte line = 0; const byte data = ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 01001); 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; // pass line code fill(~(1)<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flick a funkciu vyplniť nám už známe z hodín o a o. pole údajov ukladá osem riadkov nášho obrázku. Aby sme ušetrili pamäť, každú kombináciu bodov sme zaznamenali v binárnej forme. Funkcia latchOn otvorí západku registra. Toto by sa malo vykonať až po naplnení oboch posuvných registrov. Po načítaní programu na Arduino sa na indikátore objaví smajlík.

4. Animácia na LED matrici

A teraz dokončíme program tak, aby sa obraz na indikátore menil každú pol sekundu. Aby sme to urobili, spomeňme si znova. 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; byte line = 0; byte frame = 0; const byte data = ( ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100 ), ( 0b00111100, 0b01000010, 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<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; ) ) Načítame program Arduino a pozorujeme výsledok.

5. LED matice škálovanie

Matica 8×8 LED je vhodná na zobrazenie dvoch čísel alebo jednoduchého znaku. Ak chcete na indikátore zobraziť nejaký viac či menej užitočný obrázok, musíte matice skombinovať. To sa dosiahne pridaním nových posuvných registrov vertikálne aj horizontálne. Treba si uvedomiť, že rýchlosť ovládača Arduino Uno v spojení s posuvnými registrami stačí len na 16 × 16 displej. Ďalšie zväčšenie veľkosti LED displeja bude mať za následok viditeľné blikanie.

Úlohy

  • Hypnóza. Naprogramujte ovládač tak, aby sa na matici LED objavovali sústredné kružnice s neustále sa zväčšujúcim polomerom s periódou 1 sekundy.
  • Hra had. Implementujte takú známu hru ako had na matici 8×8 LED. Do obvodu je potrebné pridať štyri tlačidlá na ovládanie smeru pohybu a tiež bzučiak na signalizáciu udalosti jedenia jabĺk (alebo čohokoľvek, čo tam had zje ...).
  • Elektronická hladina. Pridajte do okruhu akcelerometer. Napíšte program, ktorý na LED matici zobrazí bod, ktorého súradnice závisia od náklonu celého zariadenia. Napríklad, keď je zariadenie pripevnené rovnobežne so zemou (kolmo na vektor gravitácie), potom je bod v strede. Keď sa elektronická vodováha nakloní doľava, bod sa proporcionálne posunie doprava.

Záver

Po zostavení riadiaceho obvodu matice si mnohí môžu položiť otázku: „Nuž, za 30 rokov nikto neprišiel na jednoduchší spôsob práce s maticou? Vlastne, prišli na to. Existujú špecializované mikroobvody na prácu s rôznymi typmi displejov, vrátane práce s maticou LED. V jednej z nasledujúcich lekcií sa naučíme ovládať indikátor pomocou čipu MAX7219. Tento spôsob nám umožní jednoducho skombinovať niekoľko matíc s jedným veľkým displejom bez toho, aby sme museli veľmi komplikovať elektrický obvod.