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.
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 nano | Maatriks 8x8 |
PIN 12 | PIN DIN |
PIN 11 | PIN CLK |
PIN 10 | PIN CS |
PIN 5V | PIN 5V |
PIN GND | PIN 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:
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 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.
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.