Come usare Arduino per pilotare strip led RGB
La tecnologia di illuminazione a 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 (vedi progetto di lampada di cortesia a led).
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 molto interessanti 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 (LED Rosso, LED Verde, LED Blu) disposti in modo da poter interagire tra loro per formare diversi colori complementari.
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 perché sono già integrate nel circuito.
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.
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.
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); } }
Il codice precedente permette di accendere o spegnere i led inviando tramite serial monitor dei caratteri di comando. L’effetto che otteniamo è una miscelazione dei colori.
Un maggior controllo dei led RGB possiamo ottenerlo utilizzando il segnale PWM generato da Arduino. In questo modo abbiamo la possibilità di creare dissolvenze per creare combinazioni di colori visivamente più interessanti.
Il codice seguente permette di accendere e spegnere il led BLU in modo graduale tramite una dissolvenza:
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); } }
Se volessi miscelare i colori potrei scrivere qualcosa del genere
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); } }
Le combinazioni che possiamo creare sono innumerevoli, potete provare a sperimentare creando effetti luminosi che possono abbellire i vostri ambienti.
Related posts
43 Comments
Lascia un commento Annulla risposta
Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
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