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.