OUTPUT ANALOGICO: Effetto FADE su LED

Costruire il seguente circuito (serve un LED e una resistenza da 220 ohm)

Il nostro Arduino ha 6 pin dedicati a segnali analogici, ma sono solo in INPUT, ossia questi pin servono principalmente per acquisire dei segnali provenienti da sensori di tipo analogico: trimmer, potenziometri, fotoresistenze, ultrasuoni, IR, ecc… ossia tutti quei sensori che possono generare un segnale analogico in funzione della loro stimolazione (luminosa, meccanica, ecc) se ad esempio volessi rilevare la distanza con un sensore IR dovrai utilizzare uno di questi pin.

Ci sono poi 14 pin digitali: sono pin che possono essere usati sia in INPUT (ingresso) per acquisire il valore di un pulsante o di un interruttore a leva, sia in OUTPUT (uscita) per inviare segnali logici ad una scheda aggiuntiva, ad un led, etc. Siccome si tratta di impulsi di tipo digitale il valore che puoi ricevere/inviare è il classico 0/1 o in linguaggio di Arduino LOW/HIGH.

Leggere un valore LOW (0) equivale a dire che sul pin che stai controllando è arrivato un segnale logico basso (0v). Viceversa ricevere HIGH (1) equivale a dire che il pin ha ricevuto un segnale logico alto (5v). Il ragionamento appena fatto è valido anche quando utilizzo il pin come OUTPUT, ossia per inviare segnali: se invio LOW ( 0 ) mando un segnale logico basso (0v), se invio HIGH mando un segnale logico alto (5v).

Alcuni degli ingressi digitali presentano la sigla PWM. Il segnale PWM accetta come valori da 0 a 255. Per ciascun valore varia il duty-cycle generato. Ad esempio con il valore 0 ho un duty-cycle dello 0% ossia sempre 0 (risultato analogo a quello che avresti ottenuto utilizzando il comando: digitalWrite(pin,LOW) ).

Un segnale PWM (Pulse Width Modulation ovvero modulazione a variazione della larghezza d'impulso) è un' onda quadra con duty cycle variabile che permette di controllare l'assorbimento (la potenza assorbita) di un carico elettrico (ad esempio un motore DC), tramite la variazione del duty cycle.
Un segnale PWM è caratterizzato da una frequenza (fissa) e da un duty cycle (variabile). Il duty cycle è il rapporto tra il tempo in cui l'onda assume valore alto e il periodo T (l'inverso della frequenza: T=1/f). Ne segue che un duty cycle del 50% corrisponde ad un'onda quadra che assume valore alto per il 50% del tempo; un duty cycle dell'80% corrisponde ad un'onda quadra che assume valore alto per l'80% del tempo e basso per il restante 20%, un duty cycle del 100% corrisponde ad un segnale sempre alto mentre un duty cycle dello 0% ad un segnale sempre basso.

L'onda quadra con duty cycle variabile tra 0 e 100% viene utilizzata per stabilire la velocità di rotazione del motore DC (a corrente continua). Per comprendere meglio la questione duty-cycle ho preso l’immagine mostrata sul sito Arduino contenente alcuni esempi del duty-cycle in funzione del numero che specificherai:

Ricordarsi sempre di settare la modalità del pin prima di eseguire l’invio dei comandi! Ad esempio scrivendo: pinMode(11,OUTPUT) indico ad Arduino di utilizzare il pin 11 in modo OUTPUT. Adesso posso quindi inviare il mio segnale con duty-cycle al 50% mediante il comando: analogWrite(11,127). Si osservi che  ho utilizzato analogWrite anche se il pin 11 è un pin digitale. Il motivo è che il tipo di segnale ha una variazione di valori da 0 a 255 e non solo 0 e 1. Il valore 127 è esattamente a metà della scala ( 0 – 255 ) quindi il duty-cycle generato sarà del 50%.

Al fine di sfumare la luminosità del LED da acceso (valore massimo 255) a spento (valore 0) modifico il contenuto del PIN 9 di una q.tà definita nella variabile brightness e, gradualmente aumentare il valore da 0 a 255. Successivamente ripeto il ciclo all'infinito.

/* -----------------------------------------------------------------------------------
 Esempio creato partendo dal codice: Fade di pubblico dominio.
 Scrive un valore di tipo analogico sul pin 9 settando in questo modo
 la luminosità di un led - Uso funzione analogWrite()
----------------------------------------------------------------------------------- */
int led = 9;                  // E' il pin collegato al LED
int luminosita = 0;           // Variabile globale che definisce il grado di luminosità
int variazioneluminosita = 5; // passo dell'effetto fade

// La routine di "setup" parte appena premo il tasto di reset:
void setup()  
{ 
  // dichiaro il pin 9 come output:
  pinMode(led, OUTPUT);
} 

// La loop routine continua a girare:
void loop()  
{ 
  // setta la luminosità sul PIN 9:
  analogWrite(led, luminosita);    

  // cambia il grado di luminosita:
  luminosita = luminosita + variazioneluminosita;

  // inverto la direzione del fade (dissolvenza) 
  if (luminosita == 0 || luminosita == 255)
     variazioneluminosita = -variazioneluminosita ; 

  // aspetto 100 millisecondi    
  delay(100);                            
}