zurück

APA106 RGB-LEDs ("NeoPixel")

Alternativ zu den WS2812B-Modulen, die meinst als SMD-Bauteil bekannt sind, gibt es auch einzelne "through-hole" RGB-LEDs (hier in 8mm-Ausführung), die man mit dem Arduino genauso wie die Neopixel-Module anprechen kann.

Einzelne APA106 RGB-LEDs (8mm)
Abb.: Einzelne APA106 RGB-LEDs (8mm)

Anschlüsse

Pinout der APA106 RGB-LED
Abb.: Pinout der APA106 RGB-LED
Pin-Nummer Pin Erklärung
1 GND Masseanschluss
2 DO / DOUT "Data Out": Datenausgangsignal (kann mit DIN der nächsten APA106-LED verbunden werden)
3 VDD Stromversorgung mit +4,5V bis +6V
4 DIN "Data In": Dateneingangsignal (wird mit dem Mikrocontroller verbunden)

Verwendete Bauteile

Aufbau

siehe: RGB-LED-Modul WS2812B

Sketches

Einfacher Farb-Test

Der folgende Sketch demonstriert das Durchwechseln der Grundfarben des LED-Moduls nacheinander. Zur Ansteuerung des RGB-Moduls wird die freie Library Adafruit_NeoPixel verwendet. Zu beachten ist, dass beim Erstellen des Adafruit_NeoPixel Objektes die Konstante NEO_RGB verwendet wird, damit die richtige Farbreihenfolge der LED eingehalten wird. Evtl. kann sich dies von Modul zu Modul unterscheiden und muss ausprobiert werden.

#include <Adafruit_NeoPixel.h>

#define LED_PIN    9  // or any other PWM capable pin
#define LED_AMOUNT 2

#define BRIGHTNESS 50   // [1..255]
#define DEMO_DELAY 1000 // in milliseconds

Adafruit_NeoPixel apaLeds = Adafruit_NeoPixel(LED_AMOUNT, LED_PIN, NEO_RGB + NEO_KHZ800);

void setup()
{
    apaLeds.begin();
}

void loop()
{
    for (byte i = 0; i < LED_AMOUNT; i++) {
        apaLeds.setPixelColor(i, apaLeds.Color(0, 0, 0));
        apaLeds.show();
        delay(DEMO_DELAY);

        apaLeds.setPixelColor(i, apaLeds.Color(BRIGHTNESS, 0, 0));
        apaLeds.show();
        delay(DEMO_DELAY);

        apaLeds.setPixelColor(i, apaLeds.Color(0, BRIGHTNESS, 0));
        apaLeds.show();
        delay(DEMO_DELAY);

        apaLeds.setPixelColor(i, apaLeds.Color(0, 0, BRIGHTNESS));
        apaLeds.show();
        delay(DEMO_DELAY);
    }
}
Aufbau der Schaltung auf dem Breadboard
Abb.: Aufbau der Schaltung auf dem Breadboard

Langsamer Farbwechsel

Die ursprüngliche Quelle des folgenden Sketches stammt von /lucadentella/apa106_led_tutorial und wurde von mir geringfügig angepasst, dass hier zwei 8mm APA106-LEDs angesteuert werden. Resultat ist ein sehr langsam wechseln der möglichen Farben der APA106-LEDs, die man z.B. als Stimmungslicht verwenden könnte.

#include <Adafruit_NeoPixel.h>

#define LED_PIN   9
#define NUMPIXELS 2
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, LED_PIN, NEO_RGB + NEO_KHZ800);

void setup()
{
    pixels.begin();
}

void loop()
{
    // hue from 0 to 360 degrees
    for (int hue = 0; hue < 360; hue++) {
        // saturation and value = 1
        setLedColorHSV(hue, 1, 1);
        delay(500);
    }
}

// thanks to http://forum.arduino.cc/index.php?topic=307655.5
void setLedColorHSV(int h, double s, double v)
{
    double r = 0;
    double g = 0;
    double b = 0;
    double hf = h / 60.0;

    int i = (int)floor(h / 60.0);
    double f = h / 60.0 - i;
    double pv = v * (1 - s);
    double qv = v * (1 - s * f);
    double tv = v * (1 - s * (1 - f));

    switch (i) {
        case 0:
            r = v;
            g = tv;
            b = pv;
            break;
        case 1:
            r = qv;
            g = v;
            b = pv;
            break;
        case 2:
            r = pv;
            g = v;
            b = tv;
            break;
        case 3:
            r = pv;
            g = qv;
            b = v;
            break;
        case 4:
            r = tv;
            g = pv;
            b = v;
            break;
        case 5:
            r = v;
            g = pv;
            b = qv;
            break;
    }

    //set each component to a integer value between 0 and 255
    int red = constrain((int)255 * r, 0, 255);
    int green = constrain((int)255 * g, 0, 255);
    int blue = constrain((int)255 * b, 0, 255);

    for (byte pixel = 0; pixel < NUMPIXELS; pixel++) {
        pixels.setPixelColor(pixel, pixels.Color(red, green, blue));
    }
    pixels.show();
}