Falls jemand andere LED-Stripes als die APA101 oder 2801 für das Ambilight mit Hyperion am Pi verwenden möchte, kann dies meist auch tun. Hier ist allerdings noch etwas mehr Hardware und Aufwand notwendig. Dafür kommt man bei der Anschaffung der LEDs meist günstiger weg.

Prinzipiell sind mit der folgenden Vorgehensweise alle LEDs die zur FastLED Library kompatibel sind nutzbar.
Dazu gehören z.B.:
• Adafruit’s Neopixel / WS2812B / WS2811 / WS2812
• TM1809/4
• TM1803
• UCS1903
• GW6205

 

Zusätzlich zu den LEDs, dem Raspberry Pi und allem anderen was in der Hauptanleitung bereits erwähnt wird, benötigt Ihr noch einen Arduino Uno R3. Dieser übernimmt die Ansteuerung der LEDs. Der Arduino wird einfach per USB an den Raspberry angeschlossen und erhält über SPI seine benötigten Befehle.

 

Verkabelung

Die WS2812B haben nur 3 Pole im Gegensatz zu den anderen im Tutorial angegebenen Stripes. Hier gibt es nur einen 5V, einen GND und einen Data-Pin. der 5V Pin der Stripe wird direkt mit dem Netzteil verbunden. Der GND-Pin der Stripes muss sowohl mit dem Netzteil als auch mit dem GND des Arduino verbunden sein. Der Data-Pin geht an den im Sketch hinterlegten Data-Pin (Standard wäre Pin 6).
Dann muss später der Arduino nur noch per USB mit dem Raspberry Pi verbunden werden.

 

SerialPort Buffer vergrößern

Zuerst müsst Ihr nun die SerialPort Buffer Größe heraufsetzen. Dazu sucht Ihr den Ordner der Arduino-Software. Darin sollte sich folgende Ordnerstruktur wiederfinden:
ARDUINO_SOFTWARE\hardware\arduino\avr\cores\arduino
Von diesem Ordner erstellt Ihr eine Kopie (z.B. ARDUINO_SOFTWARE\hardware\arduino\avr\cores\arduino_256_buffer)

In dem kopierten Ordner bearbeitet Ihr nun die Datei „USBAPI.h“ und ändert die Zeile „#define SERIAL_BUFFER_SIZE 64“ in „#define SERIAL_BUFFER_SIZE 256“.

Nun bearbeitet Ihr noch die Datei „ARDUINO_SOFTWARE\hardware\arduino\avr\boards.txt“. In dieser Datei sollte ein Block für den Arduino Uno existieren. Diesen Block kopiert Ihr, ändert den internen Namen und passt die Angabe für „build.core“ an den Namen des zu Begin kopierten Ordners an. Das ganze sollte dann wie folgt aussehen:

##############################################################

uno.name=Arduino/Genuino Uno

uno.vid.0=0x2341
uno.pid.0=0x0043
uno.vid.1=0x2341
uno.pid.1=0x0001
uno.vid.2=0x2A03
uno.pid.2=0x0043
uno.vid.3=0x2341
uno.pid.3=0x0243

uno.upload.tool=avrdude
uno.upload.protocol=arduino
uno.upload.maximum_size=32256
uno.upload.maximum_data_size=2048
uno.upload.speed=115200

uno.bootloader.tool=avrdude
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0x05
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.bootloader.file=optiboot/optiboot_atmega328.hex

uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.board=AVR_UNO
uno.build.core=arduino
uno.build.variant=standard
##############################################################
<em>
uno256.name=Arduino/Genuino Uno (256 Serial Buffer)

uno256.vid.0=0x2341
uno256.pid.0=0x0043
uno256.vid.1=0x2341
uno256.pid.1=0x0001
uno256.vid.2=0x2A03
uno256.pid.2=0x0043
uno256.vid.3=0x2341
uno256.pid.3=0x0243

uno256.upload.tool=avrdude
uno256.upload.protocol=arduino
uno256.upload.maximum_size=32256
uno256.upload.maximum_data_size=2048
uno256.upload.speed=115200

uno256.bootloader.tool=avrdude
uno256.bootloader.low_fuses=0xFF
uno256.bootloader.high_fuses=0xDE
uno256.bootloader.extended_fuses=0x05
uno256.bootloader.unlock_bits=0x3F
uno256.bootloader.lock_bits=0x0F
uno256.bootloader.file=optiboot/optiboot_atmega328.hex

uno256.build.mcu=atmega328p
uno256.build.f_cpu=16000000L
uno256.build.board=AVR_UNO
uno256.build.core=arduino_256_buffer
uno256.build.variant=standard</em>
##############################################################

 

Arduino Sketch

Spielt nun das folgende Sketch auf euren Arduino, wählt hierbei das neue Board mit dem erweiterten Buffer aus.

#include "FastLED.h"

// How many leds in your strip?
#define NUM_LEDS 60

// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 6
#define CLOCK_PIN 13

#define COLOR_ORDER GRB

// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;

// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 115200

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
      // Uncomment/edit one of the following lines for your leds arrangement.
      // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
         FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);
      
      // FastLED.addLeds<WS2801, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, RGB>(leds, NUM_LEDS);

      // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      
        // initial RGB flash
        LEDS.showColor(CRGB(255, 0, 0));
        delay(500);
        LEDS.showColor(CRGB(0, 255, 0));
        delay(500);
        LEDS.showColor(CRGB(0, 0, 255));
        delay(500);
        LEDS.showColor(CRGB(0, 0, 0));
        
        Serial.begin(serialRate);
        Serial.print("Ada\n"); // Send "Magic Word" string to host

}

void loop() { 
  // wait for first byte of Magic Word
  for(i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) ;;
    // Check next byte in Magic Word
    if(prefix[i] == Serial.read()) continue;
    // otherwise, start over
    i = 0;
    goto waitLoop;
  }
  
  // Hi, Lo, Checksum
  
  while (!Serial.available()) ;;
  hi=Serial.read();
  while (!Serial.available()) ;;
  lo=Serial.read();
  while (!Serial.available()) ;;
  chk=Serial.read();
  
  // if checksum does not match go back to wait
  if (chk != (hi ^ lo ^ 0x55))
  {
    i=0;
    goto waitLoop;
  }
  
  memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
  // read the transmission data and set LED values
  for (uint8_t i = 0; i < NUM_LEDS; i++) {
    byte r, g, b;    
    while(!Serial.available());
    r = Serial.read();
    while(!Serial.available());
    g = Serial.read();
    while(!Serial.available());
    b = Serial.read();
    leds[i].r = r;
    leds[i].g = g;
    leds[i].b = b;
  }
  // shows new values
 FastLED.show();
}

 

Hyperion auf Raspberry Pi einrichten

Installiert nun Hyperion auf dem Pi wie in der Hauptanleitung beschrieben:
https://smarthomeyourself.de/anleitung-zum-selber-bauen/unabhaengige-projekte/ambilight-mit-raspberry-pi-und-hyperion

 

Folgenden Punkte  müsst Ihr anschließend noch anpassen, damit das ganze auch mit den LEDs am Arduino funktioniert:

HyperCon Einstellungen

Bei den LED-Einstellungen müsst Ihr nun anstatt eurer LEDs „adalight“ auswählen.
Als output war der Arduino bei mir „/dev/ttyUSB0“. (müsst Ihr ggf. mit „ls /dev“ am Pi prüfen, welches Device hinzu kommt, wenn Ihr den Arduino anschließt)
Als Baud-Rate habe ich 115200 verwendet. Delay 0 und colorOrder GRB.

Der Eintrag sollte dann wie folgt aussehen:

"device" :
{
"name" : "MyHyperionConfig",
"type" : "adalight",
"output" : "/dev/ttyUSB0",
"rate" : 115200,
"delayAfterConnect" : 0,
"colorOrder" : "grb"
},

 

UART-Clock

Jetzt solltet Ihr noch die UART-Clock des Pi umstellen. Dazu steckt ihr die SD-Karte in euren Kartenleser und bearbeitet die Datei config.txt. In dieser Datei fügt Ihr am Ende folgende Zeile ein:

init_uart_clock=14745600

Speichert die Änderungen und startet den Pi nun mit der modifizierten SD-Karte neu.

 

Nun sollte das ganze auch mit den alternativen WS2812B laufen.


Bei Links auf Amazon-Artikel handelt es sich um Affiliate-Links. In diesen Links wird meine Amazon-Partner-Id mit übergeben, wodurch ich eine kleine Provision für eure Käufe erhalte. Ihr zahlt natürlich das gleiche wie sonst auch.
Ich würde mich freuen, wenn Ihr bei eurer Bestellung die Links verwendet und mich so einfach und für euch kostenlos unterstützt, um weiterhin neue Projekte mit euch teilen zu können.

Vielen Dank für euer Verständnis und eure Unterstützung!


Daniel Scheidler

Da mein Vater bereits in der IT tätig war, wurde auch mein Interesse für diesen Bereich sehr früh geweckt. Mit 13 bekam ich meinen ersten Laptop mit dem ich den Einstieg in die Programmierung begann. (Das Codes abtippen am C64 lasse ich mal aussen vor) Und so nahm alles seinen lauf.

Im Jahr 2004 schloss ich meine Ausbildung als Fachinformatiker Fachrichtung Anwendungsentwicklung ab und bin seit dem als Java Fullstack Entwickler tätig. Damals noch im ERP Umfeld, heute im Medizinischen Bereich.

Auch meine Freizeit „opfere“ ich gerne der Technik. Hier widme ich mich sämtlichen Themen rund um Arduino, Raspberry, 3D Druck/Design, RC-Modellbau (Multicopter, Heli, Flugzeug, Autos) und anderen Handwerklichen Projekten.

Mit der Kernsanierung des Altbaus entstand die Idee, das Haus auf ein SmartHome umzurüsten. Nach dem Kostenvoranschlag des Elektrikers wurde schnell klar, dass ich hier selber ran muss, wenns bezahlbar bleiben soll.

In der Hoffnung weitere kreative Leute zu finden, die sich an dem Vorhaben beteiligen oder es einfach nur nachbauen möchten dokumentierte ich alles und stellte alle Quelltexte incl. Anleitungen online.

Und so entstand SmartHomeYourself.de.

Diese Webseite verwendet Cookies, um die Nutzung der Seite zu verbessern, den Erfolg von Werbemaßnahmen zu messen und interessengerechte Werbung anzuzeigen.
Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen.

Wenn Sie diese Website ohne Änderung der Cookie-Einstellungen verwenden oder auf "Akzeptieren" klicken, erklären Sie sich damit einverstanden.

Weitere Informationen zu den verwendeten Cookies und unseren Datenschutzbestimmungen finden Sie in unseren Datenschutzbestimmungen.

Schließen