I pin di Arduino Uno: come utilizzarli – Tips&Tricks

Nelle schede Arduino i pin riportati sugli header sono quelli del microcontrollore, che per Arduino Uno rev.3 è l’ATmega 328P; le connessioni realizzabili sono ingresso e uscita, per segnali digitali o analogici, ma anche per lo scambio dati su bus.

Per spiegarle analizziamo le linee di I/O partendo da quelle digitali, che possono funzionare da ingres­so (Input) o uscita (Output) in base all’inizializzazione del microcontrollore mediante istruzioni che provvedono alla scrittura di opportuni valori nei registri di controllo. Ogni I/O digitale è collegato a una serie di interruttori allo stato solido che commutano il pin verso un registro d’ingresso o di uscita della CPU.

Header e pin-strip degli I/O di Arduino Uno rev.3.

Come ingressi, i pin di Arduino Uno possono leggere due livelli logici: 0 -da zero a 2,5 volt- e 1, da 3 a 5 volt; tra 2,5 e 3 volt non è garantito con certezza il livello che Arduino Uno identifica. Gli in­gressi hanno elevata impedenza (alcuni megaohm) per non caricare i dispositivi che li pilotano, che di norma sono in grado di erogare pochissima corrente (gate logici).

Quando sono in modalità Output, i pin possono assumere i livelli logici 0 e 1, corrispondenti rispettivamente a 0 e 5 volt; esiste anche un terzo stato detto Open (l’uscita va in stato di alta impe­denza, come fosse interrotta) che rende il pin come sconnesso dal circuito. Per ottenere questa condizione è sufficien­te definire il pin come ingresso e non leggerlo. In uscita, i pin di Arduino Uno hanno dei circuiti di pilotaggio CMOS (Complementary MOS) che sono sim­metrici, ossia dispongono di un MOSFET N ed uno P posti in cascata, con i gate in comune: l’uscita è prelevata dai drain. Questa soluzione consente di generare dei livelli 0 e 1 non solo con carichi ad alta impedenza (e quindi bassissimo assorbimento), ma anche su carichi che assorbono un massimo di 40 mA, fino a raggiungere un totale complessivo, per tutti i vari pin di 150 mA. L’avere due transistor consente di presentare la stessa impedenza e quindi erogare (quando l’uscita è a 1 logico) o assorbire (stato logico 0) la stessa corrente, coe­rentemente con il comportamento che la parola simmetria fa presagire.

Con gli ingressi Analogici Arduino può leggere delle tensioni analogiche mediante gli appositi ingressi siglati A0, A1, A2, A3, A4, A5; siccome la CPU lavora con segnali logici, occorre una conversione, che nell’ATmega328P viene operata da un dispositivo chiamato convertitore analogico/digitale (A/D converter o ADC). Si tratta di un circuito che periodicamente campiona (me­diante un dispositivo chiamato S&H – Sample & Hold) il segnale, ovvero lo fa passare a periodi, e mediante una serie di comparatori ne trasforma il livello nella commutazione di stati logici, che poi formano un certo numero di bit. Quindi l’A/D converter effettua misu­razioni istantanee che converte in un valore binario.

Del convertitore A/D si definisco­no la risoluzione e la frequenza di campionamento; la prima rappresenta il numero di livelli in cui viene diviso l’intervallo di tensioni misurabile ed è espressa in bit. Se il convertitore è a 8 bit, potrà dividere la tensione in 256 valori; se è a 16 bit, in 65.536. Maggiore è la risoluzione, migliore sarà la capacità dell’ADC di distinguere con precisione i valori di tensione assunti dall’ingresso analogico. Arduino ha un convertitore A/D a 10 bit, quindi può distinguere 1.024 gradini di tensione.

La risoluzione non va confusa con la fi­nestra di tensione campionabile, tuttavia più cresce la differenza tra massima e minima tensione misurabile, minore è la precisione dell’ADC a parità di bit di risoluzione. La scala di rappresentazio­ne binaria della lettura dell’A/D è lineare, quindi nel caso di Arduino Uno, che ha una risoluzione di 1.024 campioni, con tensione di riferimento AREF di 5 V, il valore binario 512 corrisponde a 2,5V, mentre 128 corrisponde a 0,625 volt e così via.

Un singolo livello è pari a 0,0048 V. Per avere la massima definizione possibile, impostate sempre un’AREF di poco su­periore alla tensione da misurare e ricor­date che la definizione è pari al rapporto tra AREF e 1.024. Il valore predefinito di AREF è 5V, internamente impostato; per applicare un riferimento esterno occorre inserire nello sketch l’istruzione analo­gReference() dove tra parentesi si va a scrivere il valore applicato, ovvero IN­TERNAL se si vuole il riferimento interno di Arduino Uno a 1,1 volt. La tensione di riferimento su AREF non deve superare i 5V o essere più negativa di 0,7 V sotto il potenziale di GND. Per altre versioni di Arduino il riferimento potrebbe cambiare (è differente, ad esempio, nella Mega). La tensione di riferimento su AREF può esere applicata anche mediante un comune partitore resistivo, purchè alimentato a tensione stabilizzata per evitare letture imprecise. Quanto alla frequenza di campionamento, rappre­senta la frequenza con cui la lettura può essere ripetuta nel tempo: più è alta, maggiore è la frequenza dei segnali che possiamo misurare. La frequenza mas­sima di lettura è di circa 9 kHz e questo permette di campionare frequenze fino a 4,5 kHz.

Il convertitore A/D di Arduino è unico ma può essere assegnato alle sei linee analogiche A0÷A5. Sebbene abbia delle uscite considerate analogiche, Arduino Uno in realtà non genera tensioni analo­giche, cioè che possono assumere qual­siasi valore compreso tra due margini, con continuità. Le uscite analogiche di Arduino sono in realtà delle PWM (Pulse Width Modulation), perché producono impulsi periodici a livello logico 1 o 0 (sono quindi digitali sotto l’aspetto del livello di tensione), però la loro frequen­za e larghezza può variare entro due margini assumendo qualsiasi valore intermedio.

Il segnale PWM consente di ottenere una tensione di valore medio proporzionale
al suo duty-cycle: si ottiene con l’istruzione analogWrite.

Per comprendere il discorso va intro­dotto il concetto di segnale elettrico ciclico (periodico): un segnale periodico varia ciclicamente e ripete il ciclo co­stantemente nel tempo con una certa frequenza; la frequenza è il numero di volte che il ciclo si ripete in un secondo. Nel caso del segnale logico, il periodo o ciclo è costituito dall’alternarsi degli stati logici uno e zero; per segnali del genere si usa definire il duty-cycle (letteralmente, ciclo di lavoro) che corrisponde al rapporto tra la durata del livello alto e quella del periodo, ossia della durata del livello alto sommata a quella del livello basso.

Il trucco che permette di ottenere da un segnale digitale uno analogico sta nel giocare sul valore medio di tensione prodotto dagli impulsi: se disegniamo su un foglio di carta i singoli impulsi e sommiamo le aree definite in un perio­do, otteniamo il valore medio.

Ne deriva che con un PWM a duty-cycle del 25%, il valore medio è 1/4 dell’am­piezza degli impulsi; con il 50% è la metà. Se gli impulsi hanno ampiezza di 5 volt, nel primo caso il valore medio è 1 volt e nel secondo 2,5V. Il modulo PWM di Arduino Uno è in grado di spaziare da 0 al 100% in 256 passi (il controllo del PWM viene realizzato dalla CPU dell’ATmega328 impostando valori ad 8 bit), quindi il 50% corrisponde al valore binario 128. Il tutto utilizzando l’istru­zione analogWrite() secondo lo schema visibile nel grafico in alto in questa pa­gina. Dalle uscite PWM è possibile ricavare una tensione pressoché continua mediante un filtro RC, i cui valori di R (resistenza) e C (condensatore) vanno scelti con la formula:

f = 1/(2p x R x C)

dove f è la frequenza del PWM espressa in Hz ed R e C sono espressi rispettivamente in Mohm e microfarad. p è invece il Pi Greco

La rubrica Tips&Tricks è una delle novità di Elettronica In!
Trovi i contenuti in anteprima nel prossimo numero!

2 Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu