Robotica educativa

Tutorial Arduino - Parte 3: tecnica PWM e fading

Tutorial Arduino - Parte 3: tecnica PWM e fading

Tutorial Arduino - Parte 3: tecnica PWM e fading

di Franco Babbo

Abstract

“La tecnica PWM (Pulse Width Modulation) è utilizzata in elettronica in diverse applicazioni. Nella scheda Arduino è il modo in cui viene simulata una tensione di uscita analogica sui pin A0-A5. Come vedremo, il valore della tensione che è possibile ottenere dipende da una grandezza detta “duty cycle” e può essere utilizzato, ad esempio, per variare la velocità di un motore in corrente continua o la luminosità di un diodo led. In fondo all’articolo troverete il link ad una simulazione effettuata sul portale gratuito online TinkerCAD della quale è anche possibile copiare il sorgente utilizzato.”

Come promesso in un precedente articolo, in questa puntata del tutorial spiegherò in cosa consiste la tecnica PWM e come utilizzarla per la variazione continua di luminosità di un diodo LED (effetto fading). La sua importanza risiede nel fatto che i sei pin “analogici” A0-A5 non forniscono, come ci si potrebbe aspettare, una vera e propria tensione continua selezionabile  tra 0V e 5V, ma qualcosa di un po’ diverso che tuttavia può essere utilizzato, come fosse una tensione costante, in alcuni casi di utilità pratica.

L’uscita di tali pin, in effetti, è un’onda quadra la cui ampiezza varia tra 0V e 5V. Grazie al comando

analogWrite(pin_number, n)

nel quale n è un numero intero che varia tra 0 e 255, è possibile cambiare a piacimento la durata della parte “alta” del segnale (quella in cui esso vale 5V per intenderci) applicata al dispositivo connesso al pin il cui numero va inserito nel primo argomento della funzione. Spesso, per rappresentare questa situazione, ci si riferisce ad una grandezza chiamata “Duty Cycle”, di solito espressa in percentuale, che è proprio il rapporto tra la durata td  dello stato “alto” dell’onda quadra ed il periodo T dell’onda stessa (l’intervallo di tempo tra due impulsi consecutivi, nella figura sottostante rappresentato dalle linee verticali verdi):

Variazione del duty cycle di un'onda quadra

d%=td/T*100

In effetti è facile convincersi che applicando questo tipo di segnale ad un componente normalmente alimentato in continua, tipo un diodo led o un motore c,c., l’effetto è simile a quello che si avrebbe usando una tensione continua con un valore tra 0V e 5V a patto di andare “sufficientemente veloci”. 

Consideriamo, infatti, il caso del diodo led. Arduino genera sui pin PWM un’onda quadra avente frequenza f=500Hz (cui corrisponde un periodo T=1/f=20ms). Su tale frequenza non possiamo agire, cioè il periodo è costante. Tale frequenza è abbastanza elevata da far apparire stabile all’occhio la luminosità emessa dal diodo. Si può quindi intuire come la luce sia tanto più intensa quanto più, nel loro susseguirsi, abbiano durata maggiore gli intervalli di tempo in cui l’onda quadra è allo stato alto. Questo è proprio ciò che accade quando aumentiamo il valore di una “vera” tensione continua applicata ad un led, sebbene il modo di alimentare il nostro dispositivo sia del tutto differente.

Il valore di tensione continua che equivale a quella prodotta tramite variazione del duty cycle è dato da

V=5⋅d

Com’è noto anche la velocità di un motore a corrente continua dipende dalla tensione applicata. Quest’ultimo dispositivo è usatissimo nelle applicazioni in cui si vuole far muovere su ruote un dispositivo in maniera estremamente semplice ed economica, sebbene con precisione non proprio elevata (i modelli radiocomandati fanno quasi tutti uso di motori c.c.).

Diamo ora un’occhiata al codice della nostra simulazione. 

Al solito la parte iniziale, secondo quanto appreso nelle precedenti puntate del tutorial, comprende la definizione di alcune costanti e la dichiarazione della modalità di funzionamento dei pin utilizzati. Ma osserviamo la nostra funzione per variare il duty cycle in azione nelle righe di codice

for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {

    // sets the value (range from 0 to 255):

    analogWrite(ledPin1, fadeValue);

    // wait for 10 milliseconds to see the dimming effect

    delay(10);

  }

Il primo argomento di analogWrite è “ledPin1”, cioè il numero che identifica il primo led, quello di colore rosso. Sarà questo, quindi, il dispositivo sottoposto ad un’onda quadra di duty cycle variabile. Il secondo argomento indica quale deve essere la durata dello stato “alto” dell’onda, ovvero in definitiva il valore del duty cycle. Tale valore è inserito all’interno di un ciclo “for” in modo che aumenti automaticamente da 0 a 255 (con passi di 5) che, come abbiamo visto, sono i valori minimo e massimo ammessi nella funzione analogWrite. Dato che ad ogni ripetizione del ciclo tale valore aumenta, l’effetto sarà quello di una variazione graduale di luminosità da un minimo ad un massimo. La funzione delay(5) serve a rendere più o meno evidente l’effetto fading (provate a cambiare tale valore nella simulazione che trovate in fondo).

La parte di codice seguente è del tutto simile, solo che la variabile fadeValue viene fatta variare tra 255 e 0 (al contrario rispetto al caso precedente). In tal modo si vedrà la luce emessa dal led diminuire fino a spegnersi.

Seguono blocchi di codice identici per gli altri due diodi.

Tanto per dare un tocco “natalizio” al nostro primo esperimento sul duty cycle ho inserito un lampeggio contemporaneo dei tre led ottenuto con le seguenti righe di codice

//flashing

  for(int i=0;i<=2;i++){

    //switching LED on

    digitalWrite(ledPin1, HIGH);

    digitalWrite(ledPin2, HIGH);

    digitalWrite(ledPin3, HIGH);

//wait between flashing

    delay(200);

//switching LED on

    digitalWrite(ledPin1, LOW);

    digitalWrite(ledPin2, LOW);

    digitalWrite(ledPin3, LOW);

//wait between flashing

    delay(200);

il cui significato dovrebbe essere chiaro se avete letto il primo numero del tutorial.

Per vedere l’effetto totale fading + lampeggio andate all’indirizzo in fondo all’articolo ed avviate la simulazione. Per visualizzare e/o copiare il codice per Arduino cliccate sul pulsate “code”.

Buon divertimento ed arrivederci al prossimo numero....

Franco Babbo

Ingegnere Elettronico, Docente di Elettronica e Telecomunicazioni

Riferimenti

link alla simulazione

https://www.tinkercad.com/things/honZg5cBsYR-xmas-fading-and-flashing

Credits

Le immagini sono tratte dal tutorial

https://www.arduino.cc/en/Tutorial/PWM

(Termini di licenza https://www.arduino.cc/en/Main/CopyrightNotice)

RIFERIMENTI

logo icted

ICTEDMAGAZINE

Information Communicatio
Technologies Education Magazine

Registrazione al n.157 del Registro Stam­pa presso il Tribunale di Catanzaro del 27/09/2004

Rivista trimestrale  

Direttore responsabile/Editore-responsabile intellettuale

Luigi A. Macrì