Ciao a tutti,
vorrei condividere con voi qualche appunto riguardo il collegamento di un led array a 2 shift register, che ho raccolto nei vari forum e siti vari.
L'idea è connettere un led array Kingbright TA20-11EWA a due shift register SN74LS164N, e di comandarli con tre uscite di Arduino.
Questi sono i link ai datasheet:
SN74LS164N: http://www.ti.com/lit/ds/symlink/sn74ls164.pdf
TA20-11EWA: https://www.relayspec.com/specs/014775/TA20-11EWA.pdf
Riguardo gli shift register: dal datasheet si vede che gli SN74LS che ho usato in questo progetto, a differenza di altri che hanno il latch pin, accettano in ingresso nuovi dati in un qualsiasi momento. Verranno mostrati però solo gli stati che saranno stabili alla transizione LOW-HIGH del clock.
Per evitare di mostrare alcuni "flash" durante le transizioni di stato, ho pensato di usare il pin CLR, forzando una transizione LOW-HIGH prima di ogni invio di dati.
Riguardo il led array: come si vede dal datasheet è consigliato utilizzare delle resistenze in serie alle connessioni dei pin che comandano le colonne. Io ho scelto di usare resistori da 220 Ohm.
Riguardo le connessioni: ho pensato di utilizzare uno shift register (che chiamerò SR1) per comandare le righe, ed un altro (SR2) per comandare le colonne. I pin di Arduino che ho utilizzato li chiamerò: ClockPIN, DataPin, ClearPin.
Più nel dettaglio:
- SR1:
- ho collegato DataPin all'ingresso A
- ho collegato ClockPin all'ingresso CLK
- ho collegato ClearPin all'ingresso CLR
- ho collegato i pin QA-QG rispettivamente ai pin 9, 14, 8, 5, 1, 7, 2 del TA20
- SR2:
- ho collegato ClockPin al CLK di SR1
- ho collegato ClearPin al CLR di SR1
- ho collegato i pin QA-QE rispettivamente dei resistori da 220 Ohm, a cui sono collegati rispettivamente i pin 13, 3, 11, 10, 6 del TA20
Dato che il collegamento tra i due shift register si effettua collegando l'uscita QH di SR1 all'ingresso B di SR2, ho effettuato questo collegamento, che ha reso possibile l'utilizzo della funzione shiftOut della libreria di Arduino.
Il codice per comandare l'array led si può riassumere in questo ciclo:
for(uint8_t digit=0; digit<5; digit++){
d = int(digit);
// Ripulisco gli shift register prima di inviare nuovi dati
digitalWrite(clearPin, LOW);
digitalWrite(clearPin, HIGH);
// Mi assicuro che il clock sia LOW, come consigliato dal reference shiftOut
// nel caso si utilizzino dispositivi sensibili fronti di salita
digitalWrite(clockPin, LOW);
// Si inviano dati prima a SR2 per selezionare quale colonna illuminare
shiftOut(dataPin, clockPin, MSBFIRST, 1 << d);
// Si inviano dati a SR1 per selezionare quali righe illuminare
// specificate ad esempio nella struttura dataArray
shiftOut(dataPin, clockPin, LSBFIRST, dataArray[(int)digit]);
// Delay a puro scopo dimostrativo
delay(1000);
}
Sono sicuro che ci saranno modi migliori di affrontare il problema, avete consigli da darmi?
Il prossimo step potrebbe essere (nel caso servisse) quello di utilizzare dei transistor in configurazione a emettitore comune, sempre sulle colonne, così da rendere più luminosi i led.
Spero che questi appunti aiutino qualcuno a districarsi tra le varie connessioni da effettuare.