Digitale RGB ledstrip met 144-leds

De afgelopen jaren zijn er vele soorten RGB ledstrips op de markt verschenen, de meeste zijn SMD 5050 leds die 4 draden gebruiken. Voor elke kleur één aangevuld met ground. Deze strips kunnen slechts 1 kleur aannemen en worden veelal bestuurd met een infrarood afstandbediening. In Nederland betaal je voor deze ouderwetse 5 meter 300-leds strip tussen de 25-30 euro, o.a. bij diverse “dagaanbieding” websites maar ook gewoon bij de Action.

Die tijd is voorbij! Deze ledstrip met WS2812B leds is digitaal gestuurd, elke van de 144 leds kan je een andere kleur geven. In plaats van 144 leds op 1 meter kan je bijvoorbeeld ook kiezen voor 300 leds op 5 meter. De strip is naar keuze “waterdicht” te bestellen, let hierbij op dat de uiteinden niet 100% waterdicht zijn.

Ik heb gekozen voor een witte waterdichte 144-leds ledstrip van een meter. Hiervoor betaalde ik € 16,50 incl. verzendkosten.

In dit artikel laat ik zien hoe je de strip kan testen, later zal ik aanvullende artikelen plaatsen over hoe je zelf leuke interactieve dingen kan doen met de ledstrip.

De demo zoals te zien in het filmpje kan je zelf uitvoeren bij Stap 8

Benodigdheden

  1. Begin met het controleren van je voeding. De verpakking van de ledstrip maakt het heel duidelijk, je voeding mag niet meer dan 5V geven. Dus als je twijfelt, koop dan een voeding bij dezelfde leverancier als de ledstrip. Mocht je meerdere ledstrips willen combineren zal je al snel bij een zwaardere voeding uitkomen, hier een voorbeeld: 5V 70A 350W voeding.
  2. Sluit de twee losse draden aan de spanningsbron. Evt. netjes met behulp van losse DC-Jacks, dan kan je het ook makkelijk weer losmaken en de voeding voor andere projecten gebruiken.

    Er komen 5 draden uit, waarvan 2 dubbele voor de voeding.
  3. Doe een krimpkous (of kroonsteen) om de twee losse draden aan het andere eind van de strip. Dit is om kortsluiting te voorkomen.
  4. Sluit vanaf de JST stekker, de groene (DIN) en witte (GND) conform tekening aan op de Arduino. Dit kan met de meegeleverde JST contra-stekker, of door 2 female-female jumpwires in de JST-stekker/breadboard te steken.
    DIN gaat via een 470 Ohms weerstand naar Pin 6, GND wordt gekoppeld aan de GND van de Arduino. GND staat in verbinding met de losse witte draad die je net verbonden hebt aan de voeding.
  5. Download de Adafruit Neopixel library van GitHub en plaats de uitgepakte map in je Arduino/libraries folder.
    Herstart nu Arduino IDE.
  6. Ga naar Bestand > Voorbeelden > Adafruit NeoPixel > strandtest
    Er wordt een voorbeeld sketch geopend die direct zal werken, we moeten hem nog wel een klein beetje aanpassen

    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
      #include <avr/power.h>
    #endif
    
    #define PIN 6
    
    // Parameter 1 = number of pixels in strip
    // Parameter 2 = Arduino pin number (most are valid)
    // Parameter 3 = pixel type flags, add together as needed:
    //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
    //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
    //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
    //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
    //   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
    
    // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
    // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
    // and minimize distance between Arduino and first pixel.  Avoid connecting
    // on a live circuit...if you must, connect GND first.
    
    void setup() {
      // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
      #if defined (__AVR_ATtiny85__)
        if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
      #endif
      // End of trinket special code
    
    
      strip.begin();
      strip.show(); // Initialize all pixels to 'off'
    }
    
    void loop() {
      // Some example procedures showing how to display to the pixels:
      colorWipe(strip.Color(255, 0, 0), 50); // Red
      colorWipe(strip.Color(0, 255, 0), 50); // Green
      colorWipe(strip.Color(0, 0, 255), 50); // Blue
    //colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
      // Send a theater pixel chase in...
      theaterChase(strip.Color(127, 127, 127), 50); // White
      theaterChase(strip.Color(127, 0, 0), 50); // Red
      theaterChase(strip.Color(0, 0, 127), 50); // Blue
    
      rainbow(20);
      rainbowCycle(20);
      theaterChaseRainbow(50);
    }
    
    // Fill the dots one after the other with a color
    void colorWipe(uint32_t c, uint8_t wait) {
      for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, c);
        strip.show();
        delay(wait);
      }
    }
    
    void rainbow(uint8_t wait) {
      uint16_t i, j;
    
      for(j=0; j<256; j++) {
        for(i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, Wheel((i+j) & 255));
        }
        strip.show();
        delay(wait);
      }
    }
    
    // Slightly different, this makes the rainbow equally distributed throughout
    void rainbowCycle(uint8_t wait) {
      uint16_t i, j;
    
      for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
        for(i=0; i< strip.numPixels(); i++) {
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        }
        strip.show();
        delay(wait);
      }
    }
    
    //Theatre-style crawling lights.
    void theaterChase(uint32_t c, uint8_t wait) {
      for (int j=0; j<10; j++) {  //do 10 cycles of chasing
        for (int q=0; q < 3; q++) {
          for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
            strip.setPixelColor(i+q, c);    //turn every third pixel on
          }
          strip.show();
    
          delay(wait);
    
          for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
            strip.setPixelColor(i+q, 0);        //turn every third pixel off
          }
        }
      }
    }
    
    //Theatre-style crawling lights with rainbow effect
    void theaterChaseRainbow(uint8_t wait) {
      for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
        for (int q=0; q < 3; q++) {
          for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
            strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
          }
          strip.show();
    
          delay(wait);
    
          for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
            strip.setPixelColor(i+q, 0);        //turn every third pixel off
          }
        }
      }
    }
    
    // Input a value 0 to 255 to get a color value.
    // The colours are a transition r - g - b - back to r.
    uint32_t Wheel(byte WheelPos) {
      WheelPos = 255 - WheelPos;
      if(WheelPos < 85) {
        return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
      }
      if(WheelPos < 170) {
        WheelPos -= 85;
        return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
      }
      WheelPos -= 170;
      return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
    }
  7. Ga naar regel 16 en pas het aantal leds (nu 60) aan naar de ledstrip die jij gekocht hebt. Voor mijn strip dus 144.De overige parameters staan al goed voor de WS2812 leds.
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(144, PIN, NEO_GRB + NEO_KHZ800);

  8. Optioneel: Een andere library die ook leuke voorbeelden heeft is FastLED.
    Download de zip van GitHub en pak ook deze uit in de libraries folder.
    Open op soortgelijke wijze als bij stap 6, de DemoReel100 voorbeeld sketch van FastLED.
    Dit is de demo die je ziet in het filmpje bovenaan.Pas onderstaande waarde aan. Data (DIN) op Pin 6, WS2812 en 144 leds op de strip

    #define DATA_PIN    6
    //#define CLK_PIN   4
    #define LED_TYPE    WS2812
    #define COLOR_ORDER GRB
    #define NUM_LEDS    144
    CRGB leds[NUM_LEDS];