Home

ledR375_27apr09Arduino ha solo 6 PWM… cosa fare se ne servissero di più? E’ possibile aggiungere dell’hardware (registri a scorrimento per esempio) 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 ho alcuni rubinetti di questo tipo (quelli con la scritta PWM o il simbolo ~). Questi rubinetti possono fornire 255 foto al secondo.

Prendo 255 foto di un led acceso: le sfoglio rapidamente. Cosa si vede? un led acceso. Ora prendo 255 foto di un led spento e le sfoglio: cosa vedo? un led spento. Cosa accade se sostituisco una di queste foto con quella di un led acceso? Se le sfoglio pare di percepire un bagliore. Se metto 2 foto “accese” sembra che la luce sia un po’ più forte. Se ne sostituisco la metà sembrerà che il led sia acceso a metà della sua luminosità.

Comando questi rubinetti con l’istruzione analogWrite. Devo fornire 2 parametri: il pin e il numero di foto accese che desidero avere (da 0 a 255).  Su arduino ne ho solo 6 però!

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:

int i = 0;
int pwmsw = 127;

void setup() {
  pinMode(13, OUTPUT);  
  i = 0;
}

void loop() {
  if (i < pwmsw) digitalWrite(13, HIGH);
  else digitalWrite(13, LOW);    
  delayMicroseconds(10);  
  i++;
  if (i > 255) i = 0;    
}

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().

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...