Mobiiltelefonid ja vidinad

Mobiiltelefonid ja vidinad

» 8x8 maatriksjuhtimine

8x8 maatriksjuhtimine


Hiina pakub väikese hinna eest tohutul hulgal mitte ainult elektroonikaseadmeid, vaid ka nende komponente. Väike hulk valgusdioode võib näidata vajalikku teavet, arvatavasti numbreid, kuna eraldusvõime ei ole väga kõrge, 8 x 8 LED-i, iga läbimõõt 3 mm. See maatriks särab punaselt, sest see on kõige nähtavam ja tõmbab teistest värvidest rohkem tähelepanu.


Seda maatriksit on juhtimiseks kõige mugavam kasutada Arduino sest see on digitaalne. Kui kirjutate lihtsa programmi, saate sellel LED-ekraanil kuvada vajalikku teavet. Müügil on kallimad kolmevärvilised maatriksid, milles kolme põhivärvi kombineerides saab luua peaaegu igasuguseid.


Sellel maatriksil on 16 tihvti, ülal on toodud diagramm, mis näitab selgelt, kuidas maatriksi elementaarsed komponendid on ühendatud - LED-id, sellest juhindudes, saate mooduli õigesti ühendada, et taasesitada teavet nii digitaalsete kui ka analoogseadmete abil. Ärge unustage voolu piiravaid takisteid, on kurb, kui mõni pikslitest põleb läbi. Ühe punkti pidev nimivool on võrdne 20 mA, tippvoolu 100 mA, toitepinge 2,1-2,1 V, lainepikkus 625-630 nm, maksimaalne võimsuse hajumine on 40 mW, anood on siin tavaline, see tähendab pluss. LED-maatriksi üldmõõtmed 37 peal 37 peal 8 mm. Peate hoolikalt jootma, ärge puudutage jootekolvi, mille temperatuur on 260 kraadi, kauem kui 5 sekundit, soovitatav töötemperatuur on -40 - +70 Celsiuse järgi.

Kui teil on LED-idel mitu sellist maatriksit, saate need ühendada, et luua suuri teabetahvleid.

Maatriksekraan - seade, mis koosneb 8x8 LED maatriksist ja MAX7219 kiibil põhinevast juhtplaadist koos minimaalse vajaliku torustikuga. Fotol näete juba valmis seadet, kuid see tuli mulle sellisel kujul posti teel, nii et pidin jootekolbi kätte võtma ja kõik õigesti jootma.

Põhiühendus Arduino Nano plaadiga on näidatud elektriskeemil.

Nagu diagrammil näha, on kõik lihtne, peate lihtsalt ühendama mõlema plaadi kontaktid juhtmetega järgmises järjekorras:

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

Niisiis, lõpuks on aeg koodiga töötada ja LED-maatriksi käivitamiseks peate alla laadima ja installima LedControli raamatukogu. Teek toetab mikroskeeme MAXIM 7221 ja 7219. LED-maatriks kasutab draiverina MAX7219, seda me vajame. Ma arvan, et me peaksime alustama väikese visandiga, mis demonstreerib selle raamatukogu põhifunktsioone. Sketšis kasutatakse LED-ide sisse/välja lülitamiseks funktsiooni setRow(). Funktsiooni setRow() kutsumise süntaks on:

maatriks.setRow(0, rida, veerg, hulk);

Kus maatriks- klassi objekt LedControl

0 - seadme aadress SPI siinil, sel juhul on ainult üks seade ja nummerdamine algab aadressist null

rida- rida (võimalikud väärtused 0 kuni 7)

kol- veerg (võimalikud väärtused on 0 kuni 7)

seatud- seadistusväärtus ( tõsi- lülitage sisse, vale- välja lülitama)

matrix.setRow(0, 1, 4, tõene)

Lülitage sisse maatriksi LED-tuli, mis asub 1. reas ja 4. veerus.

Veel üks näide:

int x = 1;

int y = 4;

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

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

Sama on ainult muutujate kasutamisega ja sellele järgneva põleva LED-i väljalülitamisega etteantud koordinaatidel. Nii et sketšis mängitakse funktsiooni setRow () abil mitmeid animatsioone.

#include "LedControl.h" //LedControli klassi loomise süntaks (dataPin,clockPin,csPin,numDevices) //Kus LedControl on klassi objekt //dataPin on Arduino plaadi pin, millele DIN-tihvt lisatakse olema ühendatud //clockPin on plaadi pin Arduino, millega CLK viik ühendatakse //csPin - pin Arduino plaadil, millega ühendatakse CS pin //numDevices - siini seadmete arv / /Looge meie puhul ühe ühendatud seadmega maatriksiklassi objekt LedControl maatriks = LedControl(12, 11 , 10, 1); //Viteaeg maatriksi LED-i sisse/välja lülitamiseks const int delayValue = 100; //Funktsioonide prototüübid //Järjekordne sisse-/väljalülitamine void PointSerialSet(); //Madu paremalt vasakule void PointRigthToLeft(); //Madu alt üles void PointDownToUp(); //Madu vasakult paremale void PointLeftToRigth(); //Madu ülevalt alla void PointUpToDown(); //Efekt - hääbumisimpulss void PointFading(); //Efekt - impulss void PointPulse(); //Efekt - kasvav impulss void PointClimbing(); //Spiraali keeramise efekt tühimikus PointToSpiralIn(); //Spiraali väljapoole keerutamise mõju tühimik PointToSpiralOut(); void setup() ( // Seade aadressiga 0 ärka vaikimisi matrix.shutdown(0, false); //Seadke LED-maatriksi heledus 8-le //Võimalikud väärtused on 0 kuni 15 matrix.setIntensity( 0, 8) ; //Kustuta kuvamatrix.clearDisplay(0); ) void loop() ( //Kutsuvad funktsioonid ükshaaval PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading (); PointPulse() ; PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Funktsiooni kehad void PointSerialSet() ( //Kasutage funktsiooni setLed(address, row, col, set) //Järjekordne sisselülitamine read for(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) ( maatriks.setLed(0, j, i, true); viivitus(delayValue); maatriks.setLed(0, j, i, false); ) else ( maatriks.setLed(0, n, i, true); delay(delayValue) (int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( maatriks.setLed(0, i, n, true); viivitus(delayValue); maatriks.setLed(0, i, n, false); ) else ( maatriks.setLed(0, i, j, true); delay(delayValue); maatriks.setLed(0, i, j, false); ) ) ) ) void PointLeftToRigth() ( //Kasutage funktsiooni setLed(aadress, rida, veerg, set) //Snake vasakult paremale (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( maatriks.setLed(0, j, i, true); viivitus(delayValue); maatriks.setLed(0, j, i, false); ) else ( maatriks.setLed(0, n, i, true); delay(delayValue) (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( maatriks.setLed(0, i, n, true); viivitus(delayValue); maatriks.setLed(0, i, n, false); ) else ( maatriks.setLed(0, i, j, true); delay(delayValue); maatriks.setLed(0, i, j, false); ) ) ) ) void PointFading() ( //Kasutage funktsiooni setLed(aadress, rida, veerg, set) //Fading efekt int upValue = 0 ; int downValue = 7; for(int i = 0; i< 8; i ++) { if(i % 2) { for(int n = downValue; n >= upValue; n --) ( maatriks.setLed(0, n, i, true); viivitus(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 --) ( maatriks.setLed(0, n, i, true); viivitus(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; ronida --) ( matrix.setLed(0, ronida, i, tõsi); delay(delayValue / 4); matrix.setLed(0, ronida, 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 >= pikkusX - 1 - nihe) ( dir = 1; ) jätka; ) if(kataloog == 1) ( punktY ++; if(punktY ><= 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 >= pikkusX - 1 - nihe) ( dir = 1; ) jätka; ) if(direktor == 1) ( punktY ++; if(punktY >= pikkusY - 1 - nihe) ( suund = 2; ) jätka; ) if(direktor == 2) ( punktX --; if(punktX<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }

Video sketšist:


Kommentaaride toimimiseks lubage JavaScript.

See artikkel on loodud neile, kes ostsid tühja 8x8 maatriksi ja 74hc595 nihkeregistrid ega tea, kuidas seda kõike ühendada.

Otsisin Internetist pikka aega juhiseid, kuidas ülaltoodud komponente ühendada, kuid leidsin kas mitte oma registrite või mittetöötavate visanditega, nii et otsustasin, et pean ikkagi käte ja peaga tööd tegema, et endale meeldida. 8 * 8 pildiga.

Olles leidnud Internetist maatriksi- ja nihkeregistrite andmelehed, joonistasin järgmise diagrammi:

Mõlema mikrolülituse 12. jalg (riivitihvt), portide säästmiseks on tavaline, kuna registreid pole mõtet erinevatel aegadel lukustada. Mõned maatrikstihvtid (anoodid) on ühendatud voolu piiravate takistitega, mille nimiväärtus on 220 oomi. Kõik muu vastavalt skeemile on äärmiselt lihtne. Igaks juhuks pilte maatriksi pinoutiga.

Pilte tuleb kuvada rida-realt (muidu sarnaste maatriksitega pole võimalik), väikese viivitusega (inimsilm praktiliselt ei erista 1 ms viivitust).

Püüdsin visandis kõike selgitada. Tahvlile üles laadides kuvatakse ekraanil numbrid, mis me arduino pordi monitorile saadame.(Vaata videot)

Valmis seadme foto (ekraanil siksak, visandil on selle pilt salvestatud pildimassiivi)

Tulevikus proovin sellel väljapanekul midagi huvitavat teha.

Lõpuks saabusid Hiinast maatriksmoodulid. Iga moodul koosneb MAX7219 kiibist (), LED-maatriksist, ühest kondensaatorist ja ühest takistist on rakmed.


MAX7219 juhib SPI-liidese kaudu.


Klastris olevad mikroskeemid on ühendatud järjestikku. Internetist lugesin, et maksimaalne võimalik jadaühendus lubab ainult 8 tükki MAX7219. Ei usu. 16 moodulit ühendatud ja kõik töötab hästi.

Ali esitletud moodulid on saadaval mitmes versioonis. Kõige populaarsemad on 2 tüüpi: mikroskeemiga DIP-is ja SOIC-pakettides. DIP-kiibi moodul on suurem ja mitte nii mugav, kui see on ühendatud klastris. Peate ühendama hunniku juhtmeid.


SOIC-pakendis kiibiga moodulid on LED-maatriksi suurused ja on ühendatud jootmise või džempritega. Selgub kena ja korralik.


Tuntumad teegid maatriksite ja klastritega töötamiseks on Mark Rice'i paneel MAX72xx ja MajicDesignsi parola: Esimest teeki on lihtsam kasutada, teist on keerulisem ja rohkemate funktsioonidega. Ma kirjutan selle üksikasjalikumalt.

MAX72xx paneel

MAX72xx paneeli kasutamisel on nõutav raamatukogu installimine Adafruit GFX.

Teksti venestamiseks peate alla laadima SEE FAIL ja asendage Arduino/Libraries/Adafruit-GFX-Library-masterkataloogis vaikefail glcdfont.c. Ka selles failis on lisaks vajalikele tähtedele ja numbritele kirjeldatud hunnik kõikvõimalikke märke. Kõik neist ei pruugi olla kasulikud. Allolev pilt selgitab, kuidas sümbolid moodustatakse.

Vajadusel saate luua oma sümbolid ja asendada need failis olevate kasutamata sümbolitega. Peaaegu kõik erinevates teekides kasutatavad bitmap-fondid on moodustatud sel viisil.

Seega on installitud MAX72xx Panel ja Adafruit GFX teegid, fail glcdfont.c asendatakse. Käivitage Arduino IDE, avage FAIL. Sketšis on utf8rus funktsioon. See pakub vene keele märgitabeli ümberkodeerimist. Seda on vaja ainult programmi tavapäraseks väljundiks, see tähendab, et programmis kirjutatakse soovitud tekst vene keeles. Kui tekst sisestatakse COM-pordi kaudu, siis märgikoodid parandatakse funktsioonis Serial_Read. IDE-s ja konsoolis kasutasid arendajad erinevaid kodeeringuid.

Faili alguses on raamatukogu tööks vajalikud read.

int numberOfHorizontalDisplays = 1;

int numberOfVerticalDisplays = 16;

Mul on kiibiga moodulid SOIC pakendis. Neil on väike funktsioon. Moodulite maatriks paigaldatakse 90 kraadi võrra pööratuna. See on mugavuse tasu. Kui käivitate teekidega kaasas olevad visandid, väljastavad need igas moodulis teksti alt üles. Tekst kuvatakse siksakidena. Selle vaevuse raviks tuleb raamatukogule "ütleda", et seal on 16 vertikaalset kuvarit (need asuvad füüsiliselt horisontaalselt). Seejärel määrake tühihäälestuses teegi rida

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

See pöörab iga maatriksi programmiliselt ümber. Ja kõik kuvatakse normaalselt.

DIP-kiibipaketiga moodulitel seda pole. Kõik on ilus, välja arvatud hunnik juhtmeid.

MAX72xx paneeli teek on üsna tagasihoidlik. Visuaalseid väljundefekte pole. Klastrit tajutakse ühe tervikuna. MD Parolaga on asjad palju paremad.

Parola autor MajicDesigns.

SOIC-paketis kiibiga moodulite omanikud seisavad silmitsi ka moodulite klastris orienteerimise probleemiga. Ainult see näeb välja veidi teistsugune kui mudelil MAX72xx. Siin ilmuvad moodulid justkui järjekorraväliselt.


HelloWorldi sketš teegiga kaasasolevatest näidistest.

Sketšis ei saanud ma programmiliselt seda haigust ravida. Ma kohtlesin teda teisiti. Failis Adruino/libraries/MD_MAX72xx_lib.h lõpus tuleb leida read nagu pildil.


Ja fikseerige valitud rida 1 kuni 0. Salvestage fail. Arduino IDE-d ei ole vaja taaskäivitada. Valame, vaatame.


Nüüd saate kasutada 24 animatsiooniefekti. Animatsioon käivitatakse käsuga P.displayText (“Kuvatav tekst”, “teksti joondus”, kiirus, kuvamise viivitus, tuhmumisefekt, tuhmumisefekt). Nagu näete, on seadeid palju.

Ja kõige meeldivam on klastri jagamine virtuaalseteks tsoonideks. Tsoonidega töötamine pole eriti keeruline. Ma ei postita visandit, see on raamatukoguga kaasas olevates näidistes. Nüüd saate ilma probleemideta kuvada klastri alguses olevat kella ja ülejäänud moodulite uudiste tickerit.

Nagu juba arvata võite, on probleem kirillitsa tähtedega. Ta on ka lahendatav. Eelmise faili kõrval samas kataloogis on fail MD_MAX72xx_font.cpp. See on fondifail. Selles olevad märgid moodustatakse sarnaselt raamatukogu GFX-fondifailiga. Väike erinevus on. Siin võib tähemärgi suurus olla väiksem kui 5 punkti. Näiteks Adafruit GFX teegis võtab hüüumärk enda alla samad 5 punkti, mis on sama lai kui mis tahes muu sümbol, kasutatakse ainult ühte punktide rida. Ülejäänud ei helenda, vaid neid kasutatakse sümbolina. Parolas hõivab sama hüüumärk ka ühe punktirea, ainult et läheduses pole tühje punkte, kuid kõrvutiasetsevad märgid võivad olla. Pildi mõistmine on selgem.


Sarnaselt esimese vaadeldava teegi failiga pole aega faili kirillitsa tähtedega täiendada. Kui keegi seda teeb ja mulle faili saadab, lisan selle sellele artiklile ja nii mina kui ka minu saidi külalised oleme teile tänulikud.

Tulemus. Mark Rice'i paneeli MAX72xx teeki on lihtne kasutada ja arusaadav, kuid selle funktsionaalsus on nõrk.

MajicDesignsi Parola teek on keerulisem ja sellel on peaaegu iga rakenduse jaoks piisavalt võimalusi.

Eelmistes tundides õppisime vahetuste registri abil. See osutus veidi keerulisemaks kui otse üldotstarbelistest tihvtidest. Probleem, mille me siis lahendama pidime, oli Arduino kontrolleri juhitavate väljundite piiratud arv. Meie uurimistöö apogee oli dünaamilise näidustuse kasutamine. Nüüd on aeg ülesannet veidi keerulisemaks muuta: õpime töötama LED-maatriksiga.

1. Maatriksi indikaator

Nagu me juba teame, koosnevad segmendiindikaatorid, olgu need siis skaalad või numbrid, üksikutest omavahel ühendatud LED-idest. Näiteks LED-ide rühmas võivad kõik katoodid olla ühendatud. Sellisel indikaatoril on järelsõna "ühise katoodiga", muidu - "ühise anoodiga". Ja mis juhtub, kui asetame LED-id mitte numbri või skaala, vaid ruudustiku kujul? See osutub üsna graafiliseks indikaatoriks. See tähendab, et saate kuvada mitte ainult numbri, vaid ka mingi pildi. Sellist võrku nimetatakse maatriksiindikaatoriks ja LED-ide puhul LED-maatriksiks. Maatriksi indikaatori eraldusvõime on horisontaalsete ja vertikaalsete punktide arv. Näiteks levinumate indikaatorite eraldusvõime on 8×8 pikslit. Kui on vaja suurema eraldusvõimega LED-maatriksit, koosneb see lihtsalt mitmest 8x8 indikaatorist. Kuidas seda teha, näeme hiljem. Vahepeal mõtleme välja, kuidas on ühendatud kõik 64 maatriksi sees olevat LED-i. Muidugi oleks võimalik, nagu seitsmesegmendilise indikaatori puhul, ühendada kõik LED-id ühise katoodi või anoodiga. Sel juhul vajaksime kas 64 kontrolleri kontakti või 8 nihkeregistrit. Mõlemad variandid on väga raiskavad. Õigem variant on kombineerida LED-id ühise katoodiga 8 tükist koosnevateks rühmadeks. Olgu need maatriksi veerud. Seejärel ühendatakse nendes veergudes olevad paralleelsed LED-id uuesti 8 tükist koosnevateks rühmadeks, millel on ühine anoodi. Saate järgmise skeemi:
Oletame, et ülesandeks on valgustada R6C3 LED. Selleks peame viigule R6 rakendama kõrge signaali ja ühendama kontakti C3 maandusega. Seda punkti välja lülitamata proovime süüdata veel ühe - R3C7. Ühendage positiivne toitejuhe R3-ga ja maandus C7-ga. Kuid sel juhul ristuvad read R6 ja R3 veergudega C3 ja C7 mitte kahes, vaid neljas kohas! Järelikult ei sütti mitte kaks, vaid neli punkti. Probleem! Ilmselgelt võib sama aidata. Kui lülitame punktid R6C3 ja R3C7 kordamööda väga kiiresti sisse, saame kasutada nägemise püsivust – võimet tõlgendada kiiresti muutuvaid pilte tervikuna.

2. LED maatriks ja nihkeregistrid

Oma tunnis ühendame lihtsaima 8 × 8 punase LED-maatriksi Arduino Unoga. Pin nummerdamine algab vasakust alumisest nurgast. Samas ei ole jalgade 1-16 nummerdamine mingi loogikaga seotud veergude ja ridade C ja R nummerdamisega.
Keskendudes dünaamilise näidu õppetükile, proovime kasutada maatriksindikaatori juhtimisskeemis 8-bitiseid nihkeregistreid. Ühe registri ühendame veergude eest vastutavate indikaatori väljunditega ja teise reaväljunditega. elektriskeem
Tähtis märkus nr 1. Selle ahela takistid peavad olema esimesest nihkeregistrist tulevatel liinidel. See nihkeregister vastutab veergude eest. Selle ühendusega määrab iga takisti dünaamilise algoritmi igal etapil ainult ühe LED-i voolu. Seetõttu helendavad kõik LED-id ühtlaselt. Tähtis märkus nr 2.Ülaltoodud diagramm on ainult informatiivsel eesmärgil. Õigem oleks teise registri ja maatriksi vahesse lisada täiendav toite mikroskeem, näiteks transistorikomplekt ULN2003.

3. Programm

Et oleks lõbusam, proovime indikaatoril esile tõsta emotikon. Nagu juba mainitud, kasutame pildi kuvamiseks maatriksil dünaamilist indikatsiooni. Nimelt tõstame oma pildi rida-realt esile. Kõigepealt valgustame vajalikud veerud kõige ülemises reas, seejärel teises, kolmandas ja nii edasi kõigi 8 rea jaoks. Esimene vahetusregister vastutab veergude ja teine ​​ridade eest. Seetõttu koosneb stringi väljund kahest järjestikusest registrisse kirjutamisest: kõigepealt edastame stringi koodi, seejärel selle stringi punktide koodi. Selles programmis kasutame ka funktsiooni digitalWrite kiirendatud versiooni. See on vajalik selleks, et dünaamiline näiduprotsess kulgeks väga kiiresti. Vastasel juhul näeme maatriksi märgatavat virvendust. Allikas const byte data_pin = PD2; const bait st_pin = PD3; const bait sh_pin = PD4; unsigned long tm, next_flick; const unsigned int to_flick = 500; baidirida = 0; const baidi andmed = ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b001); void latchOn()(digitaalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(bait d)(for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; rida++; if(rida == 8) rida = 0; // edasta reakood fill(~(1<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flick ja funktsioon täita meile juba teadaolevatest tundidest umbes ja umbes. massiivi andmeid salvestab meie pildi kaheksa rida. Mälu säästmiseks salvestasime iga punktide kombinatsiooni binaarsel kujul. Funktsioon lukkOn avab registri riivi. Seda tuleks teha alles pärast seda, kui mõlemad nihkeregistrid on täidetud. Pärast programmi laadimist Arduinosse ilmub indikaatorile emotikon.

4. Animatsioon LED-maatriksil

Ja nüüd viimistleme programmi nii, et indikaatoril olev pilt muutub iga poole sekundi järel. Selleks meenutagem uuesti. const byte data_pin = PD2; const bait st_pin = PD3; const bait sh_pin = PD4; unsigned long tm, next_flick, next_switch; const unsigned int to_flick = 500; const unsigned long to_switch = 500000; baidirida = 0; baidi kaader = 0; Const Byte andmed = ((0B001111100, 0B01000010, 0B10100101, 0B10000001, 0B10100101, 0B10011001, 0B01000010, 0B00111100), (0B001111111111111101101, 0B1011011, 0B10111, 0b10101, 0b10101, 0b1011, 0b1011, 0b1011, 0b1011, 0b101 void latchOn()(digitaalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(bait d)(for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<järgmine_viip<<(7-line))); fill(data); latchOn(); } tm = micros(); if(tm >next_switch)( next_switch = tm + to_switch; frame = !frame; ) ) Laadime Arduino programmi ja jälgime tulemust.

5. LED-maatriksi skaleerimine

8×8 LED-maatriks sobib kahe numbri või lihtsa tähemärgi kuvamiseks. Kui soovite indikaatoril kuvada mõnda enam-vähem kasulikku pilti, peate maatriksid kombineerima. Seda tehakse uute nihkeregistrite lisamisega nii vertikaalselt kui ka horisontaalselt. Tuleb märkida, et Arduino Uno kontrolleri kiirus koos nihkeregistritega on piisav ainult 16 × 16 ekraani jaoks. LED-ekraani suuruse edasine suurendamine toob kaasa märgatava virvenduse.

Ülesanded

  • Hüpnoos. Programmeerige kontroller nii, et LED-maatriksile tekivad 1 sekundi jooksul pidevalt kasvava raadiusega kontsentrilised ringid.
  • Madu mäng. Rakendage 8 × 8 LED-maatriksil sellist tuntud mängu nagu madu. Ringlusse on vaja lisada neli nuppu liikumissuuna juhtimiseks, samuti sumin, mis annab märku õunte söömise sündmusest (või mida iganes madu seal sööb...).
  • Elektrooniline tase. Lisage vooluringile kiirendusmõõtur. Kirjutage programm, mis kuvab LED-maatriksil punkti, mille koordinaadid sõltuvad kogu seadme kaldest. Näiteks kui seade on fikseeritud maapinnaga paralleelselt (gravitatsioonivektoriga risti), siis on punkt keskel. Kui elektrooniline loodi on kallutatud vasakule, nihutatakse punkt proportsionaalselt paremale.

Järeldus

Pärast maatriksi juhtimisahela kokkupanemist võib paljudel tekkida küsimus: "Noh, kas keegi pole 30 aasta jooksul tulnud välja lihtsama viisiga maatriksiga töötamiseks?" Tegelikult said nad sellest aru. Erinevat tüüpi kuvaritega töötamiseks, sealhulgas LED-maatriksiga töötamiseks, on spetsiaalsed mikroskeemid. Ühes järgmistest õppetundidest õpime, kuidas indikaatorit MAX7219 kiibi abil juhtida. See meetod võimaldab meil hõlpsasti ühendada mitu maatriksit ühe suure ekraaniga, ilma et oleks vaja elektriahelat oluliselt keerulisemaks muuta.