Go Down

Topic: Matrice 256 LED (Read 1 time) previous topic - next topic

carletto

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);
}

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

carletto


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.

uwefed

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

carletto


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

uwefed

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

leo72

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.

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.

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

Carletto.

leo72


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  ;)


carletto


//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.

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).

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).


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.

leo72

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?


carletto

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.



leo72


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:
http://www.arduino.cc/en/Tutorial/ShiftOut

Go Up