Controllare I/O multipli con pochi pin di Arduino

Arduino e il Demux/Mux

La necessità di controllare un elevato numero di sensori, LED, attuatori o più genericamente INPUT e OUTPUT, richiede controllori o processori molto potenti e con molti pin. Questa esigenza incrementa le dimensioni fisiche del dispositivo completo e, senza dubbio anche il costo, oltre che la complessità del codice e dell'hardware.
Tuttavia, laddove non vi è una esigenza di controllo real-time di ingressi/uscite ed è quindi possibile interrogarli/pilotarli in sequenza, effettuando così un 'polling', si riesce ad abbattere i costi e ridurre le dimensioni del manufatto attraverso l'ausilio di Multiplexer (MUX) e Demultiplexer (DEMUX).
Questo articolo illustra cosa sono questi dispositivi, quando è opportuno o necessario usarli e infine illustra un caso pratico di connessione ad Arduino.

La scalabilità è la capacità di un sistema di "crescere" o "decrescere" (aumentare o diminuire di scala) in funzione delle necessità e delle disponibilità.

A chi lavora o si diletta con i microcontrollori, con Arduino o semplicemente con le porte digitali, sarà sicuramente capitato almeno una volta di avvertire l’esigenza di realizzare un prototipo che goda di tale proprietà.

La necessità di rendere un sistema scalabile trova la sua massima espressione nei casi pratici in cui bisogna gestire un numero, in linea di principio imprecisato (seppur stimabile), di input e/o output (come ad esempio sensori ed attuatori).

Il buonsenso in questi casi porterebbe il progettista a cercare di quantificare a priori il numero di ingressi/uscite da gestire ed assegnare a ciascuno di questi un pin dell’unità di elaborazione che in questo articolo supporremo essere un PIC, oppure una Board di Arduino.

Quest’approccio tuttavia pone un severo limite al manufatto completo:

  • L’impossibilità di aggiungere un nuovo elemento di ingresso o uscita senza modificare l’hardware.

I circuiti logici di cui quest’articolo si interesserà e che risolvono tale problema sono detti Multiplexer (MUX) e Demultiplexer (DEMUX).

Un Multiplexer, nella sua versione più diffusa, è una circuito logico a N ingressi e 1 uscita. Attraverso un opportuno indirizzamento digitale è possibile selezionare uno qualsiasi degli N ingressi, che diventa così l’Output del dispositivo.

Un Demultiplexer svolge la funzione duale, ovvero ha N uscite e 1 ingresso. Attraverso un opportuno indirizzamento digitale, il microcontrollore può selezionare una qualunque delle uscite.

 

 

Esempio di un MUX a 1 bit e a 1 uscita

La versione di Multiplexer più semplice che si può considerare utilizza un solo bit di selezione sel con il quale è possibile collegare sulla porta di uscita una ed una soltanto delle due porte di ingresso Io e I1

Sotto l'immagine è riportata la funzione in logica di Boole che descrive quanto enunciato sopra.

Out =  Sel* I0 +  Sel I1 

Osservando le tavole di verità riportate di seguito, si evince che è possibile selezionare l’ingresso I0 (D0) quando il bit di selezione è posto a valore logico ALTO e l’ingresso I1(D1) quando il bit di selezione è posto a valore logico BASSO.

Oltre al pin di selezione, spesso, i MUX in commercio possiedono un BIT di ENABLE, per agevolare la gestione di un Multpilexing sincrono e minimizzare i consumi di potenza.

Quest'esempio, seppure autoesplicativo del funzionamento di un MUX, è ben lungi dall'evidenziarne le potenzialità, poichè il risparmio in termini di 'PIN' è di uno soltanto. Si raccomanda pertanto, per comprendere maggiormente le potenzialità del Multiplexing/Demultiplexing,  la lettura del paragrafo: "Configurazione dei pin e collegamento ad ATMEGA328".

Le tipologie di MUX e DEMUX variano fortemente e occorre sceglierli in relazione al tipo di applicazione e possono implementare al loro interno anche funzioni matematiche semplici come le somme e avere più di un’uscita, oppure un’uscita e il suo complemento.

 

Come scegliere un MUX o un DEMUX?

Nella scelta di un MUX o DEMUX, la prima scrematura deve essere fatta in base alla tipologia di applicazione, ovvero in base al numero di 2ᴺ di I/O che bisogna gestire (che determina il numero N di bit). A questo punto è possibile osservare le caratteristiche statiche e dinamiche del dispositivo e scegliere quello che più si adatta all’applicazione, a parità di prezzo, in termini di velocità di risposta, range di temperatura etc.

 

Come è fatto un MUX?

Un MUX è formato da porte logiche che possono essere costruite in diverse tecnologie, come ad esempio CMOS (la più diffusa in assoluto) e JFET (principalmente per applicazioni audio) e sfruttare diverse logiche booleane.

Nell'esempio di sotto si può osservare come, 2 Bit di selezione (A e B) possano discriminare i 4 ingressi (C0,C1,C2,C3) attraverso una logica a porte AND la cui uscita è inviata a una XOR.

Un caso pratico: l’HFE4067B come Demultiplexer

Di seguito è possibile osservare lo schema logico di un interruttore del MUX/DEMUX HEF4067B prodotto da NXP a 16 canali (4 bit di selezione) e disponibile in package DIP24 (molto comodo per testarlo su breadboard) e SO24. Nell’esempio considereremo l’utilizzo di tale dispositivo come Demultiplexer digitale collegato a un microcontrollore ATMEL ATMEGA328, lo stesso di Arduino.

Configurazione dei pin e collegamento ad ATMEGA328

Il pinout di questo componente presenta i canali I/O numerati da Y0 a Y15, i 4 bit di selezione (A0,A1,A2,A3), un bit di I/O comune Z, i due pin di alimentazione (Vdd e Vss=GND) e infine un pin di ENABLE.

Utilizzando questo dispositivo come demultiplexer si possono comandare fino a 16 canali utilizzando soltanto 4 pin del microcontrollore per l’indirizzamento, più un pin di Enable, per un totale di 5 pin per gestire 16 possibili uscite.

Attraverso questa configurazione è possibile utilizzare l’ATMEGA328 (il popolare microcontrollore utilizzato da Arduino), con i pin dal 12 al 17 impostati come OUTPUT per attuare le uscite da Y0 a Y15 del DEMUX.

Dopo aver collegato Vdd alla tensione di alimentazione (tipicamente 5 V) e Vss a GND, occorre implementare una rete di pull-down per le uscite digitali Y0…Y15 del HEF4067B.
Infatti, queste, quando sono in stato di non-selezione, sono flottanti e quindi soggette a spiacevoli fenomeni di accoppiamento di tipo elettrostatico.

Per ovviare a questo problema è sufficiente mettere un resistore di valore molto grande (100kΩ-1MΩ) tra l’uscita da pilotare e la massa.

A questo punto è sufficiente indirizzare tramite codice le uscite desiderate per fornire un output digitale all’uscita 0 piuttosto che alla 15. Per fare ciò, è necessario osservare la tavola di verità del Demultiplexer riportata in precedenza.

Da notare che lo stato delle uscite rimane inalterato fino a quando il pin di ENABLE non viene portato a un valore alto.

Pertanto l’algoritmo per fornire tensione a una ipotetica uscita arbitraria, in questo caso quella corrispondente al pin numero 11 sarà il seguente:

A0—> 1
A1—> 0
A2—> 1
A3—> 1
 E —> 1

In questo modo è possibile ad esempio pilotare l’accensione e lo spegnimento di 16 LED in maniera indipendente utilizzando soltanto 5 pin del microcontrollore.

Complicando un po’ la logica di pilotaggio è possibile, inoltre, mettere due o più MUX/DEMUX in cascata per estendere ulteriormente il numero di canali controllabili.

 

Quando usare un MUX/DEMUX?

Sicuramente quando il controllo in tempo reale non è un vincolo stringente, quando si vogliono usare al meglio le poche risorse hardware che si hanno piuttosto che aggiungerne di nuove (come ad esempio un solo ADC condiviso da più ingressi) e sicuramente quando si ha un gran numero di dispositivi che si comportano in maniera identica da gestire separatamente, siano essi dei sensori tutti uguali da cui acquisire periodicamente dati, oppure delle uscite da attuare a passi alterni.

Quando NON usare un MUX/DEMUX?

Quando i pin del microcontrollore a disposizione sono maggiori del numero di elementi che bisogna controllare, oppure si vuole utilizzare un microcontrollore con un numero minore di PIN di proposito.

8 Comments

  1. Antonello Antonello 8 aprile 2014
  2. antonio_el 8 aprile 2014
  3. Max Caruso 9 aprile 2014
  4. Luigi.D'Acunto 11 aprile 2014
  5. Luigi.D'Acunto 11 aprile 2014
  6. Max Caruso 11 aprile 2014
  7. Luigi.D'Acunto 16 aprile 2014
  8. Boris L. 17 aprile 2014

Leave a Reply