Misurare una tensione DC, AC o PWM con Arduino

La misurazione della tensione è abbastanza semplice, utilizzando qualsiasi microcontrollore come Arduino, rispetto alla misurazione della corrente. Misurare le tensioni diventa necessario se si lavora con le batterie o si desidera creare un proprio alimentatore regolabile. Anche se questo metodo è generale, in questo articolo impareremo come misurare la tensione DC usando Arduino. Ci sono dei “sensori di tensione” disponibili sul mercato. Ma hai davvero bisogno di loro? Scopriamolo insieme. Inoltre, vedremo come misurare una tensione in alternata (AC) e, infine, quella di un segnale PWM.

Il microcontrollore non può capire direttamente la tensione analogica. Questo è il motivo per cui dobbiamo usare un convertitore analogico-digitale, o ADC in breve. L’Atmega328, che è il cervello di Arduino Uno, ha 6 canali (contrassegnati come da A0 a A5), e un ADC a 10 bit. Ciò significa che mapperà le tensioni di ingresso da 0 a 5 V in valori interi da 0 a (2^10-1) cioè a 1023, il che fornisce una risoluzione di circa 10 mV e il valore 0 fornito da Arduino corrisponderà a 0 V, 1 a 4.9 mV, 2 a 9.8 mV e così via fino a 1023 (pari a 5 V).

Il codice (sketch) per Arduino che mostrerò fra poche righe in realtà funzionerebbe alla grande se la fonte di alimentazione di Arduino fornisse una tensione costante, priva di fluttuazioni (tipiche dell’USB) o cali nel tempo (tipici delle batterie) e, soprattutto, se la tensione di riferimento usata dall’ADC di Arduino fosse calibrata. Purtroppo, così non è. Pertanto, per avere letture di tensione precise, occorre seguire i metodi ed i consigli forniti nel nostro articolo Come fare misurazioni più precise con Arduino, che puoi trovare qui.

La misurazione di tensioni DC con Arduino

In primo luogo, vediamo come misurare una tensione DC quando questa è inferiore a 5V. Ciò è molto facile in quanto non sono richieste modifiche speciali. Per simulare la tensione variabile, possiamo usare un potenziometro il cui pin centrale è collegato a uno qualsiasi dei 6 canali. Ora scriveremo il codice per leggere i valori dall’ADC e convertirli nuovamente in letture di tensione utili, ovvero lo sketch che potete copiare e incollare da qui sulla vostra scheda Arduino per visualizzare le tensioni su A0:

Puoi trovare il codice completo da usare qui.

La variabile ‘value’ contiene un valore compreso tra 0 e 1023 a seconda della tensione. Il valore ottenuto viene ora moltiplicato per la semi-risoluzione (5V/1023 = 4,9 mV per unità) per ottenere la tensione effettiva. Infine, viene visualizzata sul monitor seriale la tensione misurata. Ma il problema sorge quando la tensione da misurare supera i 5 volt. Ciò può essere risolto utilizzando un circuito cosiddetto “partitore di tensione”, costituito in pratica da 2 resistenze collegate in serie come mostrato.

Schema del partitore di tensione illustrato nel testo.

Un’estremità di questa connessione in serie è collegata alla tensione da misurare (Vm) e l’altra estremità a terra. Una tensione (V1) proporzionale alla tensione misurata apparirà alla giunzione delle due resistenze (R1 e R2). Questa giunzione può dunque essere collegata al pin analogico (tipicamente A0) di Arduino. La tensione misurata con tale metodo può essere calcolata molto facilmente usando la seguente formula, in cui la tensione V1 è quella che viene misurata da Arduino:

V1 = Vm * (R2 / (R1 + R2))

Ora per costruire questo partitore di tensione, dobbiamo prima scoprire i valori delle resistenze. Seguite questi passaggi per calcolare il loro valore. Determina la tensione massima che deve essere misurata. Decidi un valore adatto e standard per R1 in kilo-ohm (kohm). Utilizzando la formula, calcola R2. Se il valore di R2 non è (o si avvicina a) un valore standard, modifica R1 e ripeti i passaggi precedenti. Poiché Arduino può gestire un massimo di 5 V, devi porre nella suddetta formula V1 = 5V.

Ad esempio, supponiamo che la tensione massima (Vm) da misurare sia 12V e R1 = 47 kohm. Quindi usando la formula si trova che R2 è pari a 33 kohm. Ora, crea un circuito partitore di tensione usando queste resistenze. Con questa configurazione, ora abbiamo un limite superiore e inferiore. Per Vm = 12V otteniamo V1 = 5V e per Vm = 0V otteniamo V1 = 0V. Cioè, per Vm da 0 a 12 V, ci sarà una tensione proporzionale da 0 a 5 V in V1, che può quindi essere inviata e letta da Arduino come prima.

Con una leggera modifica nel codice che riguarda la riga mostrata qui sotto, ora possiamo misurare da 0 a 12V. Il valore analogico viene letto come prima. Quindi, usando la stessa formula menzionata in precedenza, viene misurata la tensione tra 0 e 12V. I moduli di sensore di tensione in commercio non sono altro che un circuito partitore di tensione. Questi sono classificati per letture da 0 a 25 V con resistenze da 30 kohm e 7,5 kohm. Quindi, perché comprarne uno quando puoi farlo da te?

float voltage = sensorValue * (5.0 / 1023.0) * ((R1 + R2) / R2);

Il sensore di tensione di Arduino e il suo impiego pratico.

La misurazione di tensioni AC con Arduino

In questa sezione, realizzeremo un dispositivo di misurazione della tensione AC, cioè un voltmetro AC, utilizzando Arduino. Fare un voltmetro digitale è molto più facile che farlo con uno analogico perché in caso di voltmetro analogico è necessario avere una buona conoscenza dei parametri fisici come la coppia , perdite per attrito, etc.; mentre nel caso di un voltmetro digitale è sufficiente utilizzare una matrice LCD o LED o anche un computer laptop (come in questo caso) per stampare i valori.

Ovviamente, con un simile voltmetro non è possibile misurare direttamente la tensione dell’alimentazione a corrente alternata nella nostra casa, ma solo indirettamente misurando quella ai capi di un trasformatore con uscita a 12V, che verrà opportunamente raddrizzata con il circuito che vedremo e inviata all’ingresso analogico di Arduino (ad es. A0). Dato che l’uso di trasformatori e della tensione di rete non è adatto per utenti non esperti e non adulti, illustreremo questo circuito solo per completezza di informazione.

Come usare Arduino per misurare una tensione AC.

L’occorrente per realizzare il voltmetro AC, oltre al trasformatore con uscita a 12V, un diodo 1N4007, un condensatore da 1μF, una resistenza da 10k e una da 4.7k, un diodo Zener (da 5V), una scheda Arduino UNO, oltre a dei cavi di collegamento. Le resistenze servono per realizzare il partitore di tensione, in modo da portare la tensione raddrizzata nel range di 0-5V accettato dalla scheda Arduino. Il condensatore, invece, ha una semplice funzione di livellamento della tensione raddrizzata dal diodo.

Collegate il lato a bassa tensione (12 V) del trasformatore al partitore di tensione. Collegate la resistenza da 10 k in serie con una resistenza da 4,7 k, ma prendete la tensione come ingresso attraverso la resistenza da 4,7 k. Collegate il diodo come mostrato. Collegate il condensatore e il diodo zener sulla resistenza da 4,7k, Collegate un cavo dal terminale di uscita del diodo al pin analogico A0 di Arduino. Collegate il pin di messa a terra di Arduino al punto mostrato nella figura o il circuito non funzionerà.

Lo schema circuitale del voltmetro AC realizzato con Arduino.

Dato che Arduino non accetta valori di tensione negativi come input, per prima cosa è necessario rimuovere il ciclo negativo dell’alternata (AC), in modo che Arduino riceva solo il valore di tensione positivo. Perciò il diodo è collegato per rettificare la tensione, realizzando un raddrizzatore a mezza onda. Questa tensione raddrizzata non è liscia poiché contiene ampie increspature che non possono darci alcun valore analogico esatto. Quindi, il condensatore è usato per appianare il segnale.

La scheda Arduino può essere danneggiata se viene alimentata a una tensione superiore a 5V. Quindi un diodo zener da 5V è collegato per garantire la sicurezza di Arduino, quali guasti nel caso in cui questa tensione superi 5V. Pertanto, in prima battuta potete fare a meno del diodo se non ce l’avete sotto mano. Potete montare il circuito prima su una basetta sperimentale per verificare il corretto comportamento del circuito, dopodiché realizzare un circuito definitivo su una basetta millefori.

In realtà, graficando il segnale acquisito con Arduino e facendo un po’ di prove, scopriremo che la tensione risulta molto più costante non se al posto del diodo usiamo un raddrizzatore a ponte (o 4 diodi in configurazione a ponte) bensì se, al posto del condensatore da 1μF, usiamo un condensatore da 100μF. La figura qui sotto, in particolare, mostra come usando condensatori via via più capaci siamo riusciti a diminuire di molto le fluttuazioni nella tensione.

Le fluttuazioni nella tensione a valle del diodo o ponte raddrizzatore usando condensatori elettrolitici di differente capacità (grafico realizzato con MegunoLink Pro).

Il codice completo “ArduinoVoltmeter” è fornito di seguito. Per assegnare la variabile n alla formula n = (m * 0,304177), prima viene eseguita una sorta di calcolo utilizzando i dati ottenuti in una simulazione del circuito con un apposito software (tipo Fritzing). Come si scopre nella simulazione (oppure sperimentalmente), il valore analogico 5V o 1023 si ottiene sul pin A0 quando l’ingresso della tensione AC è di 311 V. Quindi il valore analogico 1023 corrisponde a 311 volt di tensione di rete.

Il codice completo per la misurazione di una tensione in alternata (AC) lo trovi qui.

Quindi qualsiasi valore analogico casuale corrisponde a (311/1023) * m, dove m è il valore analogico ottenuto. Pertanto arriviamo a questa formula: n = (311/1023) * m volt, o n = (m * 0,304177). Ora questo valore di tensione è stampato sul monitor seriale usando i comandi seriali come illustrato di seguito nel codice. Viene anche mostrato sul multimetro, qualora vogliamo fare una verifica. Pertanto, non ci resta che fare copia e incolla del seguente codice in Arduino e testare il tutto.

La misurazione di tensioni PWM con Arduino

Come si può misurare con Arduino la tensione (media) di un segnale modulato a larghezza di impulso (cioè la cui larghezza può essere variata, noto anche come PWM? Per creare una tensione che aumenta linearmente con il segnale PWM occorre mettere a valle del PWM un semplice filtro RC che ora illustrermo, dopodiché possiamo inviare il segnale presente all’uscita del filtro all’ingresso analogico della scheda Arduino (ad es. A0).

Come appare un tipico segnale PWM con vari duty cycle.

Se con Arduino acquisiamo semplicemente la tensione PWM come se fosse un normale segnale analogico, abbiamo solo una successione di valori molto diversi l’uno dall’altro, il che non fornisce alcuna indicazione sulla tensione cercata (mentre un tester digitale di solito ce la dà perché di fatto effettua una media). È però molto facile generare una tensione approssimativa tra 0 e Vcc semplicemente aggiungendo una resistenza e un condensatore che fungano da filtro passa-basso, come mostrato nella figura qui sotto.

Il semplice filtro passa-basso da applicare al segnale PWM prima di inviarlo all’ingresso digitale della scheda Arduino.

Grazie ad Arduino, quindi, è facile convertire un segnale PWM a un livello di tensione analogico, producendo un vero DAC. Tutto ciò che serve è un semplice filtro passa-basso composto da una resistenza e da un condensatore ceramico. Il semplice filtro passa-basso RC mostrato converte il segnale PWM in una tensione proporzionale al duty-cicle, o ciclo di lavoro. Abbiamo verificato per un PWM commerciale con uscita max 5V DC (la massima accettata da Arduino in ingresso) che i valori R = 3,3 kohm e C = 10 μF (elettrolitico) sono ideali per un livellamento efficace.

In che modo questi due piccoli componenti trasformano il segnale PWM in una tensione? Per vedere cosa sta succedendo in questo caso, possiamo collegare la resistenza a un pin PWM (con tensione max di 3,3 V) della scheda Arduino, chiamare “analogWrite (N, 128)” per impostare un ciclo di lavoro del 50%, cioè a metà strada, e quindi osservare il risultato su un comune oscilloscopio. Quanto mostrato qui sotto è stato generato con una resistenza da 10 kohm e un condensatore da soli 0,1 μF (per cui il livellamento è meno efficace).

Un segnale PWM dopo essere stato filtrato con il circuito RC.

Nel caso di un PWM con tensione max di 3,3V, ciò che vorresti vedere è un’uscita a 1,65 V, la metà di 3,3 V. Come potete vedere, la cosa reale è effettivamente centrata attorno a quel valore, ma con un sacco di “ripple” (giallo = PWM, blu = Vout). La ragione di ciò è che il PWM sta caricando e scaricando il condensatore. Il valore medio sarà il rapporto tra tempo di accensione e spegnimento rispetto alla tensione digitale, cioè 3,3 V, quindi un ciclo di lavoro del 50% porterà a metà Vcc, cioè 1,65 V.

Naturalmente, se il segnale massimo prodotto dal PWM è superiore a 5V, occorrerà applicare a monte del circuito RC un partitore di tensione per portare il segnale massimo in uscita dal partitore entro il livello alto (high) accettato dall’ingresso digitale delle schede Arduino. Abbiamo già visto come si fa, quindi non ritorneremo sull’argomento. Ricordo che un segnale digitale può assumere due soli stati (High/Low, 1/0), corrispondenti a due livelli di tensione convenzionali (ad esempio, 5-0V).

Ingresso digitale significa che questi pin possono trattare (scrivere o leggere) segnali di due soli valori: un valore alto (o high) con tensione quasi uguale a quella di alimentazione; un valore basso (o low) con tensione quasi uguale a zero o terra. Valori prossimi alla metà del valore di alimentazione sono di lettura/scrittura incerta e vanno evitati pena un funzionamento non prevedibile se non pericoloso. Quindi dovremo far sì che il segnale alto in uscita dal partitore sia di circa 5V.