Erik heeft een bijzonder lab voorbereid…

Lab – RGB LED-fade en Rainbow LED

Voorkennis

We gebruiken onder andere een Arduino Nano op een breadbord. Als je dit nog niet hebt, staat hier hoe het moet: https://junioriot.nl/headers-op-arduino-nano-solderen/

Wat heb je nodig

  • Arduino Nano met headers
  • Breadbord
  • RGB-LED
  • 1 pinnetje-gaatje jumper kabel
  • USB-aansluitkabel

De componenten aansluiten

Zet de Arduino op het breadbord.  Houd de RGB-led zo dat het langste pootje de tweede is, en buig dit pootje naar achter zoals in onderstaande afbeelding.
Plug dan het eerste pootje in bij D11, het derde pootje bij D10, en het vierde pootje bij D9. Sluit het tweede pootje aan op de 3 volt met de jumper-kabel.
En sluit natuurlijk je Arduino aan op de computer via USB.

(Het is belangrijk dat je echt deze poorten gebruikt, niet alle poorten hebben de PWM functie die we nodig hebben. Zie eventueel: https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/ )

 De code: RGB-fade

Open in de Arduino-software het fade-voorbeeld: Bestand -> voorbeelden -> basics -> fade

Dit voorbeeld is bedoeld voor een gewoon ledje, deze gaat we aanpassen voor de RGB-led.

Je kunt eerst je scherm ‘schoonmaken’ door de tekst van /* tot en met */ weg te halen.

Er staat 3 Volt op het tweede pinnetje van de RGD-led. We beginnen met de andere pinnetjes ook een ‘hoog-signaal’ te geven, zodat de led eerst helemaal uitstaat. Vervang de code onder setup door:

  analogWrite(11, 255);    // ROOD
  analogWrite(10, 255);     // GROEN
  analogWrite(9, 255);     // BLAUW

We werken nu met analogWrite in plaats van de digitale versie, omdat we willen gaan faden (langzaam steeds meer aan- en uitzetten). analogWrite geeft een voltage tussen 0 volt bij waarde 0 en 3 volt bij waarde 255.

Je kunt de code nu uploaden naar de Arduino. Als het goed is gaat de blauw van de RGB langzaam aan en uit!

Hoe kun je deze kleur veranderen in rood? En groen?

(Als je Engels kunt) Snap je hoe de code werkt? Een tip hierbij is dat || staat voor ‘logical OR’ , maar je kunt ook gewoon “OF” zeggen.

De code: RGB-rainbow-fade

Voor de regenboog versie moeten we niet één, maar drie kleuren aansturen. We maken daarom voor elke kleur een aparte brightness- en fadeAmount-variabele aan. Pak de code van de RGD-fade van zonet, en vervang het allereerste stuk (nog voor setup) door:

  int brightness_R = 0;    // how bright the LED is
  int brightness_G = 85;
  int brightness_B = 170;

  int fadeAmount_R = 5;    // how many points to fade the LED by
  int fadeAmount_G = 5;
  int fadeAmount_B = 5;

 

Je ziet dat de drie brightness-variabelen met een verschillend getal beginnen. Op deze manier krijg je mooi verschillende kleuren doordat de rood, groen en blauw door elkaar heen lopen. (Anders gaan de drie kleuren allemaal tegelijk langzaam aan en weer langzaam uit).

De code onder setup blijft hetzelfde (is op dit moment eigenlijk overbodig, maar kun je wel handig aan zien welke poort bij welke kleur hoort)

Onder de loop gaan we nu voor elke stap, behalve de delay, ook drie kleuren besturen in plaats van één.

Vervang de regel code onder   // set the brightness of pin 9   door:

  analogWrite(11, brightness_R);
  analogWrite(10, brightness_G);
  analogWrite(9, brightness_B);

Vervang de regel code onder  // change the brightness for next time through the loop  door:

  brightness_R = brightness_R + fadeAmount_R;
  brightness_G = brightness_G + fadeAmount_G;
  brightness_B = brightness_B + fadeAmount_B;

En vervang het gehele if-statement onder  // reverse the direction of the fading at the ends of the fade  door:

  if (brightness_R <= 0 || brightness_R >= 255) {
    fadeAmount_R = -fadeAmount_R;
  }

  if (brightness_G <= 0 || brightness_G >= 255) {
    fadeAmount_G = -fadeAmount_G;
  }

  if (brightness_B <= 0 || brightness_B >= 255) {
    fadeAmount_B = -fadeAmount_B;
  }

Uploaden naar de Arduino en je hebt een RGB-rainbow-fade!!

 

RGB-rainbow-fade met nog meer kleuren

Voor nog meer kleurencombinaties kun je de drie kleuren ongelijke fadeAmounts geven.

Toen ik dit probeerde gaf het flikkeringen in het licht, ik denk doordat de brightness soms onder nul en boven 255 uitkwam. Heb dit opgelost met een beetje extra code.
Je kunt onderstaande code helemaal in de Arduino-software plakken voor de werkende rainbow-fade met nog meer kleuren!

  int brightness_1 = 0;    // how bright the LED is
  int brightness_2 = 125;
  int brightness_3 = 255;

  int fadeAmount_1 = 5;    // how many points to fade the LED by
  int fadeAmount_2 = 6;
  int fadeAmount_3 = 7;    // Interessante vraag: Na hoeveel (milli)seconden is de LED weer in de staat waarin hij begon?

  void setup() {
    analogWrite(11, 255);    // ROOD
    analogWrite(10, 255);     // GROEN
    analogWrite(9, 255);     // BLAUW
  }

  void loop() {
    analogWrite(9, brightness_1);
    analogWrite(10, brightness_2);
    analogWrite(11, brightness_3);

    brightness_1 = brightness_1 + fadeAmount_1;
    brightness_2 = brightness_2 + fadeAmount_2;
    brightness_3 = brightness_3 + fadeAmount_3;

    // reverse the direction of the fading at the ends of the fade:
    if (brightness_1 <= 0 || brightness_1 >= 255) {
      fadeAmount_1 = -fadeAmount_1;
    }

    if (brightness_2 <= 0 || brightness_2 >= 255) {
      fadeAmount_2 = -fadeAmount_2;
    }

    if (brightness_3 <= 0 || brightness_3 >= 255) {
      fadeAmount_3 = -fadeAmount_3;
    }
    // Ik kreeg flikkeringen bij ongelijke fadeamounts i.c.m. langere delay. Denk dat het komt door waarden voor
    // brightness < 0 of > 255. Daarom:
    // (Onderstaande kan denk ik handiger in een for-loop met een array. Misschien iets voor een volgende les of revisie)
    
    if (brightness_1 < 0) {
      brightness_1 = 0; 
    } 
    if (brightness_1 > 255) {
      brightness_1 = 255;
    }

    if (brightness_2 < 0) {
      brightness_2 = 0;
    }

    if (brightness_2 > 255) {
      brightness_2 = 255;
    }

    if (brightness_3 < 0) {
      brightness_3 = 0;
    }

    if (brightness_3 > 255) {
      brightness_3 = 255;
    }

    delay(70);
  }

Voor de wiskundig aangelegde enthousiastelingen

Ik vroeg mezelf af hoelang het bij de rainbow-fade met nog meer kleuren (ongelijke fadeamounts) zou duren voordat hij weer precies hetzelfde ging doen als waarmee hij begon. (Eén hele periode zoals dat in de wiskunde heet). Ik kwam op het volgende:

Waarbij ik me daarna nog realiseerde dat in één cyclus, zoals ik het in de berekeningen genoemd heb, eigenlijk twee keer zo lang is: van 0 naar 255 EN weer terug. Waardoor de tijd van een periode niet 96 minuten maar zelfs het dubbele wordt!