Come comandare un LED PWM con Arduino

Come comandare un LED PWM con Arduino

Come Comandare Un LED PWM Con Arduino - ProjectEMS

Introduzione

In questo articolo si vedrà come poter comandare e regolare la variazione di luminosità di un led su Arduino utilizzando la modulazione di larghezza di impulso (in inglese Pulse Width Modulation, PWM). Grazie a questa tecnica sarà possibile variare gradualmente la luminosità del led, ottenendo un effetto di dissolvenza. In questo articolo si darà per assodato che l’utente sia in grado di collegare un led ad Arduino e comandarne l’accensione e spegnimento via software.

Componentistica

La realizzazione di questo esercizio non richiede nulla più di un collegamento di led e resistenza alla scheda Arduino; ad ogni modo, ciò di cui si ha bisogno per poter eseguire questo programma è:

Cenni di elettrotecnica applicati al caso in esame

La PWM è una tecnica di modulazione dell’onda che permette di avere una tensione media variabile dipendente dal tempo di applicazione del valore di tensione HIGH, indicato con τ, e dal periodo della funzione T. Facendo riferimento al funzionamento del blink del led, possiamo vedere che la funzione che definisce l’andamento della tensione nel tempo è un onda quadra (o rettangolare nel caso generico). Si definisce duty cycle, indicato con la lettera D, il rapporto tra la durata del valore di tensione alto, rispetto al periodo totale.
La figura seguente rende chiaro questo concetto.

Come Comandare Un LED PWM Con Arduino - Duty Cycle - ProjectEMS

Il duty cycle D dunque è un valore compreso tra 0 e 1, come si usa in ambito elettrotecnico, un valore percentuale tra 0 e 100%.

Come Comandare Un LED PWM Con Arduino - Formula Duty Cycle - ProjectEMS

Di conseguenza se il duty cycle vale 0 allora τ tende a 0 e dunque il valore di tensione sarà sempre low per tutto il periodo. Viceversa, se d = 1 allora τ avrà lo stesso valore di T (stessa durata) e ciò implica che il segnale sarà alto per tutto il periodo.

Sfruttando questo concetto è possibile modulare l’intensità della luminosità, effetto che sarebbe un tipico esempio di applicazione analogica ma con strumenti digitali. Infatti per ottenere un’intensità di luminosità differente da “acceso totalmente” (d = 100%) o “spento totalmente” (d = 0%) bisogna ottenere un duty cycle che abbia un valore percentuale intermedio. Ipotizziamo dunque di voler accendere i led con un intensità pari al 50% della sua intensità massima, ovvero avere d = 50%. Ciò vuol dire che per metà del periodo il led risulterà acceso e per metà spento. Affinché il risultato sia visivamente apprezzabile, è necessario scegliere un periodo sufficientemente piccolo (alta frequenza) in modo che l’occhio umano possa non apprezzare il lampeggiamento del led in quell’istante di tempo, dando come risultato un led sempre acceso ma con un intensità dimezzata.

Schema del circuito

In figura è mostrato lo schema elettrico del sistema.

Come Comandare Un LED PWM Con Arduino - Esempio Circuito - ProjectEMS

Codice

Per realizzare un comando del led tramite PWM si può innanzitutto partire dal codice visto per il blink del led. Come si è visto, il tutto sta nello scegliere opportunamente l’intervallo di tempo in cui il led risulta acceso rispetto al periodo totale, eseguendo il loop ad alta frequenza.
A tal scopo è sufficiente scegliere come valore di delay nell’ordine di 10 – 20 millisecondi e modulare opportunamente la durata di HIGH rispetto alla durata di LOW per ottenere la percentuale di intensità desiderata.
Per esempio, scegliendo 20 ms come durata del loop, possiamo ottenere un’intensità luminosa pari al 50% semplicemente impostando il primo e il secondo delay di 10 ms.

Tenendo fissa la durata del periodo, possiamo invece ottenere una luminosità del 25% impostando il primo delay a 5 ms e il secondo delay a 15 ms.
Questa sintassi va bene in un semplice circuito come questo. Se il circuito risultasse essere più complicato, con differenti operazioni da svolgere da parte di Arduino o diversi sensori ad esso collegati, si assisterebbe ad un tremolio del led in attesa della fine delle altre operazioni in corso (lettura dati del sensore, ecc..).

Per ovviare a questo problema, Arduino Mega mette a disposizioni i pin 2 – 13 e 44 – 46 e il comando analogWrite(). Invocando questa funzione, il pin specificato genererà un’onda quadra stazionaria con un valore di duty cycle settato dall’utente e ad una frequenza di PWM di circa 490 Hz fino a che non sarà invocata nuovamente la funzione.
In questo modo è possibile gestire separatamente comando di far lampeggiare del led via PWM mentre il programma è ancora in esecuzione. Il codice da utilizzare è dunque il seguente:
analogWrite(pin, value)
in cui il pin deve essere uno di quelli elencati in precedenza e value indica la percentuale di duty cycle.

N.B.: in questa istruzione la percentuale di duty cycle da inserire è un valore compreso tra 0 (off) e 255 (on) essendo il dato di intensità di luminosità trattato come un numero di 8 bit. Si faccia inoltre attenzione al fatto che questa funzione non ha niente a che vedere con i pin analogici presenti sulla scheda o con la funzione analogRead().
Il riassunto del codice è quindi mostrato nel seguito.