LED RGB

Realizzare il seguente circuito:

Il LED RGB produce un colore ottenuto dalla combinazione delle intensità luminose delle componenti RGB prodotte da 3 led racchiusi nello stesso involucro.

Partendo dalla parte piatta del bordo inferiore dell'involucro del LED i piedini sono disposti nella sequenza: RED, COMMON, GREEN, BLUE.

PWM

Arduino è in grado di leggere valori di tensione (d.d.p. tra 0 e 5 Volt) usando la funzione analogRead(). In alcuni casi serve l'operazione inversa, cioè emettere un valore di tensione. Arduino non è dotato del convertitore Digitale Analogico, ma ricorrendo alla tecnica di modulazione in larghezza degli impulsi (PWM: Pulse Width Modulation) si può ottenere un risultato equivalente. La tecnica PWM fa variare la durata High di una forma d'onda di elevata frequenza, per cui sul piedino digitale di output si può misurare una tensione che corrisponde alla media ponderata tra la durata del livello High e la durata del livello Low. Essendo il livello Low uguale a 0V, la media ponderata della d.d.p. risulta essere uguale alla frazione della durata del livello High rispetto al periodo della forma d'onda.

La generazione di un valore di tensione è richiesta perchè le componenti RGB possono essere variate per ottenere 256 diverse gradazioni di ciascuna componente e quindi generare 16 milioni di colori.

Programma.

La variabile DISPLAY_TIME controlla la rapidità di esecuzione del ciclo, influendo quindi sul colore risultante

Considerando che ogni LED può trovarsi acceso o spento, i tre LED (red, green, blue) possono assumere otto configurazioni. Si possono così ottenere 8 colori (compreso il nero). La funzione mainColors() produce gli 8 colori.

Per generare più di 8 colori si deve variare la luminosità dei singoli LED, cioè bisogna variare la durata in cui il LED resta acceso e la durata in cui il LED resta spento. La funzione analogWrite() consente di variare la durata di accensione del LED in 255 intervalli. La funzione showSpectrum() genera tutti i colori.

La funzione showSpectrum() richiama la funzione showRGB(). La funzione showRGB() mostra un singolo colore del LED. Viene richiamata passando un numero come parametro. La funzione showSpectrum() produce tutti i colori del LED facendo assumere ad una variabile intera tutti i valori compresi tra 0 e 255 e passando ciascuno di questi valori alla funzione showRGB() per mostrare il colore.


    const int RED_PIN = 9;
    const int GREEN_PIN = 10;
    const int BLUE_PIN = 11;
    int DISPLAY_TIME = 100;  // In millisecondi
    void setup() {
      pinMode(RED_PIN, OUTPUT);
      pinMode(GREEN_PIN, OUTPUT);
      pinMode(BLUE_PIN, OUTPUT);
    }
    void loop() {
      mainColors();
      showSpectrum();
    }
    void mainColors() {
      // vengono spenti tutti i LED:
      digitalWrite(RED_PIN, LOW);
      digitalWrite(GREEN_PIN, LOW);
      digitalWrite(BLUE_PIN, LOW);
      delay(1000);
      // Si accende il LED rosso
      digitalWrite(RED_PIN, HIGH);
      digitalWrite(GREEN_PIN, LOW);
      digitalWrite(BLUE_PIN, LOW);
      delay(1000);
      // Si accende il LED verde
      digitalWrite(RED_PIN, LOW);
      digitalWrite(GREEN_PIN, HIGH);
      digitalWrite(BLUE_PIN, LOW);
      delay(1000);
      // Si accende il LED Blu
      digitalWrite(RED_PIN, LOW);
      digitalWrite(GREEN_PIN, LOW);
      digitalWrite(BLUE_PIN, HIGH);
      delay(1000);
      // Si accende il LED Giallo:
      digitalWrite(RED_PIN, HIGH);
      digitalWrite(GREEN_PIN, HIGH);
      digitalWrite(BLUE_PIN, LOW);
      delay(1000);
      // Si accende l'azzurro
      digitalWrite(RED_PIN, LOW);
      digitalWrite(GREEN_PIN, HIGH);
      digitalWrite(BLUE_PIN, HIGH);
      delay(1000);
      // Si accende il viola
      digitalWrite(RED_PIN, HIGH);
      digitalWrite(GREEN_PIN, LOW);
      digitalWrite(BLUE_PIN, HIGH);
      delay(1000);
      // Si accende il bianco
      digitalWrite(RED_PIN, HIGH);
      digitalWrite(GREEN_PIN, HIGH);
      digitalWrite(BLUE_PIN, HIGH);
      delay(1000);
    }
    void showSpectrum() {
      int x;
      for (x = 0; x < 768; x++) {
        showRGB(x);
        delay(10);
      }
    }
    void showRGB(int color) {
      int redIntensity;
      int greenIntensity;
      int blueIntensity;
      if (color <= 255) {         // zona 1
        redIntensity = 255 - color;    // il rosso passa da acceso a spento
        greenIntensity = color;        // il rosso passa da spento ad acceso
        blueIntensity = 0;             // il blu è sempre spento
      }
      else if (color <= 511) {    // zona 2
        redIntensity = 0;                     // il rosso è sempre spento
        greenIntensity = 255 - (color - 256); // il verde passa da acceso a spento
        blueIntensity = (color - 256);        // il blu passa da spento ad acceso
      }
      else {    // zona 3
        redIntensity = (color - 512);         // il rosso passa da spento ad acceso
        greenIntensity = 0;                   // il verde resta sempre spento
        blueIntensity = 255 - (color - 512);  // il blu passa da acceso a spento
      }
      analogWrite(RED_PIN, redIntensity);
      analogWrite(BLUE_PIN, blueIntensity);
      analogWrite(GREEN_PIN, greenIntensity);
    }