Controllo della luminosità (Dimmer) Led con Arduino Genuino via seriale
Possiamo pilotare il valore del PWM di Arduino, e quindi la luminosità del led, in diversi modi.
Un esempio, perlopiù accademico che realmente utile, è quello di scrivere il valore direttamente da pc, via porta seriale inviando dei comandi specifici che Arduin dovrà interpretare come “Accendi”, “Spegni”, “Aumenta luminosità” o “Diminuisci luminosità”.
Iniziamo con la partlist e lo schema elettrico:
Partlist
- Arduino UNO
- Breadboard
- Filo rigido (va bene del doppino telefonico o un vecchio cavo di rete di recupero, purchè sia rigido)
- 1 resistore da 220Ohm, codice colore Rosso, Rosso, Marrone (Cos’è un resistore)
- 1 LED rosso
Schema elettrico
Lo schema è molto semplice, accostiamo arduino UNO non alimentato alla breadboard e posizioniamo i fili, il led e la resistenza come in figura.
Attenzione: i LED sono dei diodi luminosi e i diodi hanno una polarità, ciò significa che a differenza di una comune/vecchia lampadina a incandescenza, esiste un polo positivo e un polo negativo da rispettare. Se si inverte la polarità si rischia di danneggiare il componente.
Inoltre Arduino UNO lavora a 5V mentre il led rosso, come da specifiche, può essere alimentato al massimo a 1,8V poi rischia di bruciarlo. Per questo nel circuito si introduce un resistore. Il resistore infatti limita il passaggio di corrente e previene che il led subisca danni.
una volta verificato che il circuito sia correttamete montato possiamo alimentare Arduino UNO collegandolo al computer per eseguire la programmazione.
Programmare Arduino
Come precedentemente accennato, questo esercizio è utile per imparare a prendere dimestichezza sia con la componentistica che con le basi di programmazione di Arduino in linguaggio Wiring.
Iniziamo con l’introduzione delle variabili. Dobbiamo spiegare ad Arduino come deve comportarsi in certe condizioni, per fare ciò dobbiamo definire delle variabili che “rispecchiano il mondo esterno”
// Dichiaro la variabile LED un numero intero che corrisponde al pin digitale di Arduino/Genuino
int LED = 9;
// Imposto valore iniziale del PWM
int ValorePWM = 0;
// dichiaro variabile per carattere che arriva dalla seriale
char Carattere;
In questo pezzo di codice abbiamo detto ad Arduino che andremoad operare sul pin 9 della board. l’etichetta “LED” associata alla variabile serve solo a oi per comodità e semplicità di lettura del codice.
Abbiamo dichiarato che useremo una variabile di tipo intero per gestire il valore di luminosità. Questo numero andrà da 0 a 255.
Per cocludere abbiamo dichiarato una variabile di tipo carattere che verrà usata dalla porta seriale per ricevere i comandi di accensione, spegnimento e modifica luminosità.
Terminata la fase di dichiarazione variabili, passiamo alla funzione di setup.
void setup() {
// imposto la velocità di comunicazione che arduino utilizzerà per comunicare con il PC
Serial.begin(9600);
// dico ad Arduino che il pin 9 dell'omonima scheda sarà usato come OUTPUT
pinMode(LED, OUTPUT);
}
Nel setup definisco la velocità di comunicazione che Arduino utilizzerà per comunicare. Questa velocità dovrà essere adottata anche dal PC per poter comunicare correttamente.
Definisco inoltre che il pin9 della scheda Arduino sarà usato come OUTPUT
Arrivo quindi alla funzione di loop. La funzione di Loop verrà richiamata all’infinito da Arduino. Il loop viene eseguito finchè c’è tensione e finchè non si manifesta un errore o un eventomparticolare che ne sospende, blocca l’esecuzione. Nel nostro caso il loop sarà infinito.
// Ripeti queste istruzioni all'infinito:
void loop() {
// Se riceve comandi validi da seriale allora aggiorna ValorePWM
if (Serial.available() > 0) {
Carattere = Serial.read();
// se trovo '+' allora incrementa di 15 il valore PWM
if(Carattere=='+' && ValorePWM<255){
ValorePWM = ValorePWM+15;
}
// se trovo '-' allora decrementa di 15 il valore PWM
if(Carattere=='-' && ValorePWM>0){
ValorePWM = ValorePWM-15;
}
// se trovo '1' allora porta a 255 (massimo) il valore PWM
if(Carattere=='1'){
ValorePWM = 255;
}
// se trovo '0' allora porta a 0 (minimo) il valore PWM
if(Carattere=='0'){
ValorePWM = 0;
}
Serial.print('Ricevuto:');
Serial.println(ValorePWM);
analogWrite(LED, ValorePWM);
}
}
Considerando che tutto quello che è contenuto dentro la funzione loop viene continuamente eseguita, possiamo dire che per prima cosa il programma va a verificare continuamente se Arduino ha ricevuto un carattere dal PC. Se non c’è un carattere allora cotinua a riverificare finchè non arriva qualcosa.
Se viene rilevato un carattere allora lo script fa una serie di controlli del tipo: se è il carattere “+” allora attivo la parte di codice che aumenta il valore della luminosità di “15 punti” fino a un massimo di 255.
Se incontra il carattere “-” allora abbassa la luminosità di “15 punti” fino ad arrivare al minimo che è 0.
Se viene invece rilevo il carattere “1” allora Arduino porta subito la luminosità al massimo, ovvero 255 e al contrario se rileva il carattere 0 porta la luminosità a “0”.
Ecco il codice completo:
/*
Dimmer LED Seriale (Author: Matteo Dalle Feste - matteo@dallefeste.com - info@ciaobit.com - https://ciaobit.com )
Libero utilizzo a fini non commerciali e mantenendo i crediti dell'autore
You can use this script for free. Not for commercial use. Keep author credits
*/
// Dichiaro la variabile LED un numero intero che corrisponde al pin digitale di Arduino/Genuino
int LED = 9;
// Imposto valore iniziale del PWM
int ValorePWM = 0;
// dichiaro variabile per carattere che arriva dalla seriale
char Carattere;
void setup() {
// imposto la velocità di comunicazione che arduino utilizzerà per comunicare con il PC
Serial.begin(9600);
// dico ad Arduino che il pin 9 dell'omonima scheda sarà usato come OUTPUT
pinMode(LED, OUTPUT);
}
// Ripeti queste istruzioni all'infinito:
void loop() {
// Se riceve comandi validi da seriale allora aggiorna ValorePWM
if (Serial.available() > 0) {
Carattere = Serial.read();
// se trovo '+' allora incrementa di 15 il valore PWM
if(Carattere=='+' && ValorePWM<255){ ValorePWM = ValorePWM+15; } // se trovo '-' allora decrementa di 15 il valore PWM if(Carattere=='-' && ValorePWM>0){
ValorePWM = ValorePWM-15;
}
// se trovo '1' allora porta a 255 (massimo) il valore PWM
if(Carattere=='1'){
ValorePWM = 255;
}
// se trovo '0' allora porta a 0 (minimo) il valore PWM
if(Carattere=='0'){
ValorePWM = 0;
}
Serial.print('Ricevuto:');
Serial.println(ValorePWM);
analogWrite(LED, ValorePWM);
}
}
Un articolo simile che tratta sempre la luminosità di un led controllata con Arduino lo trovi qui: Regolare la luminosità di un LED con il PWM e Arduino Genuino
Se ti è piaciuto l’articolo condividilo! Grazie 🙂
Ottimo e semplice progetto.Complimenti!!