Progetto
Con questo lavoro si utilizza arduino per pilotare una matrice di 25 led in formato 5 x5.
Per prima cosa ho cercato fra i led in mio possesso 25 con luminosità simili, nel prototipo si nota infatti che alcuni sono meno luminosi. Se li dovete acquistare prendeteli di buona luminosità e tutti dello stesso tipo.
Consiglio a chi li acquista di fare il lavoro con 30 led e di montarli 6 x 5 in questo modo le figure delle cifre e delle lettere saranno migliori.
Ho iniziato montando su una basetta millefori i 25 led colleganoli a file e colonne. ( vedi schema).
Sulla BB ho poi collegato transistor, resistenze, collegamenti con la matrice e collegamenti con arduino.
I miei led con 1,8 V si accendono bene e la corrente è di circa 6 mA
quindi: R = (5 V - 1,8 V) / 0.007 A abbiamo R = 457 ohm ( ho utilizzato R di 470 ohm).
lo schema di base è questo:
La parte più interessante del codice ( scritta da Adriano ) è la funzione qui sotto
Questa funzione fa si che si possa accendere una figura qualiasi, lettera, cifra oppure un simbolo. La cosa da fare è creare la matrice corrispondente come ho fatto io per lettere e cifre, guarda il resto del codice che è ampiamente coomentato.
*************
// questa funzione acende qualsiasi figura dove off (.) e on (x)
void accendiFigura(char* fig, int tempo)
{
spengiTutti();
for (int t=0; t < tempo; t++)
{
for (int r=1; r <=5; r++)
{
for (int c=1; c <=5; c++)
{
int i = (r-1)*5 + (c-1);
char onoff = fig[i];
if (onoff == 'X')
{
accendiPunto(r, c);
for (int d=0; d < TON; d++);
spengiPunto(r, c);
}
}
}
}
}
*************
========== INIZIO sketch =====================
/* Prenleloup Sergio
& Adriano
11 Ottobre 2012
Matrice Led 5 per 5
versione 2.00
prove per ARDUINO */
/* Il circuito unisce il led a colonne e righe
Alle righe sono collegati gli Anodi
Alle colonne sono collegati i catodi
Abbiamo quindi 5 led per riga e 5 led per colonna
Le colonne. I catodi sono chiusi a massa da 5 transistor npn BC547, pilotati da Arduino
Sulla base di ognuno è stata messa una resistenza da 1,2K.
Le righe sono comandate da Arduino
*/
// corrispondenza Pin e loro uso
// colonne
int Col_A = 12;
int Col_B = 11;
int Col_C = 7;
int Col_D = 6;
int Col_E = 5;
int da_colonne_a_pin[5] = {
12, //colonna A (indice 0)
11, //colonna B
7, //colonna C
6, //colonna D
5 //colonna E
};
// righe
int Rig_1 = 4;
int Rig_2 = 3;
int Rig_3 = 2;
int Rig_4 = 1;
int Rig_5 = 0;
int da_righe_a_pin[5] = {
4, //riga 1 (indice 0)
3, //riga 2
2, //riga 3
1, //riga 4
0 //riga 5
};
// ciao qui arduino
int parole [14] = {2,8,0,14,16,20,8,0,17,3,20,8,13,14};
const int tempo = 2000;
const int TON = 3000;
// lettere
char* Lettera[26] =
{
".XXX."
"X...X"
"XXXXX"
"X...X"
"X...X"
,
"XXX.."
"X..X."
"XXX.."
"X..X."
"XXXX."
,
".XX.."
"X...."
"X...."
"X...."
".XX.."
,
"XXX.."
"X..X."
"X..X."
"X..X."
"XXX.."
,
"XXXX."
"X...."
"XX..."
"X...."
"XXXX."
,
"XXXX."
"X...."
"XXX.."
"X...."
"X...."
,
".XX.."
"X...."
"X.XX."
"X..X."
".XX.."
,
"X...X"
"X...X"
"XXXXX"
"X...X"
"X...X"
,
"..X.."
"..X.."
"..X.."
"..X.."
"..X.."
,
"..XX."
"...X."
"...X."
".X.X."
"..X.."
,
"X..X."
"X.X.."
"XX..."
"X.X.."
"X..X."
,
"X...."
"X...."
"X...."
"X...."
"XXXXX"
,
"X...X"
"XX.XX"
"X.X.X"
"X...X"
"X...X"
,
"X...X"
"XX..X"
"X.X.X"
"X..XX"
"X...X"
,
".XXX."
"X...X"
"X...X"
"X...X"
".XXX."
,
"XXXX."
"X..X."
"XXX.."
"X...."
"X...."
,
".XXX."
"X...X"
"X...X"
"X..X."
".XX.X"
,
"XXXX."
"X..X."
"XXX.."
"X..X."
"X...X"
,
".XXX."
"X...."
".XX.."
"...X."
"XXX.."
,
"XXXXX"
"..X.."
"..X.."
"..X.."
"..X.."
,
"X...X"
"X...X"
"X...X"
"X...X"
".XXX."
,
"X...X"
"X...X"
".X.X."
".X.X."
"..X.."
,
"X...X"
"X...X"
"X...X"
"X.X.X"
".X.X."
,
"X...X"
".X.X."
"..X.."
".X.X."
"X...X"
,
"X...X"
".X.X."
"..X.."
"..X.."
"..X.."
,
"XXXXX"
"...X."
"..X.."
".X..."
"XXXXX"
};
// cifre numeri
char* Cifra[10] =
{
"..XX."
"...X."
"...X."
"...X."
"...X."
,
"..XX."
".X..X"
"...X."
"..X.."
".XXXX"
,
".XXXX"
"....X"
"..XXX"
"....X"
".XXXX"
,
"...X."
"..XX."
".XXXX"
"...X."
"...X."
,
".XXXX"
".X..."
"..XXX"
"....X"
".XXXX"
,
".X..."
".X..."
".XXXX"
".X..X"
".XXXX"
,
".XXXX"
"...X."
"..X.."
"..X.."
"..X.."
,
".XXXX"
".X..X"
".XXXX"
".X..X"
".XXXX"
,
".XXXX"
".X..X"
".XXXX"
"....X"
"....X"
,
".XXXX"
".X..X"
".X..X"
".X..X"
".XXXX"
};
void setup()
{
pinMode (Col_A, OUTPUT);
pinMode (Col_B, OUTPUT);
pinMode (Col_C, OUTPUT);
pinMode (Col_D, OUTPUT);
pinMode (Col_E, OUTPUT);
pinMode (Rig_1, OUTPUT);
pinMode (Rig_2, OUTPUT);
pinMode (Rig_3, OUTPUT);
pinMode (Rig_4, OUTPUT);
pinMode (Rig_5, OUTPUT);
}
// questa funzione accende il led x,y riga, colonna.
void accendiPunto(int r, int c)
{
digitalWrite (da_righe_a_pin[r - 1], HIGH);
digitalWrite (da_colonne_a_pin[c - 1], HIGH);
}
// questaspenge il punto
void spengiPunto(int r, int c)
{
digitalWrite (da_righe_a_pin[r - 1], LOW);
digitalWrite (da_colonne_a_pin[c - 1], LOW);
}
// questa spenge tutto
void spengiTutti_completo()
{
for (int r=1; r <=5; r++)
for (int c=1; c <=5; c++)
spengiPunto(r,c);
}
void spengiTutti()
{
spengiTutti_completo();
}
// questa accende tutto
void accendiTutti_completo()
{
for (int r=1; r <=5; r++)
for (int c=1; c <=5; c++)
accendiPunto(r,c);
}
void accendiTutti()
{
accendiTutti_completo();
}
// con questa funzione si accendono i led in colonna
void accendiColonne()
{
for ( int c =1; c <=5; c++)
{
spengiTutti();
for (int t=0; t < tempo; t++)
{
for (int r=1; r <=5; r++)
{
accendiPunto (r, c);
for (int d=0; d < TON; d++);
spengiPunto(r, c);
}
}
}
}
//con questa funzione si accendono i led per riga
void accendiRighe()
{
for ( int r =1; r <=5; r++)
{
spengiTutti();
for (int t=0; t < tempo; t++)
{
for (int c=1; c <=5; c++)
{
accendiPunto (r, c);
for (int d=0; d < TON; d++);
spengiPunto(r, c);
}
}
}
}
// si accendono le due diagonali maggiori
void accendiDiagonali()
{
{
spengiTutti();
for (int t=0; t < tempo; t++)
{
int c = 1;
int r = 1;
accendiPunto (r, c);
for (int d=0; d < TON; d++);
spengiPunto(r, c);
for (int d = 1; d <= 4; d++)
{
c = c+1;
r = r+1;
accendiPunto (r, c);
for (int d=0; d < TON; d++);
spengiPunto(r, c);
}
}
}
{
spengiTutti();
for (int t=0; t < tempo; t++)
{
int c = 5;
int r = 1;
accendiPunto (r, c);
for (int d=0; d < TON; d++);
spengiPunto(r, c);
for (int d = 1; d <= 4; d++)
{
c = c-1;
r = r+1;
accendiPunto (r, c);
for (int d=0; d < TON; d++);
spengiPunto(r, c);
}
}
}
}
// questa funzione acende qualsiasi figura dove off (.) e on (x)
void accendiFigura(char* fig, int tempo)
{
spengiTutti();
for (int t=0; t < tempo; t++)
{
for (int r=1; r <=5; r++)
{
for (int c=1; c <=5; c++)
{
int i = (r-1)*5 + (c-1);
char onoff = fig[i];
if (onoff == 'X')
{
accendiPunto(r, c);
for (int d=0; d < TON; d++);
spengiPunto(r, c);
}
}
}
}
}
// qui si lanciano le funzioni scelte
// Main programma accende led
void loop()
{
// qui scrive "ciao qui arduino"
for ( int i = 0; i<= 13; i++)
{
int parola = parole [i];
char* Figura = Lettera [parola];
accendiFigura(Figura, 3000);
spengiTutti();
delay (300);
}
// si passano altre funzioni per accendere i led in modi diversi
accendiRighe();
delay (300);
accendiColonne();
delay (300);
accendiDiagonali();
delay (300);
// si accendono le cifre e poi le lettere.
for ( int f = 0; f <= 9; f++)
{
char* Figura = Cifra [f];
accendiFigura(Figura, 2000);
spengiTutti();
delay (300);
}
for ( int l = 0; l <= 25; l++)
{
char* Figura = Lettera [l];
accendiFigura(Figura, 2000);
spengiTutti();
delay (300);
}
}
**********
Nel codice ho disegnato le figure lettere e cifre sul formato 5 x5 e non vengono troppo bene direi che 6 x 5 sia molto meglio quindi appena posso preparerò delle figure migliori.
Alla prossima
Sergio
Attenzione!!
L'autore
di queste pagine non si ritiene responsabile per eventuali danni
diretti o indiretti causati a persone o cose.
Prendete
ogni precauzione per evitare anche il minimo rischio di scosse
elettriche.
Si
avverte che:
Tensioni
alternate maggiori di 25 V sono pericolose.
Tensioni
continue maggiori di 50 V sono pericolose.
Warning!
The author of these pages will not be liable for any direct or indirect damage caused to persons or property.
The author of these pages will not be liable for any direct or indirect damage caused to persons or property.
Take any precaution to
avoid even the slightest risk of electric shock.
Please be
aware that:
AC voltages greater than 25 V are dangerous.
CC Voltages greater than 50 V are dangerous.
ciao il tuo sketch e funzionante e fighissimo mi funziona unica cosa che nn riesco a capire per far scrivere il mio nome o altre cose mi puoi spiegare ciao e grazie ancora
RispondiEliminaCiao!
EliminaNello sketch parte iniziale, dopo le dichiarazioni //pin e loro uso, trovi una rem ( // ciao qui arduino ) e sotto c'è questa riga:
int parole [14] = {2,8,0,14,16,20,8,0,17,3,20,8,13,14};
che contene i dati per scrivere " ciao qui arduino "
si tratta di un array eventualmente consulta la guida arduino sul sito:
file:///C:/Program%20Files%20(x86)/Arduino/reference/Array.html
in questo array puoi scrivere le lettere ed i numeri che vuoi visualizzare.
Nel nostro caso trovi 2,8,0,14 che corrispondono 2 = C ( questo perché l'array parte da 0 che corrisponde alla lettera A, poi 1 = B, e quindi 2 = C, si prosegue con 8 = I, 0 = A, 14 = O e così via.
Credo che non dovresti aver problemi, in ogni caso fammi sapere.
Grazie per il commento e cordiali saluti
Sergio
Ciao!
RispondiEliminaMi sono dimenticato di indicarti l'altro post sulle matrici di led, sempre su questo blog:
http://avventurarduino.blogspot.it/2012/11/nuovo-lavoro-sulle-matrici-led.html#comment-form
Con le indicazioni che trovi sul post puoi costruire caratteri a tuo piacimento, e puoi disegnare anche simboli grafici ( con le limitazioni dell'esempio 5x7 ).
Cordiali saluti
Sergio
Questo commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato da un amministratore del blog.
RispondiEliminaCiao, si potrebbe avere il programma completo della matrice 5x7? sto facendo un po fatica a mettere insieme i pezzi per farlo andare con il 5x7... grazie mille!!
EliminaGrazie per il commento (ho tolto la tua mail per la tua privacy)
EliminaFammi capire meglio quale parte non riesci a mettere insieme.
Lo sketch o altro?
Sergio