Gestire tanti LED con pochi pin

Una delle tante possibilità offerte dai LED, soprattutto dai minuscoli componenti in versione SMD, è quella di realizzare display a matrice di vario genere; il limite è che la quantità di punti è dettata dal numero di linee richieste per il pilotaggio di tutti i diodi, giacché anche ricorrendo a una matrice di righe e colonne servono sempre una linea per ogni riga e una per ogni colonna. Questo può essere un limite quando vogliamo sfruttare la più che sufficiente potenza di calcolo dei piccoli Arduino (il micro o il Nano, per esempio) per pilotare grandi quantità di LED.

Ma esiste una soluzione che incrementa la densità di diodi pilotabili, chiamata Charlieplexing, in grado di andare oltre le capacità della classica tecnica multiplexing.

Si tratta di una soluzione circuitale proposta nel 1995 da Charlie Allen alla Maxim Integrated, capace di pilotare (n * n)- n LED, dove n sta per il numero di pin del microcontrollore impiegato.

Quindi con 10 piedini o linee di I/O si possono comandare:

(10 * 10) – 10 = 90

Questo un sistema si basa sostanzialmente sul comando di LED connessi in configurazioni a due a due in antiparallelo, a loro volta in serie e parallelo: ad esempio tre gruppi di antiparallelo, due n serie tra loro e il terzo tra gli estremi di questa serie. Il tutto si pilota con appena tre linee. Il trucco sta nell’invertire e combinare opportunamente gli stati logici delle linee per sfruttare il fatto che i LED, come tutti i diodi, conducono in un verso soltanto, quindi pilotando un antiparallelo di due LED con due linee, quando una è a zero logico e l’altra ad uno si accende il primo LED, mentre invertendo la polarità si accende l’altro.

In questo caso per accendere il LED 1 occorre scrivere le seguenti linee di codice:

digitalWrite(ledPin1, HIGH);
pinMode(ledPin2, INPUT);
digitalWrite(ledPin2, LOW);

Questo breve sketch farà in modo che inizialmente il LED1 si accenderà per effetto del livello logico alto sul pin 1 e basso sul pin 2; scrivendo il contrario, ossia ledPin1, LOW e ledPin2, HIGH si illumina LD2 ed LD1 rimane spento.

Aggiungendo un terzo I/O è possibile ampliare enormemente il numero di LED pilotabili con questa tecnica:

Come vedete ora abbiamo a disposizione ben 6 LED con solo 3 PIN del nostro Arduino o qualsiasi altro microcontrollore. Come vedete giocando con la polarità di ogni singolo PIN e sfruttando la capacità dei LED di bloccare la corrente opposta è possibile accendere uno tra tutti i 6 LED.

Per esempio per accendere il LED1 dovremo semplicemente richiamare il seguente codice:

digitalWrite(ledPin1, HIGH);
pinMode(ledPin2, INPUT);
digitalWrite(ledPin2, LOW);

Se invece volessimo accendere il LED 6 dovremmo richiamare il semplice comando:

digitalWrite(ledPin1, HIGH);
pinMode(ledPin3, INPUT);
digitalWrite(ledPin3, LOW);

A vederlo così sembra che tutto possa prendere fuoco, ed è così. Inserendo codici errati è possibile cuocere i LED o ancora peggio, dopo la cottura bruciare una o più porte dell’MCU. Per questo è necessario fare una discreta attenzione durante la programmazione e essere certi di aver capito il meccanismo. In qualsiasi caso proprio perché si può comandare la polarità e quindi il verso della corrente è necessario stare estremamente attenti al flusso della corrente. In più è necessario accendere un solo LED per sezione, in modo tale da evitare corti circuiti.

Ai vantaggi del Charlieplexing si contrappongono alcuni problemi da considerare, il primo dei quali è che aumentando il numero di pin e di conseguenza di LED, è necessario aumentare anche la potenza di calcolo del processore e di conseguenza anche il clock. Inoltre, all’aumentare del numero di LED si rallenta il refresh rate dell’intera matrice, che non deve scendere sotto i 33,3 millisecondi per evitare che l’occhio percepisca la composizione.

1 Commento

  1. Ho utilizzato alcune volte questa furba soluzione prendendo spunto nel 1986 da un integratino a 8 pin della Telefunken che realizzava un VU meter a 6 led. Non sono mai andato oltre i 4 pin, lo schema diventa particolarmente complesso da gestire e mi sento di tranquillizzare anche in caso di errore del codice, è particolarmente difficile " mandare a fuoco i led ".

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu