Led cube rgb e shift register 74hc595,alcuni dubbi.

Ciao a tutti,

dopo aver realizzato un led cube 8x8x8 e uno 7x7x7 con degli arduino mega,volevo cimentarmi con qualcosa di più impegnativo,ma anche più veloce,scrivere animazioni così è un incubo.

Premetto che ho pilotato i due led cube in maniera molto grezza,cioè sfruttando quasi tutti i pin,l'unica accortezza che ho usato per quello 8x8x8 è stato un decoder 3-8 perchè già sfruttavo 64 pin per le colonne.

Googlando ho trovato molte informazioni sui 74hc595,ne ho comprati una ventina e stamattina ho fatto un po' di prove,prima mettendone uno solo,poi mettendone due con lo schema suggerito qui https://www.arduino.cc/en/Tutorial/ShiftOut mi riesce tutto alla perfezione,ho anche capito che il primo shiftout riguarderà il secondo shiftregister e viceversa.

Ok,andiamo alle domande.

1)teoricamente con quel collegamento del link,quanti shift register posso collegare usando solo 3 pin?Anche 40?Prendendo i 5 volt da arduino,non ci saranno problemi di assorbimento?

2)Qualora alimentassi gli shift a 5 volt con un alimentatore a parte,posso mettere in uscita direttamente i led(con le resistenza ovviamente) o serve cmq un integrato tipo l'udn2981?Dal datasheet mi pare di aver visto che l'assorbimento massimo è di 70 mA,ma chiedo per ulteriore conferma.

3)Questo è più un problema di programmazione...se ho due shift scrivo due volte l'istruzione shiftout,poi metto delay;se dopo delay metto una sola volta shiftout e un'altra volta delay,che succede?Viene riscritto solo il primo shift register e il secondo resta con le istruzioni di prima?

il codice sarebbe

digitalWrite(Abilitazione, LOW);
shiftOut(UscitaDatoSeriale, DataClock, MSBFIRST, 0b00000001);
shiftOut(UscitaDatoSeriale, DataClock, MSBFIRST, 0b10000000);
digitalWrite(Abilitazione, HIGH);
delay(2500);
digitalWrite(Abilitazione, LOW);
shiftOut(UscitaDatoSeriale, DataClock, MSBFIRST, 0b10000000);
digitalWrite(Abilitazione, HIGH);
delay(2500);

4)Eventualmente volessi cambiare intensità,con un solo led rgb devo sfruttare 3 uscite pwm,ma se ho un led cube rgb 8x8x8(quindi 64*3) come faccio ad avere 192 uscite pwm?Questa cmq è abbastanza beta,dubito che sia alla mia portata.

  1. per pilotare TANTI shift register devi amplificare i segnali di clock e enable perché un pin non riesce a pilotare 40 entrate.

  2. I cmos (HC595) possono dare 70mA in totale sulle uscite. Se Ti serve piú corrnete devi metter dei 2983 o 2803

  3. con 2 shift register in fila devi mandare 2 volte 8 Bit. Se mandi solo 1 volta 8 Bit cambi lo stato del primo shift register e sposti i dati del primo sul secondo.

  4. non sono 64 LED *3 colori ma 512 LED. Multiplexare 8 x 64 LED x 3 colori non é facile perché devi sincronizzare il PWM ai Multiplexing.

Un cubo RGB é complesso perché per variare i colori (non solo l'intensitá) devi fare un PWM abbastanza veloce sinchronizzato col multiplexing.

Una soluzione semplice dal punto di vista del pilotaggio LED sono dei LED con controller inegrato come i WS2812.
Am adesso i problemi:
Per pilotare 512 di questi LED non basta un Arduino UNO. Un Mega potrebbe andare visto che ha 8kdi RAM senó un Teensy3.2. Comunque I LED tutto bianchi assorbono ben 31A!!

Ciao Uwe

Ok,decisamente il pwm non è alla mia portata :smiley:

Indicativamente quanti ne posso pilotare con due singoli pin?8 ci riesco?

xyzthjk:
Indicativamente quanti ne posso pilotare con due singoli pin?8 ci riesco?

che pin, come e cosa?

Intendi gli shift ? … io in un prototipo ne ho connessi 6 in cascata, e sui pin delle uscite (quelli che da uno shift vanno al successivo ed anche sull’ultimo shift, la cui uscita in teoria non va a niente) ho dovuto mettere delle resistenze da 1K verso massa, altrimenti dopo il terzo shift mi sballava tutto (non so perche’, dato che teoricamente non dovrebbero servire, so solo che senza le resistenze non andava bene, sballava a caso, e dopo averle aggiunte non lo faceva piu) … con 8 non lo so, non ho provato ma puo darsi che con le resistenze vadano anche 8 …

Ciao,
anch'io ne ho costruito uno, perché non usi un TLC5940? A me è venuto più semplice da gestire.

ciao, Giovicavalla

Giovicavalla:
Ciao,
anch'io ne ho costruito uno, perché non usi un TLC5940? A me è venuto più semplice da gestire.

ciao, Giovicavalla

sempre la stessa cosa, devi sincronizzare il multiplexing con il PWM.
Vedi Mini Monome quai alla fine c'é il link per scaricarti il Firmware con le biblioteche.
Ciao Uwe

in che senso? il tlc5940 è un driver per led, può gestire lui il pwm, arduino si limita a comunicare quale led accendere e quanto accenderlo.
ciao, Giovicavalla

uwefed:
che pin, come e cosa?

Io ho collegato in parallelo i pin 11 e 12 dei vari 74hc595 e poi il pin 9 al pin 14 del successivo.

Etemenanki:
Intendi gli shift ? ... io in un prototipo ne ho connessi 6 in cascata, e sui pin delle uscite (quelli che da uno shift vanno al successivo ed anche sull'ultimo shift, la cui uscita in teoria non va a niente) ho dovuto mettere delle resistenze da 1K verso massa, altrimenti dopo il terzo shift mi sballava tutto (non so perche', dato che teoricamente non dovrebbero servire, so solo che senza le resistenze non andava bene, sballava a caso, e dopo averle aggiunte non lo faceva piu) ... con 8 non lo so, non ho provato ma puo darsi che con le resistenze vadano anche 8 ...

Azz,che brutta notizia che mi hai dato,pensavo che ne reggessero di più.
Ma precisamente il limite quale è?Cioè...cosa è che impedisce il funzionamento di tipo 10 74hc595 in cascata?Un limite di corrente dei pin che vanno a 11 e 12?

La resistenza era massa-pin 9 giusto? I condensatori da 100 nF li avevi messi?

Giovicavalla:
Ciao,
anch'io ne ho costruito uno, perché non usi un TLC5940? A me è venuto più semplice da gestire.

ciao, Giovicavalla

Mah,proverò a dargli una guardata ma la mia formazione è da ingegnere industriale,diciamo che questo non è propriamente il mio settore...già ho difficoltà a capire un datasheet.
Mica c'è qualche guida base per questo integrato?

Per iniziare qui. Dopodiche se scarichi la libreria c'è un readme con le instruzioni. Tra le altre cose ci sono gli esempi, quindi puoi anche orientarti sul come comunicare al TLC5940 cosa fare e cosa non fare. L'unica cosa a cui devi prestare un po' di attenzione è che nella libreria c'è un file (non ricordo quale) in cui devi dichiarare quanti integrati stai usando, di default è 1.

ciao, Giovicavalla

Giovicavalla:
in che senso? il tlc5940 è un driver per led, può gestire lui il pwm, arduino si limita a comunicare quale led accendere e quanto accenderlo.
ciao, Giovicavalla

No, Ti sbagli
Non gestisce lui il PWM. Devi sempre pilotare (dare 4096 impulsi di clock sul GSCLK) e tra un impulso PWM e l'altro devi resettarlo con un HIGH sul pin BLANK. Ogni ciclo di PWM deve essere fatto partire e dato il clock. Questo é fastidioso, Un TLC5947 lo fa da solo, basta dargli i dati, ma il TLC5940 da la possibilitá di sapere quando un ciclo di PWM é finito e si puó essere passato allo strato sucessivo del dado.
Per questo uso la libreria normale TLC5940 non va bene. Devi usare la libreria che ho indicato.

Forse dovresti studiarti il datasheet del TLC5940 e leggerti bene i link che consigli.

http://playground.arduino.cc/Learning/TLC5940:
GSCLK: this is the clock for the PWM. We will reprogram TIMER2 in the Arduino to make this signal. That will cost us the native PWM on that timer, digital 11 on a mega8, 11 and 3 on a mega168.
BLANK: this marks the end of a PWM cycle in addition to blanking the output. We will reprogram TIMER1 to generate this signal. That will cost us the native PWMs on digital 9 and digital 10. (Tie a real, physical pull-up resistor on this line to keep things blanked while your Arduino boots. Depending on your hardware, it is possible that the TLC5940 would come up in a configuration that would dissipate too much power.)

What? Why are you taking away PWMs?
The GSCLK and BLANK signals need to be stable and accurate or the outputs of the TLC5940 will be erratic. By using the hardware timers we can make those be solid no matter what is going on in the sketch. ...

Ciao Uwe

Si, calma però, ho dato una mia opinione dicendo che ho realizzato un cubo rgb e che ho usato quell'integrato. A me funziona, quindi lo reputavo un consiglio decente. Poi non capisco, a me funziona con la libreria originale, potresti spiegarmi cosa cambia? grazie mille in anticipo.

ciao, Giovicavalla

Giovicavalla:
Poi non capisco, a me funziona con la libreria originale, potresti spiegarmi cosa cambia? grazie mille in anticipo.
ciao, Giovicavalla

La libreria normale pilota il TLC di continuo. Se passi da un livello del cubo all'altro lo fai in un momento qualsiasi che vuol dire che solo una parte dei LED sono accesi perché il ciclo PWM non é terninato e i dati non sono trasmessi. Questo comporta dei LED parzialmente illuminati oppure dei falsi colori.

La libreria da me indicata fa il passaggio tra un livello del cubo all'altro tra un ciclo di PWM e il successivo caricando in quel momento i dati nuovi. Non hai falsi colori, metá LED accesi o farfallio.

Ciao Uwe

Questo è molto interessante. Grazie mille, oggi ho imparato qualcosa di nuovo. Comunque io avevo parzialmente risolto il problema dello sfarfallio introducendo un delay in microsecondi tra l’upgrade del tlc e “l’accensione” di ogni piano, avevo risolto in maniera bruta a quanto pare. Grazie ancora, appena posso provo la libreria.

ciao, Giovicavalla

... ed usare semplicemente i 5947 al posto dei 5940, risolvendo cosi il problema del clock ? ... :wink:

EDIT: pero' c'e' la rottura di marroni del dover saldare il thermal pad ... vero ...

Etemenanki:
… ed usare semplicemente i 5947 al posto dei 5940, risolvendo cosi il problema del clock ? … :wink:

EDIT: pero’ c’e’ la rottura di marroni del dover saldare il thermal pad … vero …

No, il multiplexing dei 8 livelli a 64 LED deve avvenire sincronizzato al PWm. Nel 5947 il PWm é a frequenza libera e non puó essere sincronizzato col Multplexing. Il 5940 che deve essere pilotato da fuori é piú adatto.
Ciao Uwe

Ma scusa, se devi multiplexare i piani, chiamiamoli cosi, non spegni il precedente prima di inviare la stringa di dati del nuovo piano inviare il comando di latch ed accendere il nuovo piano ? (EDIT: errore mio, scusa)

Voglio dire, ho il piano 1 acceso, con la sua combinazione di led … devo passare al piano 2 … invio la stringa con i dati del piano 2 (le uscite non cambiano perche’ ho ancora XLAT basso, quindi la stringa nuova viene caricata negli shift, ma non ancora passata al latch delle uscite) … quando termino di inviare la stringa del piano 2, spengo il piano 1, alzo il pin XLAT (che mi carica i dati dallo shift al latch delle uscite, compresi quelli dei PWM, che quindi dal ciclo successivo dovrebbero, in teoria, ricominciare con i nuovi valori appena caricati nei latch), e accendo il piano due … questo, almeno in teoria, dovrebbe evitare il problema …

Oppure sfrutto il pin BLANK subito prima dell’impulso XLAT, che stando al datasheet resetta a zero tutti i contatori PWM, in modo che quando riaccendo il piano successivo, devono ripartire per forza dai valori appena caricati dagli shift con l’impulso su XLAT …

Mi da l’impressione che in uno di questi due modi il problema di sincronizzare i PWM interni al multiplexer possa venire eliminato o aggirato … al momento pero’ non ho in casa nessun 5947, quindi non saprei come fare delle prove pratiche … per cui sto cercando di immaginarmi “a mente” come potrebbero funzionare, basandomi solo sul datasheet …

xyzthjk:
Io ho collegato in parallelo i pin 11 e 12 dei vari 74hc595 e poi il pin 9 al pin 14 del successivo.

Azz,che brutta notizia che mi hai dato,pensavo che ne reggessero di più.
Ma precisamente il limite quale è?Cioè…cosa è che impedisce il funzionamento di tipo 10 74hc595 in cascata?Un limite di corrente dei pin che vanno a 11 e 12?

La resistenza era massa-pin 9 giusto? I condensatori da 100 nF li avevi messi?

Mah,proverò a dargli una guardata ma la mia formazione è da ingegnere industriale,diciamo che questo non è propriamente il mio settore…già ho difficoltà a capire un datasheet.
Mica c’è qualche guida base per questo integrato?

Mi riquoto,se ho capito bene nessuno ha risposto alle mie domande…o magari si è scesi troppo sul tecnico è non l’ho capito io :smiley: