Matrice 256 LED

Ho creato una semplice matrice di LED 16 colonne x 16 righe = 256.
I LED sono pilotati da Power mosfet 16 canale P e 16 canale N.

Qui sotto un semplice programmino per le prove.
Se assegno 0xFF a tutte 4 le porte, rimangono
tutte a 0 cioè tutto spento.

Se a una delle due porte PORTA o PRTL che sono le colonne
(canale P) le assegno un valore inferiore o uguale a 0xF2 le uscite
si attiveranno, naturalmente per quel valore.

Qualche idea?

Carletto

//-------------------------------------------------------------------------------
//Matrice 16 x 16 = 256 LED
//con arduino mega2560.
void(){
DDRA=0xFF; //Colonne da 0 a 7.
DDRL=0xFF; //Colonne da 8 a 15.
DDRB=0xFF; //Righe da 0 a 7.
DDRK=0xFF; //Righe da 8 a 15.
delay(50);
}
void loop(){
PORTA=0xFF;
delay(100);
PORTL=0xFF;
delay(50);
PORTB=0xFF;
delay(50);
PORTK=0xFF;
delay(50);
}

Quello non é un multiplexing.
Il multiplexing funziona che metti solo una riga a H e i LED che vuoi accendere in quella riga metti a L il numero correspondente per le colonne. Poi fai la stessa cosa per la sucessiva riga ecc. Puoi anche invertire colonne e righe.

Ciao Uwe

uwefed:
Quello non é un multiplexing.
Il multiplexing funziona che metti solo una riga a H e i LED che vuoi accendere in quella riga metti a L il numero correspondente per le colonne. Poi fai la stessa cosa per la sucessiva riga ecc. Puoi anche invertire colonne e righe.

Ciao Uwe

Tra i vari giochi di luce ho bisogno di accendere tutti i LED della matrice, quindi necessita che
tutte le colonne e tutte le righe siano poste a livello H.
Si può fare anche in altro modo però arrivato a questo punto mi chiedo se è possibile
attivare tutte queste uscite contemporaneamente.

Ciao Carletto.

Dove hai messo quale resistenze?
Una su ogni led? Ok allora si possono accendere tutti i LED assieme.
Ciao Uwe

uwefed:
Dove hai messo quale resistenze?
Una su ogni led? Ok allora si possono accendere tutti i LED assieme.
Ciao Uwe

Naturalmente ogni LED ha una resistenza in serie, corrente sui 15 mA.
Sui gate dei canale N ho messo in serie una resistenza di 4k7 mentre sui gate
dei canale P ho utilizzato un ULN2803 e relative resistenze per lo spegnimento.

Ho eseguito un circuito del genere pilotato con un PIC18F4525 e non ho
avuto questo problema.

Carletto

allora puoi accendere tutti insieme. Per risparmiare corrente puoi fare anche il multiplexing.
Ciao Uwe

Con il vero multiplexing usavi solo 16 resistenze. Per accendere "insieme" tutte le 16 righe accendevi per x tempo la 1a riga, poi la spengevi e passavi alla 2a riga, la accendevi per x tempo, poi la spengevi e passavi alla 3a e così via fino in fondo.
In questo modo erano tante resistenze (e saldature) in meno nonché un discreto risparmio in termini di corrente consumata e, conseguentemente, di alimentatore.

Ok grazie per le risposte, mi sono piantato però su un altro problema e cioè
visto che il mio mega2560 ha tutte quelle uscite mi chiedo perchè se ne comando
32 (4 porte) mi va in tilt, non mi attiva nessuna uscita mentre se ne comando
di meno funziona.

Risolto questo problema utilizzerò un 595 che con poche
uscite riurirò a pilotare tutti i LED.

Carletto.

carletto:
Ok grazie per le risposte, mi sono piantato però su un altro problema e cioè
visto che il mio mega2560 ha tutte quelle uscite mi chiedo perchè se ne comando
32 (4 porte) mi va in tilt, non mi attiva nessuna uscita mentre se ne comando
di meno funziona.

Spiegati meglio. Dettaglia un pochino :wink:

//Se carico 255 su le 2 porte delle colonne non ho uscite.
void loop(){
PORTA=255; //Colonne
PORTL=255; //Colonne
PORTB=255; //Righe
PORTK=255; //Righe
}
//Se invece su una delle 2 carico un valore 242 o inferiore tutto OK.
void loop(){
PORTA=242; //Colonne
PORTL=255; //Colonne
PORTB=255; //Righe
PORTK=255; //Righe
}

Carletto.

ma quanta corrente viene assorbita da tutti i pin accesi contemporaneamente? hai fatto un po' di conti?
ricordati che ci sono dei limiti di corrente: max 200 mA su tutto il micro (compreso il core, non solo la corrente che esce/entra dai pin).

leo72:
ma quanta corrente viene assorbita da tutti i pin accesi contemporaneamente? hai fatto un po' di conti?
ricordati che ci sono dei limiti di corrente: max 200 mA su tutto il micro (compreso il core, non solo la corrente che esce/entra dai pin).

Non ho controllato l'assorbimento totale, domani controllerò.
Ho però gli assorbimenti singoli:
Un pin delle colonne assorbe 0,5 mA, mentre sui pin delle righe rilevo una corrente
quasi trascurabile.

Carletto.

Ma te lo fa indipendentemente dalla porta che usi (cioè se attivi tutte le uscite della porta A non puoi fare altrettanto con la porta L e viceversa) oppure solo su una porta?

RISOLTO!

Una svista imperdonabile.

Per le prove ho utilizzato l'alimentazione tramite il cavo USB
senza connettere il GND di arduino con quella della scheda.

Quello che mi ha portato fuori strada è stato il fatto che con un
certo numero di uscite funzionava.

Adesso come mi avete suggerito proverò anche con uno shift register,
ho dei 595 sarà la prima volta con questi componenti.

Grazie per i vostri interventi.
Credo che ne avrò bisogno anche con il 595.

Carletto.

carletto:
Adesso come mi avete suggerito proverò anche con uno shift register,
ho dei 595 sarà la prima volta con questi componenti.

Grazie per i vostri interventi.
Credo che ne avrò bisogno anche con il 595.

Carletto.

Allora leggi qui:

Puoi mettere tutti 4 i 595 in serie o pilotarli 2 a 2 separando collonne e righe.
Ciao Uwe

uwefed:
Puoi mettere tutti 4 i 595 in serie o pilotarli 2 a 2 separando collonne e righe.
Ciao Uwe

Visto che ho la mega2560 con abbondanza di I/O pensavo di fare delle prove con
questo esempio:
http://arduino.cc/playground/Main/DirectDriveLEDMatrix

ma ho bisogno di un aiuto sulle porte da utilizzare:

Estratto dello schema:
// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};

// col[xx] of leds = pin yy on led matrix
int cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[06], pins[11], pins[15], pins[16]};

// row[xx] of leds = pin yy on led matrix
int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]};

E' esatto dire che le colonne sono collegate ai pin 13,3,4,10,6,11,15,16 ?
Stesso raggionamento per le righe?

Carletto