Progetto #18 • Arduino per principianti

LED RGB con potenziometro e Arduino

Usa un potenziometro per trasformare un ingresso analogico in un controllo PWM della luminosità del canale rosso di un LED RGB.

Difficoltà★★☆☆☆ Facile
Tempo20–30 minuti
ConcettianalogRead() • map() • PWM

🚀 Introduzione

In questo progetto utilizzeremo un potenziometro da 10 kΩ per controllare la luminosità di uno dei canali di un LED RGB. Arduino legge la posizione della manopola sull’ingresso analogico A0 e converte il valore ottenuto nel range utilizzato dal PWM.

Lo sketch originale controlla soltanto il canale rosso del LED RGB. I pin verde e blu vengono configurati come uscite, ma non vengono ancora modulati nel loop().

Concetto chiave: trasformiamo un valore analogico compreso tra 0 e 1023 in un comando PWM compreso tra 0 e 255.

🎯 Cosa imparerai

  • leggere un potenziometro con analogRead();
  • comprendere l’intervallo ADC 0–1023 di Arduino UNO;
  • ridimensionare un valore con map();
  • controllare la luminosità con analogWrite();
  • usare un LED RGB a catodo comune;
  • capire la differenza tra ingresso analogico e uscita PWM;
  • preparare le basi per un vero mixer RGB a tre controlli.

🧰 Materiale necessario

1× Arduino UNO o compatibile
1× LED RGB a catodo comune
3× resistenze da 220 Ω
1× potenziometro lineare da 10 kΩ
1× breadboard
Cavetti jumper

🛒 Non hai ancora i componenti?

Un kit Arduino per principianti contiene molti dei componenti elettronici utilizzati nei progetti del sito.

Kit Arduino consigliato → Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

📘 Vuoi imparare Arduino passo dopo passo?

Nei miei libri trovi spiegazioni progressive, schemi chiari e numerosi progetti pratici.

Scopri i miei libri Arduino → Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

🔌 Schema di collegamento

ComponenteCollegamento
LED RGB — RossoD9 tramite resistenza 220 Ω
LED RGB — VerdeD10 tramite resistenza 220 Ω
LED RGB — BluD11 tramite resistenza 220 Ω
LED RGB — Catodo comuneGND
Potenziometro — estremo 15 V
Potenziometro — cursore centraleA0
Potenziometro — estremo 2GND
Se il verso della manopola ti sembra invertito, scambia i due terminali laterali del potenziometro. Il cursore centrale deve restare collegato ad A0.
Schema Arduino con LED RGB e potenziometro su A0

⚖️ Perché servono tre resistenze?

Il LED RGB contiene tre LED indipendenti, quindi ogni canale deve avere la propria resistenza di limitazione della corrente. Anche se in questo sketch viene modulato soltanto il rosso, è corretto predisporre una resistenza per ciascun colore.

💻 Codice Arduino

Progetto #18 — LED RGB con potenziometro
// ============================================
// Progetto 18 - LED RGB con potenziometro
// Il potenziometro controlla il colore
// ============================================

// Pin RGB
int redPin = 9;
int greenPin = 10;
int bluePin = 11;

// Pin potenziometro
int potPin = A0;

// Variabile lettura
int potValue = 0;

void setup() {

  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

}

void loop() {

  // Legge il valore del potenziometro
  potValue = analogRead(potPin);

  // Converte il valore da 0-1023 a 0-255
  int brightness = map(potValue, 0, 1023, 0, 255);

  // Controlla il colore rosso
  analogWrite(redPin, brightness);

}

⚙️ Come funziona il programma

Il funzionamento è molto lineare:

1. Lettura
analogRead(A0) restituisce un valore da 0 a 1023.
2. Conversione
map() trasforma 0–1023 in 0–255.
3. PWM
analogWrite(redPin, brightness) applica il nuovo duty cycle al canale rosso.
4. Ripetizione
Il loop continua rapidamente e segue la posizione della manopola.

📊 Cosa legge analogRead()

Arduino UNO dispone di un convertitore analogico-digitale a 10 bit. Per questo analogRead() restituisce valori da 0 a 1023.

Posizione indicativaValore ADC
Minimocirca 0
Metà corsacirca 512
Massimocirca 1023
Questi sono valori ideali. Un potenziometro reale può non raggiungere esattamente 0 e 1023 e può mostrare piccole oscillazioni.

🔄 Perché usiamo map()

Il range dell’ADC e quello usato da analogWrite() non coincidono. Lo sketch usa quindi:

Conversione
int brightness = map(potValue, 0, 1023, 0, 255);

In questo modo una lettura bassa produce un valore PWM basso, mentre una lettura alta produce un valore vicino a 255.

💡 analogWrite() non genera una vera tensione analogica

Su Arduino UNO, analogWrite() sui pin PWM non produce una tensione continua variabile come farebbe un vero DAC. Genera invece un segnale digitale che passa rapidamente tra LOW e HIGH variando il duty cycle.

Per il LED l’effetto percepito è una variazione di luminosità, perché l’occhio integra rapidamente gli impulsi.

🎚️ Cosa significa 0–255 nel PWM

ValoreEffetto indicativo
0Canale spento
64Luminosità bassa
128Duty cycle circa 50%
192Luminosità elevata
255Canale sempre attivo
La luminosità percepita non cresce in modo perfettamente lineare con il numero PWM. L’occhio umano ha una risposta non lineare, quindi un valore 128 non viene necessariamente percepito come “metà luminosità”.

🌈 Perché il progetto non cambia davvero colore?

Il titolo originale parla di controllo del colore, ma lo sketch attuale modifica solamente la luminosità del rosso. I canali verde e blu sono configurati come uscite ma non ricevono alcun analogWrite().

Quindi, tecnicamente, questo progetto è un dimmer del canale rosso di un LED RGB. È però il passo perfetto prima di controllare tutti e tre i canali e creare un vero mixer di colori.

💡 Catodo comune e anodo comune

Lo schema è pensato per un LED RGB a catodo comune: il terminale comune è collegato a GND e un duty cycle maggiore aumenta la luminosità del canale.

Con un LED ad anodo comune la logica va invertita. Non utilizzare lo stesso codice senza adattare il controllo.

🔧 Problemi comuni

La luminosità non cambia
Controlla che il cursore centrale del potenziometro sia realmente collegato ad A0.
Il LED resta spento
Verifica catodo comune, pin rosso e resistenza.
La manopola funziona al contrario
Scambia i due terminali laterali del potenziometro.
Il colore sbagliato varia
L’ordine fisico dei pin RGB del tuo LED potrebbe essere differente.
Luminosità leggermente instabile
Le letture analogiche possono oscillare di qualche unità; è normale entro certi limiti.
Tutto funziona al contrario
Potresti avere un LED RGB ad anodo comune.

🧠 Cosa devi ricordare

  • analogRead() restituisce 0–1023 su Arduino UNO;
  • map() converte il range in 0–255;
  • analogWrite() usa PWM, non una vera uscita analogica continua;
  • il potenziometro controlla soltanto il canale rosso nello sketch originale;
  • ogni canale RGB deve avere la propria resistenza;
  • il LED utilizzato è a catodo comune;
  • tre controlli indipendenti permetteranno di realizzare un vero mixer RGB.

🔄 Varianti possibili

🎛️ Tre potenziometri
Uno per rosso, uno per verde e uno per blu.
🌈 Mixer RGB
Combina i tre canali per creare moltissimi colori.
✨ Fade automatico
Genera transizioni senza usare la manopola.
📟 Display
Mostra il valore ADC e il livello PWM.
🌡️ Indicatore sensore
Usa il colore o la luminosità per rappresentare una misura.
📱 Controllo remoto
Regola RGB tramite Bluetooth o Wi-Fi.