gbm
Che cos'è il charlieplexing
Tutorials -
Lunedì 18 Luglio 2011 01:07
Scritto da gbm

Il principale problema nello sviluppo di sistemi con più LED è la mancanza o il ridotto numero di PIN disponibili per comandare matrici o gruppi di LED in modo distinto. Per risolvere questo problema è possibile ricorrere al metodo chiamato Charlieplexing.

Nel vicino 1995, Charlie Allen alla Maxim Integrated Products ha inventato un metodo che permette di comandare una grande quantità di LED in modo distinto con un ridottissimo numero di PIN. Infatti questo sistema permette di comandare (n * n) - n LED, dove n sta per il numero di pin.

Quindi con 10 PIN otteniamo: (10 * 10) - 10 = 90

Questo è un sistema molto comodo per matrici di medie dimensioni ma comporta vari problemi ampliando il numero di PIN e di conseguenza di LED, infatti è necessario aumentare insieme ai PIN anche la potenza di calcolo del processore e di conseguenza anche il clock corredato. Piu' si aumenta il numero di LED piu' è lento il refresh rate dell'intera matrice che ricordiamo deve essere sotto di 33.3 millis per poter giocare l'occhio umano e avere una discreta fluidità. 

 

Il circuito 

Capire il meccanismo di questo sistema è semplice, ed è ancora piu' interessante fare nostra la genialità dell'ideatore, ma anche la grande semplicità del sistema stesso. Normalmente per accendere un LED con Arduino, noi colleghiamo polo lungo a una porta digitale e quello corto a una GND di Arduino. Questo pero' comporta l'uso di una digitale per ogni LED, vediamo come Charlie ha risolto la cosa:

charlieplexing

Come potete vedere il PIN 1 è connesso al + e al - dei due LED, e il PIN 2 è connesso al - e al + dei due LED.

Cosi' facendo è possibile con due porte accendere due LED, da qui in poi aggiungendo PIN sarà sempre piu' conveniente utilizzare il charlieplexing, fino al limite posto dalle capacità del nostro processore). In questo caso per accendere il LED 1 dovremo richiamare il comando:

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

Fatto questo come potete vedere, il LED 1 si accenderà grazie alla tensione positiva in arrivo dalla porta 2. Questa verrà poi fatta riconfluire nel circuito del nostro MCU trasformando in un input il PIN1 e portandolo a LOW. Il LED2 si comporterà come un diodo (è un diodo :P) e rimarrà spento bloccando la corrente dal suo polo negativo a quello positivo.

 

Aggiungendo un terzo PIN la questione cambia notevolmente e traspare l'aspetto primario (che io considero geniale) di questa tenica:

3_PIN_Charlieplexing

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 cosi' sembra che tutto possa prendere fuoco, ed è cosi'!! Inserendo codici errati è possibile cuocere i LED o ancora peggio, dopo la cottura bruciare una o piu' 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 puo' comandare la polarità e quindi il verso della corrnete è necessario stare estremamente attenti al flusso della corrente. In piu' è necessario accendere un solo LED per sezione, in modo tale da evitare corti circuiti. 

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi