Tutorial: arduino, led rgb e potenziometri

E’ da tanto che non scrivevo un articolo sui Led, il monto dell’illuminazione mi affascina da sempre e sicuramente sono stati una forte spinta verso Arduino, proprio perchè con questa fantastica scheda, qualche componente e un po’ di fantasia …

Led RGB e Potenziometri

… puoi ottenere degli effetti davvero interssanti per i tuoi progetti.

Nello schema in alto puoi vedere come collegare un led RGB a catodo comune, due potenziometri ed arduino.

Ho volutamente utilizzato due potenziometri in quanto nei led RGB la caduta di tensione ai capi del diodo colore non è la stessa per tutti e tre i colori, in particolare nel tipo di led da me acquistato il led rosso ha una cadita di 1,9 – 2,2 v mentre i led verde e blue presentano una caduta di tensione di 3,3 – 3,5 v.

Se il tuo led dovesse avere differenti cadute di tensione risoetto ai colori potrai modificare lo sketch per adattarlo alle tue esigenze.

Ho protetto il led con un unica resistenza da 470Ω sufficente sia se alimenti il circuito a 5v sia se lo alimenti a 12v. Ti basta un unica resistenza collegata tra polo negativo e catodo essendo quest’ultimo comune a tutti i diodi led incassati nel contenitore plastico da 5mm.

Ed ecco lo sketch:

/*
 * Sketch Led RGB e potenziometri
 *
 * @author: Alfieri Mauro
 * @see:    https://www.mauroalfieri.it
 *
 * @licenze: Creative common
 */

int ledR = 9;
int ledG = 10;
int ledB = 11;

int potA = A5;
int potB = A4;

void setup()
{
  pinMode(ledR,OUTPUT);
  pinMode(ledG,OUTPUT);
  pinMode(ledB,OUTPUT);

  Serial.begin(9600);
}

void loop()
{
  int valA = map(analogRead(potA),0,1023,0,255);
  int valB = map(analogRead(potB),0,1023,0,255);

  Serial.print(" Potenziometro A: ");
  Serial.print( valA );
  Serial.print(" Potenziometro B: ");
  Serial.println( valB );

  analogWrite(ledR,valA);
  analogWrite(ledG,valB);
  analogWrite(ledB,valB);
}

linee 10-12: definisci 3 variabili di tipo integer per indicare i pin di OUTPUT con cui piloterai i 3 colori del led distintamente;

linee 14-15: definisci altre due variabili di tipo integer per indicare i pin di INPUT analogico A5 e A4 a cui sono collegati i due potenziometri;

linee 19-21: indica ad arduino che i tre pin assegnati alle variabili ledR, ledG e ledB sono da utilizzare come OUTPUT;

linea 23: imposta la comunicazione seriale tra Arduino e il tuo computer o mac a 9600 baud, userai questa connessione per vedere a video i valori letti dai potenziometri e tradotti in scala 0-255 per i led;

linee 28-29: sono il cuore dello sketch o almeno la prima parte del cuore :-), con il comando analogRead(pin), dove il pin glielo passi attraverso una variabile definita alle linee 14 o 15, leggi il valore dal potenziometro. Come sai il valore letto varia da 0 a 1023, ossia 1024 step, tuttavia al led questa informazioni sarebbe superflua perchè il valore in OUTPUT possibile sui pin PWM di arduino è 0-255, se non facessi nulla otterresti che nel primo quarto, circa, di rotazione il led varia la sua luminosità e dal valore 255 in poi resterebbe sempre alla massima intensità luminosa. Per correggere questa differenta tra INPUT ed OUTPUT arduino ti mette a disposizione la funzione map(valore,minInput,maxInput,minOutput,maxOutput) con cui traslare, più o meno in modo lineare, i valori letti su un pin analogico dalla scala 0-1023 alla scala 0-255;

potresti fare questa proporzione con dei calcoli e crearti tu una funzione, ma arduino ti semplifica la vita e te ne da una già fatta e collaudata;

linee 31-34: printano sul monitor seriale i valori provenienti dai poteziometri A e B traslati dalla funzione map();

linee 36-38: finalmente il duro lavoro è concluso, scherzi a parte, con la funzione analogWrite() scrivi il vaore del potenziometro A sul led Rosso ed il valore del potenziometro B sui led Green e Blu.

Se non ti è chiaro perchè utilizzo la funzione analogWrite() se ho collegato il led alle uscite digitali PWM puoi leggere questo mio articolo che ti chiarirà le idee: Programmare con Arduino – Pin Digitali e Analogici.

Buon divertimento

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/tutorial-arduino-led-rgb-e-potenziometri.html

15 commenti

1 ping

Vai al modulo dei commenti

    • Raffaele il 12 Agosto 2013 alle 11:40
    • Rispondi

    Ciao Mauro,
    avrei bisogno di una dritta.
    C’è un modo per agire sull’intensità di un led rgb, senza però andare a modificare la tonalità del colore raggiunta agendo sui potenziometri?

    Ti ringrazio in anticipo! Saluti

    1. Ciao Raffaele,
      piacerebbe anche a me riuscire a controllare la tonalità dei led, purtroppo arduino può solo controllare un PWM per cui dovrebbe essere il circuito esterno a gestire il controllo di tonalità.

      In internet ho trovato qualche articolo, tempo fa, che descriveva come ottenere questo risultato, se raggiungi il tuo scopo mi piacerebbe sapere come hai fatto se ti va di condividerlo sul blog.

      Mauro

        • Massimo il 27 Agosto 2013 alle 16:09
        • Rispondi

        Ciao ragazzi, passando di quà in cerca di info sul controllo led RGB che sto facendo per un PIC ho letto la discussione….
        Ma per tonalità intendete mettere ad esempio un colore e poi farlo diventare più scuro o più chiaro? ovvero, meno e più luminoso?

        Se è questo che intendete e non vi ho sovrainteso, dovete fare in modo che valA, valB, e valC vadano avanti di pari passo…

        Questo può essere fatto mettendoli ad es. tutti e 3 a 0 e pi aumentando ogni ciclo (1,2,3,4…..255).
        In questo modo la luminosità aumenta va non varia il colore…divent solo più chiaro…..
        Allo stesso modo per scurirlo mettere le suddette variabili come (255,254,253…….3,2,1).

        Correggetemi se sbaglio, ma se metto tutti e tre a 255 ottengo un colore neutro? cioe bianco come un led trasparente incolore?

        Ciao
        Max

        1. Ciao Massimo,
          bellissima soluzione quella che stai adottando, non ci avevo pensato.
          In linea teorica informatica tutto dovrebbe essere come scrivi, tuttavia nei led RGB i tre colori non hanno la medesima intensità per cui al massimo grado di luminosità per ciascuno non si ottiene un colore neutro, almeno nei led che ho utilizzato.

          Proverò a incrementare e decrementare di pari passo i 3 valori PWM partendo da valori differenti tipo:

          230,250,245
          231,251,246
          … … …

          Tuttavia penso sia necessario impostare che al raggiungimento del valore massimo di uno dei tre valori non si possa procedere oltre, questo compliva un po’ lo sketch, supponendo che il rosso non debba superare i 232 di valore massimo otterrai una situazione massima del tipo:

          232,251,247

          oltre cui non incrementare più alcun valore dei tre.

          Grazie per il tuo contributo.

          Mauro

    • Massimo il 27 Agosto 2013 alle 17:14
    • Rispondi

    Io sto usando un PIC e sto facendo esperimenti per ottenere dai led RGB una gamma ancora più alta di colori…..

    Non so se funzionerà…per intanto ho scritto 2 algoritmi per ottenere livelli non solo a 8 bit (255 sfumature per R,G,B) ma anche a 10 bit e 12 bit….

    in quello a 10 bit il comando è RGB(da 0 a 1023, da 0 a 1023, da 0 a 1023)
    in quello a 12 bit il comando è RGB(da 0 a 4096, da 0 a 4096, da 0 a 4096)

    Numero di colori a 8 bits per led (tot 24bits) = 256^3 = 16.777.216
    Numero di colori a 10 bits per led (tot 30bits) = 1024^3 = 1.073.741.824
    Numero di colori a 12 bits per led (tot 36bits) = 4096^3 = 68.719.476.736 (+ di 68 miliardi di colori)

    Per intanto tutto funziona e torna a livello codice… sto testando il tutto sull’emulatore Proteus ISIS e va alla grande.

    Questo si può fare anche con Arduino, ma non usando il comando AnalogWrite, inquanto limitato in risoluzione 8 bit (0-255), bisogna scrivere delle funzioni appropriate….I led verranno accesi uno per volta, ma essendo la sequenza estremamente veloce si ha la sensazione che siano accesi tutti e 3 allo stesso momento.

    Poi però quando monterò la scheda fisica con il led RGB, entreranno in ballo molte variabili….
    ad esempio….
    può un led RGB sopportare queste risoluzioni?
    può l’occhio umano percepire sfumature superiori ai 16 milioni di colori ? (24bits)

    Con un quarzo da 20Mhz ho un refresh dei tre led (o uno singolo RGB come esempio di Mauro) molto
    alto, intorno i 700hz, penso che dovrò abbassarlo di parecchio… mi pare che debba essere intorno i 30-50hz…
    Mi sbaglio secondo voi?

    Spero che arrivi la comunicazione via mail in caso di Vs risposta, visto che non vengo spesso su questo sito… non perchè non mi piaccia…anzi…ad averne così…ma perchè sono molto preso ed ho pochissimo tempo in questo periodo…

    Ciao
    Max

    1. Ciao Massimo,
      ottima spiegazione, grazie

      Mauro

    • Tesa il 25 Dicembre 2013 alle 18:53
    • Rispondi

    Ciao Mauro, volevo chiederti un’informazione, potresti darmi il modello dei tuoi potenziometri? 🙂
    Grazie mille!

    1. Ciao Tesa,
      sono semplici potenziometri da 10k che trovi in qualsiasi negozio di elettronica.

      Mauro

    • Alessio il 20 Novembre 2014 alle 19:08
    • Rispondi

    Ciao Mauro, vorrei chiederti informazioni in merito alla proporzione matematica vera e propria che svolge la map.
    Riusciresti a scrivermi secondo quale criterio viene ridefinito il range (la formula della proporzione)?

    Io ho dei valori originali da 0 a 1023 e vorrei inserirli in un range da 0 a 4.

    Grazie, Alessio

    1. Ciao Alessio,
      sul reference arduino è descritto chiaramente come funziona: http://arduino.cc/en/reference/map
      Nel tuo caso ti basta dividere per 255 ( 1023/255 = 4,011 => 4 come numero intero )

    • Riccardo il 25 Settembre 2017 alle 15:25
    • Rispondi

    Ciao Mauro! Sto cercando di utilizzare due potenziometri per variare sia il tempo in cui un led è acceso sia quello in cui è spento. Ho provato a scrivere qualche sketch, ma riesco soltanto a variare il tempo in cui rimane acceso. Avresti qualche idea per aiutarmi?
    Grazie
    -Riccardo

    1. Ciao Riccardo,
      quello che desideri fare, così come lo descrivi, è logicamente errato.
      Se il led è uno solo la determinazione del tempo di accensione è diretta conseguenza del tempo durante il quale il led resta spento.

    • Riccardo il 25 Settembre 2017 alle 15:38
    • Rispondi

    Ciao Mauro! Sto cercando di utilizzare due potenziometri per regolare il tempo in cui è acceso e il tempo in cui è spento un led. Ho provato a scrivere qualche sketch ma sono riuscito a regiolare solo il tempo in cui è acceso. Avresti qualche idea per aiutarmi?
    Grazie.
    Riccardo

    1. Ciao Riccardo,
      quello che desideri fare, così come lo descrivi, è logicamente errato.
      Se il led è uno solo la determinazione del tempo di accensione è diretta conseguenza del tempo durante il quale il led resta spento.

        • Riccardo il 26 Settembre 2017 alle 17:51
        • Rispondi

        Grazie era quello che stavo cercando di capire. Quindi l’unico modo per variare il tempo ON in modo differente dal tempo OFF è quello di utilizzare la funzione delay() e inserire manualmente i millisecondi?

  1. […] precedente: Tutorial: arduino, led rgb e potenziometri hai potuto realizzare un controllo RGB per il tuo led con soli due potenziometri, […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.