Arduino: lampada rgb a Led

I led sono senza dubbio un mondo affascinante ed Arduino ci permette di giocare con loro in modo sempre più semplice e fantasioso, realizzando magnifici effetti con pochi componenti e un po’ di pasienza.

Led RGB con Arduino

Qualche settimana fa mi sono imbattutto in alcuni messaggi presenti sui Forum di Arduino e non solo in cui altri appassionati raccontavano di aver acquistato dei led simili a quelli in figura, ossia dei Led RGB a catodo comune e chiedevano aiuto sul metodo con cui pilotarli e lo sketch migliore per gestirli.

Led RGB catodo comune

Ho ordinato anche io 50 led RGB su internet e la settimana scorsa mi sono stati consegnati. Ne ho acquistati 50 in quanto la confezione minima era così composta, insieme a questi led il venditore mi ha regalato anche 50 resistenze da 470Ω utili per iniziare subito ad usarli.

Per realizzare questo esempio dovrai quindi procurarti:

  1. Un Arduino 2009 o Uno
  2. Una Breadboard
  3. qualche cavetto per breadboard
  4. un led rgb 5mm
  5. una resistenza da 470Ω
  6. una striscetta di carta bianca
  7. del nastro adesivo

Collega il catodo comune al negativo di arduino mediante la resistenza di 470Ω ed i tre terminali positivi (anodo) rosso, verde e blu rispettivamente al pin 11,10 e 9 di Arduino.

Lo sketch che caricherai su Arduino è il seguente:

int pinR=11;
int pinG=10;
int pinB=9;

char buffer[7] ;
int p = 0;
byte inByte = 0;

byte valR = 0;
byte valG = 0;
byte valB = 0;

void setup() {
  pinMode(pinR, OUTPUT);
  pinMode(pinG, OUTPUT);
  pinMode(pinB, OUTPUT);

  Serial.begin(9600);
  Serial.println("Init Sketch");
}

void loop() {
    if (Serial.available() >0)
    {
      inByte = Serial.read();
      if (inByte == '#')
      {
          while (p < 6) // Accumula 6 caratteri
          {
            buffer[p] = Serial.read();
            p++;
          }

          valR=convHex2Dec(buffer[1])+convHex2Dec(buffer[0])*16;
          valG=convHex2Dec(buffer[3])+convHex2Dec(buffer[2])*16;
          valB=convHex2Dec(buffer[5])+convHex2Dec(buffer[4])*16;

          p = 0;

        }

        analogWrite(pinR,valR);
        analogWrite(pinG,valG);
        analogWrite(pinB,valB);
    }

    delay(100);              // wait for a second
}

int convHex2Dec(byte hex)
{
  if (hex >= '0' && hex <= '9') { return hex - '0'; }
  else if (hex >= 'A' && hex <= 'F') { return hex - 'A' + 10; }
}

Analizzando lo sketch:

linee 01-03: inizializza le variabili pinR,pinG,pinB con il pin a cui è collegato il rispettivo colore del led;

linea 05: imposta una variabile di tipo char di 7 byte in cui memorizza il codice esadecimale dal colore desiderato;

linea 06: inizializza un puntatore p necessario a scrivere e leggere nel buffer;

linea 07: inizializza una variabile di tipo byte in cui inserire iil valore letto dalla seriale;

linee 09-11: imposta 3 variabili di tipo byte in cui memorizare il valore elaborato dalla conversione del codice esadecimale;

linea 13: crea la funzione setup() in cui ci sono tutte le istruzioni eseguite da Arduino all’avvio dello sketch;

linee 14-16: mediante il comando pinMode definisci i pin relativi al singolo colore come output, ossia pin su cui invieremo comandi di scrittura;

linee 18-19: inizializza la comunicazione Seriale e scrive sul canale seriale il testo “Init Sketch”;

linea 22: crea la funzione loop() eseguita ciclicamente dal processore Arduino;

linea 23: controlla che salla comunicazione seriale arrivi una comunicazione, solo all’arrivo di un carattere si attiva per processarlo;

linea 25: leggi ciò che è stato inviato dal terminale seriale utilizzandolo per popolare la variabile inByte definita sopra;

linea 26: se il primo carattere che ti arriva è “#” entra nella condizione ed esegui le linee dalla 27 alla 40;

linea 28: inizia un ciclo condizionato dalla variabile p che varia il suo valore tra 0 e 6 ( 7 caratteri ) inviati dal terminale;

linea 30: assegna alla variabile buffer il valore letto dalla comunicazione seriale;

linea 31: incremente la variabile p per acumulare i successivi caratteri;

linee 34-36: sono tre linee identiche nel concetto, ma impostate singilarmente per colore, analizzando la prima vedrai che utilizza una funzione definita in seguito convHex2Dec che converte un valore esadecimale in uno decimale, la regola per la conversione la puoi trovare su molti siti, io procedo considerando che i valori esadecimali utilizzati in questo sketch sono composti da 2 cifre ciascuna può assumere un valore comtreso tra 0 e F secondo la scala: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F per cui i valori A,B,C,D,E,F sono rispettivamente 10,11,12,13,14,15,16 come li associo lo vedrai in seguito analizzando la funzione convHex2Dec in questa fase ti interessa sapere che la conversione di un numero esadecimale di 2 digit, come i nostri, in valore decimele si effettua in questo modo: [prima cifra] x 161 + [seconda cifra] x 160 ricordando che 160 è 1 per cui la formula puoi scriverla in questa forma: [prima cifra] x 16 + [seconda cifra] da cui puoi facilmente ricavare che se il valore esadecimale fosse FF potresti calcolare il suo valore decimale come: F (=15) x 16 + F (15) => 255; nello sketch per comodità ho scritto la formula come [seconda cifra] + [prima cifra]*16;

linea 38: reimposta a 0 il valore di p per consentire allo sketch di acquisire i valori successivi;

linee 42-44: utilizza il comando analogWrite() per scrivere su ciascun pin il valore convertito;

linea 47: imposta un ritardo di 100 millisecondi tra un ciclo ed il successivo, in fase di test è molto utile per non avere cambiamenti troppo repentini tra una transazione e la successiva, in fase di produzione puoi omettere questa linea;

linee 50-54: definisci la funzione di conversione da valori esadecimali a decimali, nello specifico la linea 52 verifica se il valore esadecimale è compreso tra 0 e 9 restituisce il valore senza elaborazioni, la linea 53 si occupa di trattare i valori esadecimali alfabetici compresi tra A ed F, restituendo il risultatoo della formula [valore] – ‘A’ + 10 ossia in caso il valore sia A ottieni il risultato A-A+10 = 10-10+10 = 10, se il valore è F il risultato è F-A+10 = 15-10+10 = 15

Come funziona lo sketch?

Semplice caricalo su Arduino, apri il monitor seriale e digita il valore esadecimale di 6 digit preceduto da #, per chi non addentro al mondo della programmazione Html il formato descritto è quello preferito dal web per indicare le notazioni di colore: #RRGGBB dove RR,GG e BB sono codici esadecimali da 00 a FF per ciascuna componente delle 3 (RGB) che compongono i colori realizzabili sul monitor, ed in questo esempio per pilotare il led RGB.

Io ho fotografato il mio esperimento avvolgendo una striscetta di carta su di una matita e coprendo poi il mio led, il risultato è il seguente:

Led RGB spento (#000000)

Led RGB spento (#000000)

Led RGB acceso rosso (#ff0000)

Led RGB acceso rosso (#ff0000)

Led RGB acceso verde (#00ff00)

Led RGB acceso verde (#00ff00)

Led RGB acceso blu (#0000ff)

Led RGB acceso blu (#0000ff)

Led RGB accesi tutti i led, risulta bianco (#ffffff)

Led RGB accesi tutti i led, risulta bianco (#ffffff)

Su internet ci sono migliaia di tabelle colore rgb che riportano i colori possibili, come ad esempio questa o tool simili a quelli utilizzati nei programmi di Grafica.


Buon divertimento.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/arduino-lampada-rgb-a-led.html

Lascia un commento

Your email address will not be published.

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