Pilotare LED RGB

Come usare Arduino per pilotare strip led RGB

La tecnologia led si è ormai evoluta ed inizia ad essere presente in modo pronunciato in molti ambienti, dalla casa agli uffici fino ad arrivare all’illuminazione pubblica. I vantaggi in termini di risparmio energetico sono enormi e la qualità della luce emessa sta raggiungendo un comfort visivo soddisfacente.

Anche nell’arredamento troviamo soluzioni carine che vanno dalla lampada da salotto multicolore alle luci di cortesia nei piani cottura oppure alle barre led impermeabili poste nel box doccia.

Vista la nostra passione per l’auto-costruzione possiamo realizzare un dispositivo basato su Arduino per pilotare una barra led RGB. Per questo tutorial ho usato una Arduino Leonardo e uno spezzone di 10 cm di una strip led RGB da un metro. Questo modello viene alimentato a 12Vdc e un modulo assorbe, con tutti i led accesi circa 55mA. (quindi un metro assorbe circa 550mA).

Un elemento RGB è composto da 3 LED distinti (Rosso, Verde, Blu) disposti in modo da poter interagire tra loro per formare diversi colori complementari.

Stril Led RGB da 10 cm

Il modo più semplice per accendere i led è di collegare uno dei pin (B,R,G) verso massa; non è necessario utilizzare delle resistenze per limitare la corrente.

Vediamo ora come usare Arduino per accendere e spegnere singolarmente i vari led. Il circuito da realizzare è il seguente e si basa su tre transistor PNP tipo BC337.

Controllo strip led rbg

Le basi dei tre transistors sono collegate ai pin 3, 5 e 6 non a caso poiché su questi pin è disponibile anche il segnale PWM che utilizzeremo per andare a pilotare i led RGB in modo migliore.

[c]

void setup()
{
//led Rosso
pinMode(5, OUTPUT);
//led verde
pinMode(6, OUTPUT);
//led blu
pinMode(3, OUTPUT);

//init seriale
Serial.begin(9600);
}

void loop() {
//se arrivano dati…
if (Serial.available())
{
//leggi il carattere in arrivo
byte data = Serial.read();

if(data == ‘q’) //accende il led blu
digitalWrite(3, HIGH);
else if (data == ‘w’) //spegne il led blu
digitalWrite(3, LOW);

if(data == ‘a’) //accende il led verde
digitalWrite(5, HIGH);
else if (data == ‘s’) //spegne il led verde
digitalWrite(5, LOW);

if(data == ‘z’) //accende il led rosso
digitalWrite(6, HIGH);
else if (data == ‘x’) //spegne il led rosso
digitalWrite(6, LOW);
}
}
[/c]

Il codice precedente permette di accendere o spegnere i led inviando tramite serial monitor i caratteri corrispondenti.

Per un maggior controllo dei led RGB possiamo utilizzare il segnale PWM. In questo modo abbiamo la possibilità di creare dissolvenze per creare combinazioni di colori visivamente più interessanti.
Ad esempio il codice seguente permette di accendere e spegnere il led BLU in modo graduale tramite una dissolvenza

[c]

void setup()
{
//led Rosso
pinMode(5, OUTPUT);
//led verde
pinMode(6, OUTPUT);
//led blu
pinMode(3, OUTPUT);

//init seriale
Serial.begin(9600);
}

void loop()
{
//Aumenta il duty cycle da 100% a 0%
for(byte sfuma = 0; sfuma < 255; sfuma++)
{
analogWrite(3, sfuma);
delay(40);
}

//diminuisci il duty cycle da 100% a 0%
for(byte sfuma = 255; sfuma > 0; sfuma–)
{
analogWrite(3, sfuma);
delay(40);
}
}
[/c]

Se volessi miscelare i colori potrei scrivere qualcosa del genere

[c]

void setup()
{
//led Rosso
pinMode(5, OUTPUT);
//led verde
pinMode(6, OUTPUT);
//led blu
pinMode(3, OUTPUT);

//init seriale
Serial.begin(9600);
}

void loop()
{
//accendo il led rosso
digitalWrite(6, HIGH);

//Aumenta il duty cycle da 100% a 0%
for(byte sfuma = 0; sfuma < 255; sfuma++)
{
analogWrite(3, sfuma);
delay(40);
}

//spengo il rosso
digitalWrite(6, LOW);
//accendo il verde
digitalWrite(5, HIGH);

//diminuisci il duty cycle da 100% a 0%
for(byte sfuma = 255; sfuma > 0; sfuma–)
{
analogWrite(3, sfuma);
delay(40);
}
}
[/c]

Le combinazioni che possiamo creare sono innumerevoli, potete provare a sperimentare creando effetti luminosi che possono abbellire i vostri ambienti.

43 risposte a Pilotare LED RGB

  • articolo molto tecnico che sicuramente sarà stato utile a chi è competente nel campo

    • Anche se hai poca esperienza nel campo, ti assicuro che provando ad utilizzare gli sketch presenti nell’articolo potrai verificare quanto sia facile utilizzare i led rgb

      grazie della visita
      Marco

  • Ciao, vorrei capire come hai dimensionato il circuito perché vorrei imparare.
    Rispolverando qualche appunto, ho trovato che la tensione di base del transistor è La tensione di uscita di arduino cioè 5V * (R1/R1+R2) cioè 10/11= 4.5V circa.
    Ma dal datasheet ho letto che la tensione Vbe massima dovrebbe essere 1.2V considerando che l’emettitore non ha resistenza ed è direttamente a massa, nel circuito la tensione Vbe è proprio la Vb=4.5V
    Dove sbaglio?

    • Non è che per caso le resistenze da 1k e da 10k devono essere invertite? cosi’ da avere 0.45V come Vbe e una Rb equivalente da 900Ohm la corrente di base verrebbe a questo punto 0.5 mA e la corrente di collettore i quei 50mA voluti (circa)

    • I valori sono dettati dalla pratica e dall’esperienza. Devi portare in saturazione il transistor fornendogli la corrente neccessaria.
      Ib = Ic/Hfe quindi 0.055/200= 0,000275 A
      per essere sicuri della condizzione di saturazione la corrente di base viene incrementata di 2-3 volte. Otteniamo quindi un valore di circa 0.0008A
      per calcolare la resistenza di base devi calcolare una caduta di tensione di 4.3V (5V- 0.7V dove 0.7V è la tensione tra base e emmettitore) quindi
      Rb = 4.3V/0,0008A = 5300 ohm.
      ora sappendo che il segnale è pwm e che quindi il valore medio non è mai 5V ho diminuito la resistenza a 1K.
      La resistenza da 10K serve solamente a dare un riferimento verso massa alla base del transistors.

      Non ti preoccupare troppo dei calcoli, la pratica è molto diversa dalla teoria

      a presto
      Marco

      • Ok il mio problema era che dimensionavo in zona attiva diretta, da amplificatore, invece è più sensato stare in saturazione non so perché ma non ci avevo pensato.
        Grazie per la spiegazione.

  • se ho la barra a 24 v cambia qualcosa?

    • Ciao Bruno
      lo stesso circuito lo puoi usare anche per barre a 24Volt, l’unica cosa che devi verificare è quanti mA assorbe la tua barra. il transistor BC337 può erogare massimo 800mA, se la tua barra ha bisogno di più corrente devi cambiare transistor con uno più potente come ad esempio il TIP110

      • grazie comunque la mia assorbirà si e no 10 A (ne ho un bel po)

        • 10A? devi costruire una discoteca? allora devi usare un BD912 oppure TIP107, da mettere su aletta di raffredamento.

          • ciao ho comprato i transistor, al negozio avevano finito tutto e mi hanno detto che i tip 120 andavano bene lo stesso, io li ho collegati ma la barra mi resta sempre accesa

            • Ciao, ti ho mandato una mail.
              prova a mettere a livello logico i pin 3, 5 e 6, controlla se i led sono spenti altrimenti diminuisci la resistenza da 10k portandola a 1k.

              fammi sapere via mail
              ciao

  • Ciao Marco, volevo chiederti una cosa, ma io volessi utilizzare lo stesso strasformatore a 12 v che uso per alimentare la strip, per alimentare anche arduino, è sufficiente collegarli in parallelo e sul lato di arduino inserire una resistenza che mi faccia cadere circa 7v. Se esatto che valore di resistenza mi consigli.

    Grazie e ancora complimenti

    • Ciao Massimiliano
      se il tuo alimentatore eroga 12V continui ben stabilizzati puoi collegarli direttamente alla jack di alimentazione di Arduino, infatti puoi alimentare la board con tensioni che vanno da 7 a 12 Volt

      grazie
      a presto
      Marco

      • In realtà volerlo usare solo un AT MEGA 328 caricato con bootloader e relativo sketch. In più volevo usare un ricevitore infrarossi per poterlo comandare oltre a 3 potenziometri ( uno x canale RGB), un interruttore on-off, ed un pulsante per selezionare I vari programmi. Quindi sarei molto interessato alla parte elettrica.

        Grazie

        • Ti mando un semplice schema via mail
          ciao

          • Grazie mille Marco, rispecchia perfettamente il mio progetto, ma volendo alimentare un AT MEGA 328 direttamente col trasformatore da 12 V, come posso fare??

  • ciao marco visto che non sono molto ferrato in questo argomento volevo chiederti un paio di cose circa una lampada che dovrei creare; io devo pilotare una strip led da 12 volt (tagliata in 4 diversi pezzi) con arduino mega e farla funzionare attraverso l’uso di capsense artigianali (ho visto che possono essere fatti anche con un semplice foglio di alluminio ad esempio). ad ognuna delle 4 parti della strip led dunque sarà assegnato un suo capsense, che sfiorato andrà ad accendere la singola strip, mentre se risfiorato andrò a spegnerla. ovviamente devo collegare arduino ad una batteria 12 v. Puoi darmi qualche info sullo schema del circuito se hai capito quello che voglio fare?? te ne sarei molto grato! grazie in anticipo e complimenti per il sito!

    • Ciao Giorgio
      per il sensore capsense puoi costruirlo con un semplice filo ed utilizzando questa libreria http://playground.arduino.cc//Main/CapacitiveSensor?from=Main.CapSense.
      A seconda dello stato dell’ingresso, dove collegherai il sensore, potrai pilotare la barra rgb usando lo schema dell’articolo. quindi ad ogni capsense dovrai pilotare i tre transistor per accendere la barra led.

      a presto e grazie dei complimenti
      Marco

      • grazie per la risposta!!! guardando lo schema che hai postato sopra la massa dei led e del gnd rispettivamente (-) e (+) vanno a collegarsi alla batteria?? e soprattutto se non devo far si che le luci cambino colore, quindi facendo a meno dei pwm, posso utilizzare un unico pin di arduino con 3 fili che andranno poi a collegarsi ai 3 transistor? l’unica luce che mi serve infatti è quella bianca.

        Grazie molte, ti inserirò di sicuro nei ringraziamenti della tesi :)

        • Ciao
          se ti serve solo la luce bianca puoi sostituire la barra rgb con una barra led bianca. In questo caso ti serve solo un transistor piuttosto che tre.
          I fili (+) e (-) vanno collegati a una fonte di alimentazione qualsiasi, se tu usi una batteria va collegata rispettando le polarità.

          Se ti serve uno schema più dettagliato mandami una mail in privato.

          Grazie per la menzione sulla tesi!

          a presto
          Marco

  • Ciao Marco,
    il tuo blog è sempre ricco di risorse pratiche… stavo proprio cercando un circuito semplice per alimentare delle strip led… ;-)

    provato e perfettamente funzionante. Ti volevo chiedere solo :
    nel caso volessi utilizzare un Tip110 immagino che la resistenza di pull-down rimanga invariata ma che valore dovrà avere quella di base? proverò a fare 4 calcoli come hai spiegato qualche commento fa…

    Saluti

    • Ciao Pixel,
      il Tip110 è un darlington è si attiva con correnti bassissime, quindi puoi lasciare invariato il circuito.

      a presto
      Marco

  • Salve, vorrei usare 1mt intero di stripled, lasciando invariata la componentistica avrei dimensionato r1 =100 ohm al posto di 1kohm visto che la corrente passa da 0.055A a 0.550A può funzionare? o brucio tutto?
    Grazie saluti.

    • Ciao Jacob
      il circuito di piloraggio del transistor rimane invariato a prescindere se usi una strid da 1mt o da 5mt. Le strip led sono pronte all’uso, non devi usare resistenze di limitazione.
      L’unico elemento da sostituire può essere il transistor BC337, ma solo nel caso in cui colleghi diversi metri di strip led. Nel tuo caso avendone solo 1 mt il circuito rimane invariato.

      saluti
      Marco

      • Salve, mi sfugge una cosa, hai scritto nell’articolo che l’assorbimento per 10cm è 55 mA mentre per 1 metro è 550mA.
        Nei conti fatti per un altro utente hai diviso Ib = Ic/Hfe quindi 0.055/200= 0,000275 A
        Nel mio caso non dovrei avere 0.55/200 portandomi alla fine dei calcoli ad una resistenza da 100 ohm invece di 1k
        Dove sbaglio?
        Saluti.

        • Ciao Jacob,
          il transistor funziona, in questo caso, come un interruttore, la corrente che scorre sul transistor non dipende da quella della base, come spiegato nelle formule. Il circuito funziona sia con una resistenza da 100 ohm che con quella da 1K, perché la corrente che arriva alla base è sufficiente per mandare il transistor in saturazione.
          Usando le formule devi giustamente mettere i valori che hai scritto tu ma in pratica se fai una prova vedrai che la strip si accende sia con la resistenza da 100 sia con quella da 1K.

          A presto
          Marco

  • Salve, ho realizzato il circuito, ma c’è qualcosa che non và…
    La tensione che arriva sui led è al massimo 7-8 volt e quindi i led sono fiochi, come mai?

    • Ciao Antonio
      probabilmente hai un alimentatore che fornisce pochi milliamper. Dovresti usarne, per una stip da 5mt, uno che eroghi almeno 1A

      fammi sapere
      Marco

      • Grazie Marco, ma sto alimentando solo uno strip di 3 led… Sto utilizzando un BC337-25 e ho 4,5 v sulla base del transistor. Sul colkettore ho 12v ma sull’emettitore 7-8v…Nn so proprio cosa possa essere…

        • … che prova potrei fare? Help!!!
          Grazie

          • Se alimenti i led direttamente, senza usare il circuito con Arduino, riesci ad accendere i singoli led?

            • Risolto… la millefori è difettata!!!! non lasciava passare la giusta tensione!!!

              Grazie per l’interessamento.

              Ps. ma come mai, utilizzando il 3° codice, nelle sfumature c’è il salto di colore ?

  • Una domanda,
    volendo utilizzare un ARDUINO nano oppure mini, e volendo pilotare tramite una batteria circa 5 / strisce da imt di led a singolo colore, che pero si accendono in sincro dal basso verso l’ alto. secondo te è una cosa fattibile

    simone.

    • Ciao Simone
      si è fattibile accendere le strip una dopo l’altra. Naturalmente la strip la accendi tutta, non puoi accendere i led singoli, a meno che non usi una strip indirizzabile che costa molto di più.

      Marco

  • Ciao, ho realizzato un circuito identico ( con tip120 ) ma comandato da potenziometro, ma ho un problema: la strip led ( solo una piazza da 3 led ) rimane accesa ( con un intensità minore del massimo ) anche con arduino spento. Inoltre il range di luminosità è molto stretto.

    • Ciao Riccardo
      il potenziometro dove lo hai collegato? prova ad accendere la strip senza usare Arduino e verifica che la stip funzioni correttamente.

      a presto
      Marco

      • Ciao Marco, allora il potenziometro è collegato normalmente all’ingresso analog in di arduino. Ho provato a mettere in uscita dal pin per il led che va al transistor high o low per acceso o spento, ma in low rimane comunque acceso ma con intensità più bassa ho provato vari transistor ( magari era difettoso ) ma il problema persiste.

        • Io ho un problema simile, quando sono al minimo la stripled mi rimane spenta ma a volte lampeggia flebilmente come se scorresse corrente anche con un PWM nullo, ho anche provato a spegnarla con un digitalwrite quando il valore letto sul potenziometro è 0 ma non cambia la situazione la stripled saltuariamente lampeggia. Consigli?

          • Ciao
            il transistors è il bc547? prova a sostituire la resistenza da 10Kohm con una da 4.7Kohm.

            a presto

            • Scusa la domanda forse stupida, ma la resistenza da 10 Kohm va a massa insieme alla pila da 12V nel GND di Arduino?

              • Assolutamente si, le masse(gnd) devono essere tutte collegate tra loro. Probabilmente è questo il problema.

                fammi sapere
                Marco

                • Nono sono collegate tutte assieme. Il mio problema è come quello di Jacob, con alimentazione nulla il transistor chiude il circuito e fa accendere i led.
                  Riccardo

Rimani aggiornato

La mia lista dei prodotti
Compra su Amazon Italia

Compra su Amazon Italia
Sondaggi

Arduino.cc vs Arduino.org

Visualizza risultati

Loading ... Loading ...
Seguimi su Twitter