[INDENT]Ich möchte euch mein Ambilight Tutorial vorstellen!
ACHTUNG: DIE Anleitung ist noch im Aufbau! Sie ist daher in teilen noch sehr unvollständig. Es ist ein "Einblick". Könnt ja eure Meinung äußern, was euch fehlt und was noch verbessert werden sollte
Keine Sorge, es kommt der Tag an dem diese Anleitung vollständig ist
Da dieser Beitrag länger wird, werde ich den ganzen Beitrag in Unterpunkte in einem Inhaltsverzeichnis eintragen. Finde ich übersichtlicher so..
Inhaltsverzeichnis:
- Vorwort
- Verwendete Hardware (inkl. Erklärung wofür welches Bauteil benötigt wird.)
- Der Allgemeine Aufbau (Theoretischer Aufbau der Hardware)
- Vorbereitung Software
- Vorbereitung Hardware
-
Vorwort:
Hallo,
In diesem Artikel, möchte ich euch zeigen, wie ihr euch euer eigenes Ambilight aufbauen könnt. Dieser Beitrag handelt ausschließlich vom Bau mit LEDs vom Typ : WS2812B (siehe auch verwendete Hardware!).
Dieser Beitrag richtet sich an komplette "Einsteiger", welche sich noch nie ein Ambilight-System aufgebaut haben.
Ich gehe aber davon aus, dass ihr ein wenig Grundkenntnisse im Umgang mit PC`s habt.
Somit, sollte sich jeder, der die Anleitung nur 1x gründlich gelesen hat in der Lage, sich derartiges zu "basteln"
Bei Unklarheiten, einfach hier im Thread Fragen stellen. Verbesserungsfähige Kritik ist gerne gesehen
Aber nun, wünsche ich euch viel Spaß beim Schmökern
Verwendete Hardware:
In diesem Abschnitt werde ich euch nun erläutern, welche und vor allem warum ich mich für die verwendete Hardware entschieden habe. Jeder Link, ist mit Versand aus DE, somit spart man sich langes warten, bis das baslten beginnen kann :shy: ...
Die LEDs:
Es sind einzel adressierbare LEDs, dies bedeutet, dass jeder Led, eine andere Farbe zugewiesen werden kann. Das ist auch bei unserem Anwendungsfall unabdingbar. Ich habe mich explizit für Leds vom TYP : WS2812B entschieden. Es gibt andere Tutorials, welche APA102 verwenden. Ich verwende in meinem anderen Ambilight-System, auch die APA102, jedoch sind mir diese einfach zu teuer (für diese Projekt), deshalb benutze ich die WS2812B. Sie sind deutlich günstiger, ich habe für 5M je 60 LEDs/M rund 30€ bezahlt. Ich würde euch, auch zu welchen mit 60 LEDs/M raten, da meiner Meinung nach, dass Ergebnis deutlich besser ist. Dies ist aber alles subjektiv. Ein weiterer Tipp: Bestellt aus DE, um lange lieferzeiten zu vermeiden.
Hier habe ich meine her: KLICK MICH, es sind 5M, ihr müsst selbst messen wie viele Meter ihr benötigt
Der Raspberry PI:
Der Raspberry Pi, ist fast genauso wichtig wie die LEDs, er übernimmt die Steuerung der LEDs und die Auswertung der Farben von der HDMI Quelle. Es ist ziemlich egal, welche PI Generation verwendet wird. Ich benutze zum Beispiel einen "alten" RPI 1B .
Er reicht solange noch aus, wenn er nur die auswertung der Farben genommen werden soll. Wenn noch ein Mediacenter (KODI) verwendet werden soll, dann braucht man mindestens eine PI 2B oder noch besser einen PI 3B. Ich nehme den alten Pi, weil der bei mir einfach noch übrig ist und ich nur HDMI Quellen habe, deshalb brauche ich kein Mediacenter.
Das Netzteil:
Ist zuständig für die Stromversorgung. Je nach Größe des TVs bzw. Länge des LED-Stripes werden unterschiedliche Netzteile benötigt. Ich verwende ein NT, der Marke MEAN WELL. Ich habe, damit sehr gute Erfahrungen gemacht. Eines ist aber zu beachten:
Die Spannung (V) MUSS unbedingt immer 5V betragen! Da alle Komponenten AUSSCHLIEßLICH mit 5V arbeiten.
Mein Netzteil : KLICK MICH
Der Arduino Nano:
Dieses kleine Gerät ist notwendig, damit die LEDs mit dem PI zu verbinden. Der Raspberry, liefert zu schwache Signale für die LEDs, deshalb braucht man diesen Microcontroller. Man könnte theoretisch drauf verzichten, ich mache es nicht, da ich sonst nur Probleme hatte. Es gibt mehrere Versionen des Arduino. Ich benutze die Nano Version (aus Platzgründen, es wird kein größerer Arduino benötigt!). Es muss kein original Arduino sein, ich nehme aus meinem Link auch nur einen "Clone", funktioniert ohne Probleme, außerdem spart man viel Geld!
Mein Arduino : KLICK MICH
Der HDMI zu CHINCH Konverter:
Dieses Gerät wird nur benötigt, wenn ihr HDMI-Quellen betreiben wollt. Denn es wandelt eure digitalen HDMI Signale in analoge Chinch Signale um.
Passt bitte jedoch auf, nicht jeder COnverter tut seinen Dienst so wie erhofft, deshalb, kann ich nur bedingt eine Kaufempfehlung aussprechen.
Wenn er nicht richtig funktionieren sollte, schickt ihn einfach zurück.
"Mein" HDMI zu CHINCH Konverter :
Der Videograbber:
Der Videograbber ist dafür zuständig, dass die Analogen HDMI Signale in den Raspberry Pi gelangen.
WICHITG: Der Videograbber muss undbedingt den Chipsatz Fushicai UTV007 haben. Da sonst der Grabber nicht richtig erkannt wird und es Fehlermeldungen geben wird. Deshalb empfehle ich empfehle ich euch den Videograbber bei dem Link etwas weiter unten zu bestellen, dort könnt ihr nämlich sicher sein, dass ihr den richtigen erhalten werdet.
Mein Videograbber : KLICK MICH
Die Micro-SD Karte
Die SD-Karte ist unser Datenspeicher, dort wird die gesamte Software für den
Zu aller letzt:
Die Verteilung der HDMI-Signale
Entweder ein HDMI Verteiler, der aus einem HDMI-Signal zwei macht. Wird benötigt, wenn ein AV-Receiver vorhanden ist, welcher die Verteilung der HDMI - Signale übernimmt. Oder es nur gewünscht ist, nur 1 HDMI Quelle zu betreiben, dann kann auch nur der Verteiler genutzt werden.
Die HDMI Matrix, ist das Gerät, welches uns es ermöglicht, 4 verschiedene HDMI Quellen zu benutzen. Dies wird zwingend benötigt, wenn KEIN AV-Receiver vorhanden ist und mehr als 1 HDMI Quelle genutzt werden soll.
HDMI-Verteiler :
HDMI-Matrix :
Das ist jetzt die gesamte Hardware
Der Allgemeine Aufbau (Theoretischer Aufbau der Hardware):
Also, die (digitalen) HDMI-Quellen werden durch den HDMI-CHINCH adapter in ein analoges Signal umgewandelt (1 Kabel geht weiterhin zum TV!).
Somit kann der Videograbber, welcher mit dem Raspberry Pi per USB verbunden ist das Signal auslesen. Auf dem PI läuft eine Software mit dem Namen : Hyperion. Diese Software ermittelt die Farben des Signals vom Videograbber. Der Arduino wird ebenfalls per USB am Raspberry angeschlossen, der Raspberry sendet die Farbwerte an den Arduino.
Der Arduino, wandelt die Werte, die er vom Raspberry bekommt in das Format um welches die LEDs benötigen.
HDMI-Quelle -> HDMI-Verteiler / Matrix ->1. HDMI-Kabel zum TV
-> 2. HDMI-Kabel zum HDMI-CHINCH Konverter -> CHINCH-Kabel -> Videograbber -> Raspberry PI -> Arduino (USB) -> LEDs
Das Netzteil wird wie folgt verbunden (mehr dazu im Teil der Hardware Vorbereitungen!).
230V -> Netzteil -> 5V Ausgang -> Raspberry PI -> LEDs -> HDMI Matrix / Verteiler -> (ggf. HDMI-CHINCH Konverter)
-> GND Ausgang -> Raspberry PI ->LEDs -> HDMI Matrix / Verteiler -> (ggf. HDMI-CHINCH Konverter) -> Arduino (keine 5V!, NUR GND!)
Das war es nun mit der Theroie, jetzt geht es weiter mit der Vorbereitung der Software
Vorbereitung Software:
Da diese Anleitung an komplette Beginner gerichtet ist fange ich auch bei der Software von 0 an. Somit hat jeder die Möglichkeit, das Projekt zu realisieren und lernt auch noch einen großen teil.
Es beginnt damit, dass ihr euch folgende Tools herunterladen müsst. Die Links sind alle direkt download Links - ohne Bloatware oder ähnliches.
WIN32DiskImager KLICK MICH
Arduino IDE KLICK MICH
Hypercon (benötigt JAVA!) KLICK MICH
Raspbian Lite (ist eine ältere Version, da dort noch SSH standardmäßig Aktiv ist.) KLICK MICH
Ihr beginnt am besten damit, dass ihr jedes Tool (Arduino IDE, Win32DiskImager,"Java" falls noch nicht auf dem PC vorhanden) installiert. Das Raspbian ist ein ZIP Archiv, das müsst ihr an einem Ort entpacken, wo ihr es auch wiederfindet.
Der Stand bei euch müsste jetzt wie folgt sein:
WIN32DiskImager installiert ist
Arduino IDE installiert ist
Hypercon heruntergeladen ist
JAVA vorhanden ist
Raspbian Lite heruntergeladen und entpackt ist.
NUR WENN das erledigt ist, macht ihr weiter!
Wir beginnen damit, dass wir nun den Arduino Sketch auf euren NANO flasht.
ARDUINO IDE:
1. Arduino IDE Starten:
2. Nun werden die benötigten Bibliotheken installiert. Ihr geht einfach auf den Reiter "Sketch", dann zu dem Punkt Bibliotheken einbinden - dann auf den Punkt Bibliotheken verwalten drücken. Dann im Suchfeld "Fast LED" eintippen und mit ENTER bestätigt. Dann auf installieren drücken.
Siehe hier :
3. Nach Installation die Arduino IDE neustarten.
4. Nun löscht ihr bitte alles aus dem Textfeld der IDE und fügt folgenden CODE ein:
#include "FastLED.h"
#define ANALOG_MODE_AVERAGE 0
#define ANALOG_MODE_LAST_LED 1
/**************************************
S E T U P
set following values to your needs
**************************************/
#define INITIAL_LED_TEST_ENABLED true
#define INITIAL_LED_TEST_BRIGHTNESS 155//0..255
#define INITIAL_LED_TEST_TIME_MS 500 // 10..
// Number of leds in your strip. set to "1" and ANALOG_OUTPUT_ENABLED to "true" to activate analog only
// As of 26/1/2017:
// 582 leaves ZERO bytes free and this
// 410 is ok
// tested with 500 leds and is fine (despite the warning)
#define MAX_LEDS 500 // Hier wird die LED Anzahl definiert, bitte am Anfang zählen und dementsprechend ändern!
// type of your led controller, possible values, see below
#define LED_TYPE WS2812B //Nichts ändern, da wird WS2812B LEDs nutzen
// 3 wire (pwm): NEOPIXEL BTM1829 TM1812 TM1809 TM1804 TM1803 UCS1903 UCS1903B UCS1904 UCS2903 WS2812 WS2852
// S2812B SK6812 SK6822 APA106 PL9823 WS2811 WS2813 APA104 WS2811_40 GW6205 GW6205_40 LPD1886 LPD1886_8BIT
// 4 wire (spi): LPD8806 WS2801 WS2803 SM16716 P9813 APA102 SK9822 DOTSTAR
// For 3 wire led stripes line Neopixel/Ws2812, 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), both defines DATA_PIN and CLOCK_PIN are needed
// DATA_PIN, or DATA_PIN, CLOCK_PIN
#define LED_PINS 6 // 3 wire leds Dort wird der PIN angegeben, wo das Daten Signal der LEDs angeschlossen wird!
//#define LED_PINS 6, 13 // 4 wire leds (Nicht benötigt, da wir WS2812B LEDs nutzen!
#define COLOR_ORDER GRB // colororder of the stripe, set RGB in hyperion // Nichts Ändern!
#define OFF_TIMEOUT 15000 // ms to switch off after no data was received, set 0 to deactivate. Nichts Ändern!
// analog rgb uni color led stripe - using of hyperion smoothing is recommended
// ATTENTION this pin config is default for atmega328 based arduinos, others might work to
// if you have flickering analog leds this might be caused by unsynced pwm signals
// try other pins is more or less the only thing that helps
#define ANALOG_OUTPUT_ENABLED false
#define ANALOG_MODE ANALOG_MODE_LAST_LED // use ANALOG_MODE_AVERAGE or ANALOG_MODE_LAST_LED
#define ANALOG_GROUND_PIN 8 // additional ground pin to make wiring a bit easier
#define ANALOG_RED_PIN 9
#define ANALOG_GREEN_PIN 10
#define ANALOG_BLUE_PIN 11
// overall color adjustments
#define ANALOG_BRIGHTNESS_RED 255 // maximum brightness for analog 0-255
#define ANALOG_BRIGHTNESS_GREEN 255 // maximum brightness for analog 0-255
#define ANALOG_BRIGHTNESS_BLUE 255 // maximum brightness for analog 0-255
#define BRIGHTNESS 255 // maximum brightness 0-255
#define DITHER_MODE BINARY_DITHER // BINARY_DITHER or DISABLE_DITHER
#define COLOR_TEMPERATURE CRGB(255,255,255) // RGB value describing the color temperature
#define COLOR_CORRECTION TypicalLEDStrip // predefined fastled color correction
//#define COLOR_CORRECTION CRGB(255,255,255) // or RGB value describing the color correction
// Baudrate, higher rate allows faster refresh rate and more LEDs
//#define serialRate 460800 // use 115200 for ftdi based boards
//#define serialRate 115200 // use 115200 for ftdi based boards
#define serialRate 500000 // use 115200 for ftdi based boards
/**************************************
A D A L I G H T C O D E
no user changes needed
**************************************/
// 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;
unsigned long endTime;
// Define the array of leds
CRGB leds[MAX_LEDS];
// set rgb to analog led stripe
void showAnalogRGB(const CRGB& led) {
if (ANALOG_OUTPUT_ENABLED) {
byte r = map(led.r, 0,255,0,ANALOG_BRIGHTNESS_RED);
byte g = map(led.g, 0,255,0,ANALOG_BRIGHTNESS_GREEN);
byte b = map(led.b, 0,255,0,ANALOG_BRIGHTNESS_BLUE);
analogWrite(ANALOG_RED_PIN , r);
analogWrite(ANALOG_GREEN_PIN, g);
analogWrite(ANALOG_BLUE_PIN , b);
}
}
// set color to all leds
void showColor(const CRGB& led) {
#if MAX_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
LEDS.showColor(led);
#endif
showAnalogRGB(led);
}
// switch of digital and analog leds
void switchOff() {
#if MAX_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
memset(leds, 0, MAX_LEDS * sizeof(struct CRGB));
FastLED.show();
#endif
showAnalogRGB(leds[0]);
}
// function to check if serial data is available
// if timeout occured leds switch of, if configured
bool checkIncommingData() {
boolean dataAvailable = true;
while (!Serial.available()) {
if ( OFF_TIMEOUT > 0 && endTime < millis()) {
switchOff();
dataAvailable = false;
endTime = millis() + OFF_TIMEOUT;
}
}
return dataAvailable;
}
// main function that setups and runs the code
void setup() {
Serial.begin(serialRate);
// analog output
if (ANALOG_OUTPUT_ENABLED) {
// additional ground pin to make wiring a bit easier
pinMode(ANALOG_GROUND_PIN, OUTPUT);
digitalWrite(ANALOG_GROUND_PIN, LOW);
pinMode(ANALOG_BLUE_PIN , OUTPUT);
pinMode(ANALOG_RED_PIN , OUTPUT);
pinMode(ANALOG_GREEN_PIN, OUTPUT);
}
int ledCount = MAX_LEDS;
if (ANALOG_MODE == ANALOG_MODE_LAST_LED) {
ledCount--;
}
#if MAX_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
FastLED.addLeds<LED_TYPE, LED_PINS, COLOR_ORDER>(leds, ledCount);
#endif
// color adjustments
FastLED.setBrightness ( BRIGHTNESS );
FastLED.setTemperature( COLOR_TEMPERATURE );
FastLED.setCorrection ( COLOR_CORRECTION );
FastLED.setDither ( DITHER_MODE );
// initial RGB flash
#if INITIAL_LED_TEST_ENABLED == true
for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++)
{
showColor(CRGB(v,v,v));
delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS);
}
for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++)
{
showColor(CRGB(v,v,v));
delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS);
}
#endif
showColor(CRGB(0, 0, 0));
Serial.print("Ada\n"); // Send "Magic Word" string to host
boolean transmissionSuccess;
unsigned long sum_r, sum_g, sum_b;
// loop() is avoided as even that small bit of function overhead
// has a measurable impact on this code's overall throughput.
for(;;) {
// wait for first byte of Magic Word
for (i = 0; i < sizeof prefix; ++i) {
// If next byte is not in Magic Word, the start over
if (!checkIncommingData() || prefix[i] != Serial.read()) {
i = 0;
}
}
// Hi, Lo, Checksum
if (!checkIncommingData()) continue;
hi = Serial.read();
if (!checkIncommingData()) continue;
lo = Serial.read();
if (!checkIncommingData()) continue;
chk = Serial.read();
// if checksum does not match go back to wait
if (chk != (hi ^ lo ^ 0x55)) continue;
memset(leds, 0, MAX_LEDS * sizeof(struct CRGB));
transmissionSuccess = true;
sum_r = 0;
sum_g = 0;
sum_b = 0;
int num_leds = min ( MAX_LEDS, (hi<<8) + lo + 1 );
// read the transmission data and set LED values
for (int idx = 0; idx < num_leds; idx++) {
byte r, g, b;
if (!checkIncommingData()) {
transmissionSuccess = false;
break;
}
r = Serial.read();
if (!checkIncommingData()) {
transmissionSuccess = false;
break;
}
g = Serial.read();
if (!checkIncommingData()) {
transmissionSuccess = false;
break;
}
b = Serial.read();
leds[idx].r = r;
leds[idx].g = g;
leds[idx].b = b;
#if ANALOG_OUTPUT_ENABLED == true && ANALOG_MODE == ANALOG_MODE_AVERAGE
sum_r += r;
sum_g += g;
sum_b += b;
#endif
}
// shows new values
if (transmissionSuccess) {
endTime = millis() + OFF_TIMEOUT;
#if MAX_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
FastLED.show();
#endif
#if ANALOG_OUTPUT_ENABLED == true
#if ANALOG_MODE == ANALOG_MODE_LAST_LED
showAnalogRGB(leds[MAX_LEDS-1]);
#else
showAnalogRGB(CRGB(sum_r/MAX_LEDS, sum_g/MAX_LEDS, sum_b/MAX_LEDS));
#endif
#endif
}
}
} // end of setup
void loop() {
// Not used. See note in setup() function.
}
Alles anzeigen
6. Nun gibt ihr an, welchen Arduino ihr habt . Dies ist wichtig, damit die IDE weiß, wie der Sketch hochgeladen werden muss. Das erledigt ihr in dem ihr in der IDE auf den Reiter "Werkzeuge" geht und dann bei "Board" euren Arduino auswählt ggf. müsst ihr beim Punkt "Port" noch einen Port auswählen, falls es die IDE nicht von selbst aus macht - dort sollte dann nur ein Port zur Auswahl stehen.
7. Diesen Code ladet ihr mit der Kombination : STRG + U auf euren Arduino
Das wär`s dann ist euer Arduino einsatzbereit!
[/INDENT]