În acest tutorial o să conectăm matricea de leduri 8×8 la placa de dezvoltare Arduino cu ajutorul registrului de deplasare 74HC595. Spre deosebire de partea anterioară a acestui tuturial, unde matricea de leduri a fost legată direct folosind 16 pini de pe placa de dezvoltare, acum vom folosi doar 3 pini pentru transmiterea datelor către matricea de leduri.

Necesar

-Placa de dezvoltare Arduino Uno
-Breadboard
-2buc. 74HC595
-matricea 8×8
-1 UDN2981A
-8 rezistenţe de 220Ω.

UDN2981A sau ce reprezintă un ‘source driver’

UDN2981A
Iniţial am realizat montajul conform cu schema de mai jos.

Led-MAtrix_2_schem-old.p

Testandul cu un program care afişa litera ‘A’ am observat faptul că ledurile aveau o intensitate foarte scăzută şi nu înţelegeam de ce. După o mica vizită la prietenul Gogu(a se citi Google) am descoperit faptul că registrul de deplasare care era legat pe cele 8 rânduri ale matricei poate furniza suficient curent pentru a alimenta doar un led(aprox 40mA). Matricea avand 8 coloane era şi normal ca în momentul în care doream să aprind toate cele 8 leduri intensitatea lor să scadă foarte mult(curentul cerut era de aprox.320mA). Mi-am pus problema cum pot să furnizez mai mult curent matricei de leduri. După o încercare eşuată în folosirea unui ULN2003A, tot prietenul Gogu mi-a explicat faptul că ULN2003A este un sink driver iar eu am nevoie de un source driver, deoarece matricea este cu catod comun. Diferenţa între un ‘sink driver’ şi un ‘source driver’ este faptul că ‘source’ driverul aplică o tensiune către masă, pe când ‘sink’ driverul duce la masa un consumator care este deja alimentat. De asemenea ‘sink’ driverul poate furniza un curent mult mai mare decât ‘source’ driverul.

Interfaţarea marticei cu placa de dezvoltare Arduino

De aceasta dată am respectat o anumita ordine la conectarea rândurilor şi coloanelor matricei la ‘source driver’/registru de deplasare respectiv registrul de deplasare. Am conectat coloana 1 la ieşirea 1 de pe registrul de deplasare, coloana 2 la ieşirea 2, etc. Acelaşi lucru l-am facut şi pentru rânduri. Ordinea de legare a matricei ne ajută la efectuarea calculelor pentru deplasarea cadrelor, realizarea caracterelor etc.

Led-MAtrix_2_schem-new.p
Şi acum programul

Din discuţiile avute cu domnul Sebastian Andrei depre matricele de leduri am descoperit un instrument foarte interesant: http://pial.net/page/tools.aspx. Această pagina web o să te ajute enorm la definirea caracterelor, în cazul în care nu eşti familiarizat cu Excel  sau LibreOffice.Calc.
Programul pentru acest tutorial realizează două animaţii. Schimbarea acestora se face prin selectarea numarului de program cu ajutorul monitorului serial (din Arduino IDE): 0-Stop;1-Animaţia 1;2-Animaţia 2

//Pini de mai jos nu sunt obligatorii. Puteti conecta registrul de deplasare pe ce pini doriti.
int latchPin = 8;//ST_CP de la 74HC595 este conectat pe pinul 8
int clockPin = 12;//SH_CP de la 74HC595 este conectat pe pinul 12
int dataPin = 11;//DS de la 74HC595 este conectat pe pinul 11

int l1[12]={3,6,12,24,48,96,192,96,48,24,12,6};//stabilire imagine pentru primul program
//valorile sunt in zecimal si reprezinta fiecare coloana

int l1a[12][8]={
{64,224,176,24,12,6,3,1},
{32,112,216,140,6,3,1,0},
{16,56,108,198,131,1,0,0},
{8,28,54,99,193,128,0,0},
{4,14,27,49,96,192,128,0},
{2,7,13,24,48,96,192,128},
{1,3,6,12,24,176,224,64},
{0,1,3,6,140,216,112,32},
{0,0,1,131,198,108,56,16},
{0,0,128,193,99,54,28,8},
{0,128,192,96,49,27,14,4},
{128,192,96,48,24,13,7,2}
//stabilire imagine pentru al doilea program
//valorile sunt in zecimal si reprezinta fiecare coloana};
//In acest caz animatia nu sa putut realiza prin calcul matematic si sa optat pentru realizarea fiecarui cadru in parte

int l1b[8]={129,66,36,24,24,36,66,129};//stabilire imagine pentru stop
//valorile sunt in zecimal si reprezinta fiecare coloana

int l2[8]={1,2,4,8,16,32,64,128};//valorile necesare pentru a aprinde fiecare rand in parte
//1-reprezinta randul 1 restul oprite
//2-reprezinta randul doi restul oprite etc.

int tmp[1];
int x;
int x1;
int program=0;

void setup() {
Serial.begin(9600);//initializeaza portul serial la o viteza de 9600bps
Serial.println("Selectati programul: MATRIX[0-2]:");//meniu program

//initializeaza registrul de deplasare
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

}
//functie folosita pentru realizarea animatiei pentru programul 1
void roteste_vect()
{
tmp[0]=l1[0];
for (int i=0;i<11;i++)
{
l1[i]=l1[i+1];
}
l1[11]=tmp[0];
}

void loop() {
//asteapta dupa o valoare de la utilizator pe portul serial
while (Serial.available() > 0) {
program = Serial.read() - '0';
Serial.print("Ai selectat programul:");//afiseaza valoarea si programul selectat
Serial.println(program);
}

if(x1==12){x1=0;}
for (int k=0;k<10;k++){
for (x=0;x<8;x++){
//se transmit datele
digitalWrite(latchPin, LOW);//trece registrul de deplasare in modul programare

//in functie de programul alses registrul de deplasare destinat coloanelor e comandat altfel
if (program==1){
shiftOut(dataPin, clockPin, MSBFIRST, 255-l1[x]);
}else if (program==2)
{
shiftOut(dataPin, clockPin, MSBFIRST, 255-l1a[x1][x]);
}
else if (program==0)
{
shiftOut(dataPin, clockPin, MSBFIRST, 255-l1b[x]);
}
shiftOut(dataPin, clockPin, MSBFIRST, l2[x]); //comanda registrul de deplasare destinat randurilor
digitalWrite(latchPin, HIGH);//muta datele din memoria registrului de deplasare catre iesiri
delayMicroseconds(100);

//urmatoarele comenzi au rolul de a reinitializa matricea de leduri(stinge toate ledurile pentru a crea senzatia de animatie)
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 255);
shiftOut(dataPin, clockPin, MSBFIRST, 255);
digitalWrite(latchPin, HIGH);
}
}
x1++;//parcurge fiecare cadru din animatia progrramului 2
roteste_vect();
}

 

Un mic filmuleţ cu rezultatul aplicaţiei:


Spor la treaba!

Matricea 8×8 şi UDN2981A
Etichetat pe:        

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.