6 PWM sono pochi? Ecco come averne 14

led verde
Arduino ha solo 6 PWM… cosa fare se ne servissero di più? È possibile aggiungere dell’hardware speciale come un «registro a scorrimento» o adottare un trucco «software».

Intanto… sapete cos’è il PWM? Di solito lo spiego con la storiella del “rubinetto fotografico”. Come funziona il cinema? Le immagini in movimento sono in realtà una sequenza di 24 foto (al secondo). Con Arduino avete solo 6 «rubinetti» di questo tipo (quelli con la scritta PWM o il simbolo ~). Questi rubinetti possono fornire 255 foto al secondo.

Prendete 255 foto di un led acceso e sfogliatele rapidamente. Cosa si vede? un led acceso. Ora prendete 255 foto di un led spento sfogliatele: cosa vedete? un led spento. Cosa accade se sostituite una di queste foto con quella di un led acceso? Se le sfogliate percepirete un bagliore. Se mettete 2 foto «accese», la luce sarà un po’ più forte. Se sostituirete la metà  delle foto, vi sembrerà che il led sia acceso a metà della sua luminosità.

I pin PWM si controllano con l’istruzione analogWrite. Dovete fornire 2 parametri: il pin e il numero di foto accese che desidero avere (da 0 a 255).

Su Arduino avete solo 6 pin PWM e a volte potrebbero essere pochi!

Mi è capitato di dover realizzare un prototipo con 30 PWM indipendenti. Ho fatto le prove con arduino arrivando a programmare ben 14 PWM indipendenti sui 14 pin di arduino (anche quelli non predisposti per il PWM).

Come fare? Utilizzando una sequenza di digitalWrite con HIGH e LOW. Il trucco sta nel variare i tempi di accensione e spegnimento.

Per avere un PWM sul pin 13:

La variabile pwmsw serve per impostare il rapporto acceso/spento (va da 0 a 255). La variabile i è il contatore che mi serve per capire quando sostituire le foto di led accesi con quelle dei led spenti. Fino a che i è minore della soglia impostata con pwmsw il rubinetto è aperto, poi appena i supera la soglia il rubinetto si chiude. Questo avviene molto velocemente ed inganna l’occhio.

Per dare una temporizzazione alla sequenza c’è un delay in microsecondi. i++ è una scorciatoia per dire che aggiungo 1 alla variabile i. Se poi i supera il valore 255, allora la rimetto a 0. Non serve un ciclo for, viene usato lo stesso loop().

Leave a Reply

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *


*