WS2812B Stripes mit enigma2 Boblight ansprechen

Werfe mal ein freundliches Hallo in die Runde,
komme aus BW nahe Karlsruhe und bekomme die besagten Stripes mit dem UNO r3 nicht zum laufen.

Habe es mit NeoPixel und FastLED versucht, welche auch brav die LEDs mit ihren Testprogrammen ansteuern.
Sobald ich aber versuche die LEDs vom Linux-Receiver mit dem Boblight Plugin anzusprechen, stoppt das Testprogramm
kurz seinen Durchlauf, läuft dann aber einfach weiter.
Ich dachte mir, wenn Boblight doch mit den WS2801 klarkommt (LEDstream.pde), sollte das doch auch mit den WS2812b funktionieren, da es sich ja auch um ein Schieberegister handelt. Aber irgendetwas fehlt vermutlich im Code, damit Boblight richtig mit dem Uno sprechen kann.
Habe mich dann auf die Suche im Inet gemacht und folgenden Code gefunden.

//////////
//
// Arduino interface for the use of ws2812 operated LEDs
// Uses Adalight protocol and is compatible with Boblight, Prismatik etc
// "Magic Word" for synchronisation is 'Ada' followed by LED High, Low and Checksum
//
///// User definitions /////
#include "FastLED.h"
// Define the number of LEDs
#define NUM_LEDS 30
 
// Define SPI Pin
#define PIN 13
 
// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 115200
 
//// End of user definitions /////
 
// Utilises FastSPI_LED2
#define FORCE_SOFTWARE_SPI
#define FORCE_SOFTWARE_PINS
 
 
// 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;
 
// initialise LED-array
CRGB leds[NUM_LEDS];
 
void setup()
{
 
FastLED.addLeds<WS2812, 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 == 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.r = r;
leds.g = g;
leds.b = b;
}
// shows new values
FastLED.show();
}

Ein User hat mit diesem anscheinend die LEDs zum Laufen gebracht. Also habe ich versucht den auf den UNO zu laden.
Leider kommt es beim Kompilieren zu folgender Fehlermeldung:

enigmalight.ino: In function ‘void loop()’:
enigmalight:55: error: ISO C++ forbids comparison between pointer and integer
enigmalight:87: error: request for member ‘r’ in ‘leds’, which is of non-class type ‘CRGB [30]’
enigmalight:88: error: request for member ‘g’ in ‘leds’, which is of non-class type ‘CRGB [30]’
enigmalight:89: error: request for member ‘b’ in ‘leds’, which is of non-class type ‘CRGB [30]’

Jetzt komm ich leider nicht mehr weiter! :frowning:

leds.r = r;
leds.g = g;
leds.b = b;

geht nicht. Schreibe stattdessen:

leds[i].r = r;
leds[i].g = g;
leds[i].b = b;

Denn Sinn von Zeile 55 in Deinem kopierten Code verstehe ich nicht, da koennen die Serial Experten hier hoffentlich mehr dazu sagen.

Hi Helmuth,
Danke schon mal - ein Fehler weniger! :wink:

Mit dem Serial Vergleich, weiss ich leider auch nicht bescheid. Könnte etwas mit der Kommunikation zwischen Boblight und
Uno zu tun haben. Damit das Boblight-Plugin die LEDs ansprechen kann, muss dort eine config erstellt werden. In der ist auch der prefix hinterlegt. Die config fürs Adalight sieht folgendermaßen aus (vielleicht hilfts Euch):

[device]
name        ambilight
output        /dev/ttyACM0
type          momo
channels      90
interval      20000
prefix        41 64 61 00 1D 48
rate          115200
#debug         off
delayafteropen  1000000

[color]
name          red
rgb           FF0000
gamma             0.91
adjust        1.0
blacklevel    0.0

[color]
name          green
rgb           00FF00
gamma             0.86
adjust        0.96
blacklevel    0.0

[color]
name          blue
rgb           0000FF
gamma             0.95
adjust        0.80
blacklevel    0.0



[light] #top
name          1XX
color         red     ambilight 1
color         green   ambilight 2
color         blue    ambilight 3
hscan         0.0 3.33
vscan         0 10


[light] #top
name          2XX
color         red     ambilight 4
color         green   ambilight 5
color         blue    ambilight 6
hscan         3.33 6.67
vscan         0 10

hi,

ich hab' auch schon einige male (aber nicht sehr ambitioniert, bin faul) nach möglichkeiten gesucht, meiner DM8000 ein ambi-, okto-, sedu-, bob- oder sonstiges "light" zu verpassen.

die 2812 arbeiten KOMPLETT anders als die 2801, völlig anderes konzept.

ein programm für den arduino zu schreiben, die die 2812er steuert, wär' nicht so sehr das problem, aber dazu braucht man ein plugin auf der dream, das einfach die RGB-werte für die entspechenden bereiche des fernsehers abliefert, und so was einfaches hab' ich noch nicht gesehen.

gruß stefan

Hi stefan,
aber das Boblight liefert doch die Bildinformationen!
Es ist ja nur ein Problem diese mit dem richtigen Code an das Arduino-Board zu übertragen.
Der voher gepostete Code muss ja nicht verwendet werden -hab halt nichts anderes gefunden!
Oder kann man Neo_Pixel oder Fast_LED verwenden und der Boblight Dev müßte das anpassen -kA?
Ich denke eher nicht, denn ich habe hier auch das Sedulight-Board mit dem die WS2812B vom Boblight-Plugin (gleiche config) angesprochen werden können. Das Sedu spricht meines Wissen die Stripes mit miniDMX an.

hi,

irgendwie hat der gern den zähler weggelassen.

probier mal:

//////////
//
// Arduino interface for the use of ws2812 operated LEDs
// Uses Adalight protocol and is compatible with Boblight, Prismatik etc
// "Magic Word" for synchronisation is 'Ada' followed by LED High, Low and Checksum
//
///// User definitions /////
#include "FastLED.h"
// Define the number of LEDs
#define NUM_LEDS 30
 
// Define SPI Pin
#define PIN 13
 
// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 115200
 
//// End of user definitions /////
 
// Utilises FastSPI_LED2
#define FORCE_SOFTWARE_SPI
#define FORCE_SOFTWARE_PINS
 
 
// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
uint8_t hi, lo, chk, i;
char prefix[4] = "Ada";
 
// initialise LED-array
CRGB leds[NUM_LEDS];
 
void setup()
{
 
FastLED.addLeds<WS2812, 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();
}

welches bobolight verwendest Du, und vor allem, wie installiert man das auf der dream?

ich hab’ zwar eine , aber nur wegen des komforts, kenn’ mich kaum damit aus. wenn die ausgabe des plugins so einfach ist, wie das programmschnipsel zeigt, kann man da schon was draus machen.

gruß stefan

Danke Stefan,
die Arduino Soft hat jetzt schon mal nicht gemault, hehe!
Kann das aber erst morgen Abend testen.

Das Ambilight Boblight-Plugin kannste einfach online über den Feed oder halt per Hand installieren. Infos zum Plug gibt's hier:

Bei Fragen helfe ich gerne weiter!

schönen Abend.. ..

hi,

Das Ambilight Boblight-Plugin kannste einfach online über den Feed oder halt per Hand installieren.

siehst Du, und genau das hilft einem nicht-linux-user so gar nicht weiter.

auf der seite sind links zum runterladen down. was heißt "über den feed"?

gruß stefan

sorry ,
schau mal hier: http://www.i-have-a-dreambox.com/wbb2/thread.php?postid=2029948#post2029948

die Datei entpacken und dann am besten auf'nen USB kopieren - normalerweise sollte sich die Dream dann beim einstecken melden. Ansonsten musst Du mal ins Menü gehen und dann unter Softwareverwaltung -> lokale Erweiterungen installieren.
Könnte auch anderes heißen - habe selbst eine andere Box!

hi,

na bitte, wieder was gelernt. danke.

kann nur die box grade nicht rebooten, nehme was auf. aber ich werd' mir das in den nächsten tagen ansehen. das mit dem prefix kriegen wir sicher hin, der rest scheint easy zu sein (falls das protokoll wirklich sooo einfach ist).

gruß stefan

hi,

hab' mir jetzt mal die conf angesehen, die Du oben gepostet hast. das ist doch nur der anfang, oder?

wie weit geht hscan bzw. vscan? ich nehme an, das bestimmt den bildschirmbereich, der gescannt wird, um die jeweilige LED zu steuern.
Du hast Dich da wahrscheinlich schon etwas eingelesen, also schmeißen wir zusammen...

gruß stefan

hi,

konnte jetzt rebooten. die config kann man ja über's programm erstellen. werd' aber noch nicht schlau, wieviele channels und LEDs er in der config anlegt. paßt irgendwie nicht zu den werten, die ich eingestellt habe. aber das läßt sich berstimmt lösen.

kann leider heute und morgen nicht weitermachen, aber bin schon gespannt...

gruß stefan

Hi stefan,
ja die boblightconfig habe ich nicht vollständig gepostet. Mit h+vscan liegste richtig, teilt ein Bildschirmbereich einer LED oder auch
Stripe zu. Der config Editor im BL funktioniert eigentlich schon richtig, Du mußt aber auf RGB stehen lassen sonst gibt's nen Grünen
auf der Dream. Auch darfst du nicht unten mittig mit den LEDs starten, bringt auch Fehler in der unteren Leiste.
So habe mal den Sketch oder Code auf das Board gespielt. Die LEDs werden auch mit der RGB Initialisierung gestartet. Auch beim
Start von BL verhalten sie sich so - danach bleibt aber alles dunkel! =(

hi,

da ist sicher die initialisierung über serial noch nicht korrekt. aber da haben wir einige möglichkeiten.
ich habe hier mehrere USB<>serial-adapter, megas mit 4 seriellen schnittstellen und kann so auf mehrere arten eine direkte verbindung von der dream zum PC aufbauen. hab’ nur leider die grippe und noch dazu besuch, komm also heute nicht dazu.

aber wenn der andere das mit dem von Dir geposteten sketch hinbekommen hat, seh’ ich null schwierigkeiten. das kriegen wir hin…

dann bleibt nur noch zu hoffen, daß das boblight-plugin gute werte liefert. das ist meine einzige sorge im moment.

gruß stefan

Hi,
hast ja geschrieben, dass Du nicht kannst -is kein Problem!
Wie schon oben geschrieben bringt Boblight ja die Werte irgendwie und da laufen die WS2812b ja auch mit dem Sedulight
Controller. Mußte nur den Intervall in der BL config von 20000 auf 70000 hochschrauben, da die dann sonst geflckert haben.
Ich könnte auch mal den BL Dev. anhauen, was der zum Thema meint.

hi,

nein, nein, den entwickler brauchst Du damit nicht zu quälen, das ist ein arduino/serial/code-problem.

aber das andere, das ich gestern angesprochen habe: die config ist bei mir zu kurz. ich habe 12 LEDs quer und 8 LEDs in der höhe angelegt. die anzahl der channels ist noch richtig mit 124: 12+12+8+8=40. *3=120. er fängt bei 4 zu zählen an, kommt also hin.

aber er legt dann zuwenige LEDs an. nur 9 statt 12 und 5 statt 8.

[light] #right
name          15X
color         red     ambilight 46
color         green   ambilight 47
color         blue    ambilight 48
hscan         90.0 100 
vscan         0.0 12.5


[light] #right
name          16X
color         red     ambilight 49
color         green   ambilight 50
color         blue    ambilight 51
hscan         90.0 100 
vscan         12.5 25.0


[light] #right
name          17X
color         red     ambilight 52
color         green   ambilight 53
color         blue    ambilight 54
hscan         90.0 100 
vscan         25.0 37.5


[light] #right
name          18X
color         red     ambilight 55
color         green   ambilight 56
color         blue    ambilight 57
hscan         90.0 100 
vscan         37.5 50.0


[light] #right
name          19X
color         red     ambilight 58
color         green   ambilight 59
color         blue    ambilight 60
hscan         90.0 100 
vscan         50.0 62.5


[light] #bottom

er fängt also richtig mit vscan bei 0 an, rechnet dann richtig in 12,5er schritten, hört aber nach 5 LEDsauf.

ebenso gestern mit 16 und 9 leds. die schritte waren richtig, aber auf jeder seite 3 zuwenig.

mach ich was falsch oder ist das bei dir auch so?

gruß stefan

BL.txt (5.8 KB)

hi,
das ist aber komisch!
und Du hast das aus dem boblight plugin berechnen lassen oder ein externes Programm benutzt?
Wenn de ne config brauchst, kann ich die Dir morgen erstellen. Habe da noch ein anderes Programm.
Das Problem bei mir ist, dass bei mir nur das Nachfolge-Plugin “Enigmalight” läuft und dieses noch in der Beta Phase ist.
Dort läuft der config-Editor noch nicht oder ich installier ne PreBeta da gings noch. Hast Du selber Stripes da um das zu
testen oder geht’s nur um die Information, wie die config aussieht?

hi,

danke, es ist ja kein problem. die config würde ich dann sowieso händisch erstellen, weil man da einiges optimieren kann. zb. die anzeige an den ecken. dort sollten die LEDs ein wenig "rund" angebracht sein, sieht sicher besser aus, aber das geht nicht mit der config aus dem programm.

wieviele LEDs können mit dem programm maximal versorgt werden? bei mir wären es etwa 230 (55"-schirm). falls das plugin das nicht schafft, müßte der arduino dann zusammenfassen. ist ja kein problem, sobald ich die werte bekomm.

ich tüftel auch schon an einem rahmen für die LEDs. hoffentlich taugt das plugin! bin schon ganz kribbelig...

EDIT: stripes zum testen hab' ich da, etwa 3m. kauf' mir dann aber schwarze 4m.

gruß stefan

moin,
willst Du wirklich 230 LEDs an den 55" anbringen- oder sprichst Du von den RGB Kanälen? Habe bei mir momentan
118
WS2801 LEDs am 55" angebracht, reicht haufig! Das Plug sollte aber auch 230 LEDs berechnen können.
Das mit den Ecken haste gut erkannt. Dafür gibt’s den BoblightConfigMaker, den ich hier in v2.1 Beta da habe! Da haben wir
einige Sonderoptionen eingebaut. Das Ecken Problem habe ich bei mir so gelöst, dass ich die oben und unteren Stripes in die
Ecke laufen lasse und die vertikalen dann da zwischen drin einfüge. Mit dem BCM-Tool kann man das dann schön einstellen.

Hi,
jep Du hast 230 LEDs, denn die WS2812B bekommt man ja auch mit 60LED/m. Habe mir bewusst 30LEDs/m geholt, die reichen alle mal ausser Du möchtest die Decke anstrahlen oder der TV ist 50cm von der Wand entfernt. Also das Plugin sollte das schaffen

  • ein Uno kann max 140 LEDs (habe ich gehört).