Ad esempio, se avessi un Arduino con 4 pin IO digitali, come potresti illuminare in modo indipendente> 4 LED o leggere lo stato di> 4 pulsanti?
Ad esempio, se avessi un Arduino con 4 pin IO digitali, come potresti illuminare in modo indipendente> 4 LED o leggere lo stato di> 4 pulsanti?
Risposte:
Un registro a scorrimento come il 74595 ti permetterà di avere molte uscite con solo 2 connessioni: un pin dati e un pin clock. Impostare il pin di dati sul valore successivo che si desidera spostare nel registro, quindi pulsare il pin di clock.
Bruno ha dato una buona risposta, ma vorrei prendere alcune note.
Il famigerato 70 mA
Il 74HC595 viene spesso utilizzato come I / O esteso e come spesso utilizzato per controllare una serie di LED. Ciò che viene spesso trascurato è che è possibile utilizzarlo fuori specifica in questo modo. Il foglio dati afferma che la corrente di alimentazione totale non dovrebbe essere superiore a 70 mA, valori nominali massimi assoluti (AMR), quindi è meglio stare lontani da quello con un certo margine. Pertanto 8 LED a 10 mA sono troppi e a 20 mA supererai l'AMR di non meno del 130%! Il limite è probabilmente dovuto alla capacità corrente dei fili di collegamento e quindi la corrente troppo elevata potrebbe non solo deteriorare le prestazioni della parte, ma metterla permanentemente fuori servizio in caso di rottura del filo.
Ma ieri sera mi sono svegliato perché avevo un'idea . Il limite di 70 mA vale sia per Icc che per corrente di terra, quindi perché non dividere il nostro totale o 80 mA e lasciare che Icc ne abbia metà e corrente di terra l'altra metà? Tutto quello che devi fare è fare riferimento 4 dei LED a massa (attivo alto) e gli altri 4 a Vcc (attivo basso). Quindi la corrente della prima proviene da Icc, la corrente delle altre va a terra. In questo modo sarai in grado di utilizzare LED da 15 mA. (È così semplice che mi sento un idiota a non averci pensato prima.)
Gli orologi combinati
che pensavo Bruno salvasse un pin I / O aggiuntivo combinando l'orologio del registro a scorrimento con quelli del fermo. Sembra che abbia frainteso la sua risposta. Voglio ancora espandere questa opzione.
Cosa succede allora? La tabella a pagina 5 del foglio dati dice:
i contenuti del registro a scorrimento sono stati spostati; i contenuti precedenti del registro a scorrimento vengono trasferiti al registro di memorizzazione e agli stadi di uscita paralleli
(sottolineando da parte mia)
Quindi non sono i nuovi dati ma i precedenti essere bloccati. Non è un vero problema, assicurati di spostare un bit fittizio in più per bloccare gli ultimi dati, altrimenti tutto sarà un pin sbagliato.
La combinazione degli orologi significa anche che le uscite si alterneranno continuamente mentre si stanno spostando nuovi dati. La funzione del latch era effettivamente quella di evitarlo. In molti casi questo non sarà un problema, se puoi farlo velocemente, ma nelle situazioni peggiori potresti ottenere effetti indesiderati. Il caso peggiore potrebbe essere l'utilizzo del 74HC595 per il multiplexing di un display con una frequenza di scansione molto elevata + avere una catena di registri a scorrimento molto lunga + avere tutti gli 1 tranne uno 0, un LED spento + una stanza buia. Dal momento che quel LED vede passare tutti gli 1 ogni tanto in una stanza buia, potrebbe accendersi debolmente.
O se si combina quel multiplexing ad alta frequenza con un'uscita di controllo relè. Tutti gli zeri e quindi un 1 per il relè possono significare che l'uscita del relè non è sufficientemente lunga per essere inserita.
Certo, quelli sono casi estremi, ma terrei il clock seriale e il latch separato ogni volta che è possibile se si desidera eseguire il multiplex o altrimenti si hanno alte velocità di aggiornamento.
Concordo con Ignacio per quanto riguarda l'uso di un 74XX595, seriale in parallelo registro a scorrimento in uscita per l'espansione dell'uscita, ma in realtà avrai bisogno di 3 connessioni, una per i dati , una per l' orologio e un'abilitazione del fermo che trasferirà i dati dal registro a scorrimento interno ai fermi di uscita.
Per l'espansione degli ingressi è possibile utilizzare un 74XX165, parallelo nel registro a scorrimento in uscita seriale, questo consentirà di avere fino a 8 pulsanti per 74XX165.
La cosa buona di questo approccio è che puoi collegare in cascata diversi registri a scorrimento consentendo un numero maggiore di ingressi o uscite e, meglio, puoi mescolare 74XX595 e 74XX165 consentendo di avere un numero qualsiasi di ingressi o uscite.
Inoltre, è possibile condividere i segnali di clock e latch riducendo il numero di connessioni necessarie e semplificando notevolmente il software. In questo modo avrai solo bisogno di 4 connessioni per un numero qualsiasi di uno qualsiasi di questi registri di turno:
Mentre cercavo un diagramma, ho trovato su questo sito un modo molto intelligente per ridurre a 3 il numero di connessioni richieste. Consiste nell'usare lo stesso pin per l'input e l'output dei dati.
Il software farà qualcosa del genere per ogni impulso di clock:
Nick menziona gli espansori I / O e vale sicuramente la pena esaminarli. Digikey ne elenca più di un migliaio, ne sceglierò uno con un'interfaccia I2C come esempio, perché richiede i pin I / O minimi; minimo due.
L'NXP PCA9505 ha 40 pin I / O configurabili, l'equivalente di cinque 74HC595. È una soluzione leggermente più costosa ma ottieni molte più funzionalità per questo:
Ulteriori letture
espansori GPIO , brochure NXP
PCA9505 datasheet
Per una soluzione senza circuiti integrati aggiuntivi, è possibile utilizzare tecniche come il multiplexing e il charliplexing :
Multiplexing (nessuna resistenza di limitazione della corrente mostrata):
Il modo in cui funziona il multiplexing è abbastanza semplice: nell'esempio sopra, se vogliamo illuminare il LED1, impostiamo il pin C1 su output alto e il PIN R1 su output basso, tutti gli altri pin possono essere alti o Hi-Z (impostato su input, alto impedenza che li fa sembrare "disconnessi")
Se vogliamo accendere il LED5, impostiamo il pin C2 per l'uscita alta e R2 per l'uscita bassa.
Il numero di pin necessario per pilotare x LED può essere determinato da 2n pin per n² LED, quindi ad esempio per 16 LED abbiamo bisogno (√16) * 2 = 8 pin.
Charlieplexing:
Layout schematico alternativo (più ordinato) (suggerito da Supercat):
Questo è un po 'più complesso, ma utilizza meno pin per pilotare un numero maggiore di LED. Ad esempio, possiamo usare solo 5 pin per pilotare 20 LED come nell'esempio precedente (rispetto ad almeno 10 pin con multiplexing a matrice "normale" (da non confondere con l'uso di un circuito integrato nel qual caso il numero di pin necessari è log2 (nLED).
Per una soluzione esterna, è possibile utilizzare elementi come Shift Registers o Multiplexer come 74HC595 e 74HC151.
Un registro a scorrimento prende un flusso di input seriale di dati con clock e produce output parallelo (Serial In Parallel Out SIPO) o viceversa (PISO)
Generalmente hanno 8 uscite (o input) ma è possibile concatenare quante ne vuoi insieme per estenderle cose. Il lato negativo è che la velocità che è possibile aggiornare è divisa per il numero di uscite per ingresso (ad es. Per un registro di 8 uscite, se si dispone di un clock di ingresso da 8 MHz è possibile aggiornare a 1 MHz, per 16 uscite 500 kHz, ecc.)
Queste tecniche possono funzionare al contrario anche per gli input.