Comandare il led array Ta20-11 con shift register SN74LS164N

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.

Grazie per la condivisione, pero' l'IC che hai scelto SN74LS164N non e' proprio il massimo per questa applicazione.
Se guardi il datasheet vedrai che i valori di corrente erogabili sono molto al di sotto di quelli necessari a pilotare dei Led

Brunello:
Grazie per la condivisione, pero' l'IC che hai scelto SN74LS164N non e' proprio il massimo per questa applicazione.
Se guardi il datasheet vedrai che i valori di corrente erogabili sono molto al di sotto di quelli necessari a pilotare dei Led

Anzitutto grazie a te per la risposta!
Si, effettivamente la corrente massima IOL è bassina, solo 8mA, ma si fa per imparare...
Secondo te, con 5 transistor NPN BC547B messi in serie ai contatti collegati alle colonne, in configurazione "amplificatore" (emettitore comune), la situazione può migliorare?