In tutti gli articoli trattati fino ad ora abbiamo lavorato esclusivamente con dei dati di tipo digitale, cioè rappresentati da sequenze di 0 e 1 (bit).
In questo episodio invece introdurremo il segnale di tipo analogico e il modo in cui Arduino riesce a riprodurlo.

Arduino infatti può emettere in output esclusivamente segnali di tipo digitale, e quindi un voltaggio massimo (5V) oppure un voltaggio minimo (0V). Per quanto riguarda l’analogico, in realtà, ciò che fa è simulare dei voltaggi intermedi mediante il segnale PWM. 

Il PWM

L’acronimo PWM (pulse width modulation) sta per “modulazione della larghezza dell’impulso” ed è un tipo di output digitale che consente di ottenere dei valori di tensione intermedi alternando velocemente valori massimi e valori minimi: in questo modo il segnale risultante sarà dato dal duty cycle, cioè il rapporto tra la durata dell’impulso alto (5V) e la durata dell’impulso basso (0V).
Per rendere tutto più chiaro facciamo un esempio: supponiamo di avere una lampadina collegata ad Arduino e di volerla alimentare solo al 50% della sua luminosità totale. Abbiamo appena detto che Arduino può solo emettere un valore di tensione massimo, pari a 5V, e un valore di tensione minimo, pari a 0V. Adesso immaginate il seguente scenario:

  1. La lampadina è spenta

  2. Arduino porta la tensione a 5V e la lampadina si accende
  3. Arduino abbassa la tensione a 0V e la lampadina si spegne
  4. Arduino alza la tensione a 5V e la lampadina si riaccende
  5. Arduino riabbassa la tensione a 0V e la lampadina si spegne
  6. Il ciclo si ripete

Ora, se questo procedimento viene effettuato lentamente, allora quello che vedremo è una normalissima lampadina che lampeggia…
Se invece riuscissimo ad accendere e spegnere la lampadina tanto velocemente che l’occhio umano non riesca mai a vederla completamente accesa o completamente spenta, allora otterremmo una “visione analogica”, cioè una luminosità che non è né 0 né 1, ma un valore intermedio. Ebbene Arduino riesce a riprodurre questo scenario mediante l’emissione di onde quadre, che nel grafico qui in basso rappresentano l’impulso positivo (5V).

""""

 

Come avrete letto nell’introduzione, il risultato del segnale PWM è determinato dal duty cycle, che è il rapporto tra la durata dell’impulso positivo (5V) e la durata dell’impulso negativo (0V).

  • Se ad esempio abbiamo un duty cycle del 10% (si veda il primo caso dell’immagine), allora la lampadina ci sembrerà quasi completamente spenta, poiché resterà accesa solo per il 10% del tempo totale.
  • Se invece, nel caso contrario, abbiamo un duty cycle del 90%, allora la lampadina ci sembrerà quasi completamente accesa, poichè sarà effettivamente accesa per il 90% del tempo totale.

A questo punto capirete sicuramente che facendo partire il duty cycle da 0% e aumentandolo progressivamente fino al 100% riusciremmo a far riprodurre un output di tipo “analogico” ad un dispositivo - come la maggior parte degli Arduino - che altrimenti non potrebbe. Questa tecnologia solitamente viene sfruttata in larga scala per il controllo dei led (lo vedremo a breve) o ancora dei motori, quando ad esempio non si voglia che lavorino costantemente alla massima velocità.

Adesso però passiamo all’Arduino e vediamo come mettere in pratica ciò che abbiamo imparato sul PWM e sugli output analogici. 
 

HARDWARE

Per quanto riguarda l’hardware, faremo uso esattamente degli stessi componenti degli ultimi due episodi della serie:

  • 6 jumper
  • 1 LED
  • 1 resistore da 220 Ω (per il led)
  • 1 pulsante
  • 1 resistore da 1 KΩ (per il pulsante)

A seguito è riportato il circuito:

""""

Attenzione!
Rispetto agli scorsi episodi abbiamo collegato il led al pin numero 6~ che, come indicato sull’Arduino stesso con la tilde ( ~ ), è abilitato all’output di tipo PWM.

""""

 

Prima di passare al codice introduciamo una nuova funzione.

analogWrite()

L’istruzione che consente ad Arduino di fornire un segnale PWM su un pin è analogWrite(pin,valore).

Come avrete notato dalla sintassi, tale funzione richiede due parametri:

  • Il pin su cui deve lavorare, che logicamente deve essere abilitato all’output analogico di tipo PWM (~).
  • Il valore che si vuole ottenere, da un minimo di 0 (corrispondente a 0V) ad un massimo di 255 (corrispondente a 5V). 

Consideriamo come esempio il nostro circuito:

  • analogWrite(6,0) ⇒ spegne il led collegato al pin numero 6 (tensione 0V)
  • analogWrite(6,255) ⇒ accende il led collegato al pin numero 6 alla massima luminosità (tensione 5V)
  • analogWrite(6,128) ⇒ accende il led collegato al pin numero 6 ad una luminosità pari al 50% di quella massima (tensione media 2.5V)

Magari, prima di passare al programma vero e proprio di questo episodio, potreste provare a caricare degli sketch con queste istruzioni e dei delay() per vedere in che modo varia la luminosità del led in base ai valori impostati...

 

SOFTWARE

Scriviamo un programma che faccia spegnere e accendere il led in dissolvenza, cioè riproducendo una tipica transizione di “fade”: servendoci di un ciclo “for”, porteremo lentamente il led spento alla massima luminosità e poi lo faremo spegnere alla medesima velocità.

""""

Ecco il codice:

 

Funzionamento

  • Il primo ciclo “for” inizializza la variabile i a 0 per poi incrementarla di una unità ad intervalli 10 ms, fino a 255: in questo modo il led spento si accenderà lentamente, passando per tutte le 256 transizioni di luminosità corrispondenti ai valori della variabile i.
  • Il secondo ciclo “for” inizializza la variabile i a 255 per poi decrementarla di una unità ad intervalli 10 ms, fino a 0: in questo modo il led acceso si spegnerà lentamente, passando per tutte le 256 transizioni di luminosità corrispondenti ai valori della variabile i.

 

Così siamo giunti alla conclusione anche di questo episodio…

Fino ad ora abbiamo approfondito esclusivamente i segnali analogici di output. Nel prossimo articolo, invece, vedremo come trattare i medesimi segnali, ma in input!