WS2812 - LED Lichterkette verlängern

Hallo Zusammen,

ich habe eine neue Herausforderung, bei der ich allerdings momentan noch keine Ahnung habe, wie es sich umsetzen lässt...

Folgende Problematik:
Mein Motherboard bietet einen onboard led-controller an (modding ist was feines xD) und steuert damit WS2812B LEDs an.
Sofern ich bei meiner Recherche keinen Mist gebaut habe, steuert das MB damit max. 30 LEDs an.
Es handelt sich dabei um einen Farbverlauf (Regenbogen), der auch im inneren des Gehäuses leuchtet.

soweit ich es richtig sehe, wird LED1 angesteuert, dann LED2, ... im Anschluss müsste er wieder bei LED1 anfangen, womit LED31 niemals angesteuert wird und aus bleibt.

Ich würde gern diesen Farbverlauf (Lauflicht) fortführen über mehr als 30 LEDs. Meine Idee dazu ist, das Signal mit einem Arduino zu empfangen, zu interpretieren und in einen rotierenden Zwischenspeicher zu laden.

Damit könnte man theoretisch die Kette wie mit einem Schieberegister verlängern.
Nur wie ich das anstelle bin ich noch überfragt.

Den Zwischenspeicher anlegen sollte nicht das Problem darstellen... Ich würde hier mit 3 Arrays (RGB) arbeiten und die Inhalte per Indexanzeiger rotieren lassen.

Nur das interpretieren der Farben aus dem PC stellt mich vor ein Rätsel, da ich sowas noch nie gemacht habe (ohne lib). Die Datenübermittlung ist über 1 Pin, daher ist das Timing entscheidend, aber das sowohl beim lesen vom PC als auch beim schreiben auf die LEDs.

Könnt ihr mir hier ein paar Denkanstöße geben?

Ludacrysis:
Könnt ihr mir hier ein paar Denkanstöße geben?

Gesabbel von mir: Klickmich

Gruß

Gregor

Ich würde gern diesen Farbverlauf (Lauflicht) fortführen über mehr als 30 LEDs. Meine Idee dazu ist, das Signal mit einem Arduino zu empfangen, zu interpretieren und in einen rotierenden Zwischenspeicher zu laden.

Kannst Du Assembler?

Wenn nicht dann sehe ich schwarz.
Grüße Uwe

uwefed:
Kannst Du Assembler?
Wenn nicht dann sehe ich schwarz.

Ist dazu tatsächlich Assembler notwendig? C ist ja auch deshalb so erfolgreich, weil man damit sehr hardwarenah programmieren kann.

Ich kenne diese WS-Dinger (noch) nicht.

Gruß

Gregor

Hi

Da WS2812B adressierbare LED sind, wird der Kontroller auf Deinem Motherbord genau für 30 LED Farbwerte ausspucken.
Selbst, wenn Du Diese 'mitschreibst', bekommst Du nur genau diese 30 Farbpunkte - genau die Gleichen!!
Du kannst statt einem Stripe aber Zwei anschließen - Beide mit 30 LEDs.
Achte auf die Stromaufnahme - kA, wo der Strom für diese LEDs herkommt!!
RuckZuck ist das Modding fertig! Also Aus ... Kaputt ... Futsch ... Abgeraucht ...

Nun hast Du zwei Streifen, Die beide das Gleiche anzeigen.

... oder Du nimmst Dir einen Arduino und lässt Diesen selber Farbverläufe, Blitze oder 'Würmer' erzeugen und verteilst den Stripe (300 Pixel ist kein Thema, wenn nur wenige Pixel dabei gleichzeitig an sind, reicht auch eine einseitige Versorgung) in Deinem Case.
Schau Dir dazu 'TwinkleFox' an

MfG

PS: Assembler spricht DIREKT mit der Hardware - in C++ kannst Du Das auch, aber eben auch in Assembler (InLine-Assembler - dazu kannst Du Dir eine beliebige WS2812B-Library anschauen).
Das Timing ist äußerst kritisch und ohne Assembler ist nicht wirklich klar, was der Kompiler Alles für Befehle ausführt, um ans Ziel zu kommen.
In Assembler kannst Du 8 Ausgänge mit EINEM Befehl schalten (dauert EINEN Takt) - in C++ sind dafür zig Befehle nötig - dafür funktioniert der C++-Quellcode auf so ziemlich JEDEM µC, der Assembler-Code nur auf diesem einen Typ.
DAS ist der Grund für Hochsprachen, da Du damit mit den gleichen Befehlen auf verschiedene Hardware zugreifen kannst - erkauft mit Geschwindigkeitsverlust.
Wenn's wirklich schnell werden muß, geht's wieder 'back²root' - Assembler rules :slight_smile:

MfG²

Nein, leider kann ich keinen Assemblercode schreiben…

Und ja ich weiß, dass das MB mir nur 30 LEDs ausspuckt, daher möchte ich Sie ja zwischenspeichern.
Ähnlich einem Schieberegister.

Beispiel 90 LEDs:

Sequenz 1:
MB-Seq1 + 60 schwarze LEDs

Sequenz 2:
MB-Seq2 + MB-Seq1 + 30 schwarze LEDs

Sequenz 3:
MB-Seq3 + MB-Seq2 + MB-Seq1

Sequenz 4:
MB-Seq4 + MB-Seq3 + MB-Seq2

Ist jetzt natürlich vereinfacht dargestellt. In der Realität müsste das LED für LED durchgeführt werden, sonst hat das keinen Sinn.

Gibt es ohne Assembler keine Chance das zu realisieren?
Man könnte um das Ganze zu vereinfachen evtl. auch für den Ausgang einen LED-Strip mit Clock-Eingang verwenden, somit könnte man zumindest eines der Systeme vom zwingenden Takt trennen.

Ich habe gerade nochmal das Datenblatt gewälzt.

Die Programmierung der LEDs funktioniert, sofern ich mich nicht verrechnet habe mit einer Frequenz von 80 kHz.
Der Arduino arbeitet mit 16 Mhz, nach meiner Rechnung habe ich also grob 200 Takte zur Verarbeitung der Informationen.

Gut fairer Weise muss ich sagen, das ich nicht weiß, ob das reicht, aber so habe ich euch zumindest die Rechenarbeit erspart.

Könnt ihr mir sagen ob oder ob das nicht reicht?

Die Frequenz des Datenübertragungsprotokolls ist 800kHz (1,25 µS pro Bit) Das sind 20 Takte!!! bezogen auf einen 16 Mhz Arduino.

Das Protokoll für die WS2812B ist folgendermaßen:
Start mit einem Resetimpuls von mindestens 280µS
ein HIGH Bit ist 220ns~380ns HIGH gefolgt von 580ns~1.6μs LOW
ein LOW Bit ist 580ns~1.6μs HIGH gefolgt von 220ns~380ns LOW

Das Datenblatt des WS2812B sagt wenig über die Zeitkitizität. Beim WS2812 müssen die Zeiten auf 150ns genau sein (das sind bißchen mehr als 2 Takte).

Das sind Zeiten die mit C nur erreichbar sind wenn Du sehr gut Hardwarenah C programmieren kannst oder eben Assembler.

Andere ähnliche LED mit Controller fordern genauer eingehaltene Zeiten.

Nimm den Rat von postmaster-ino und bau Dir Deine selbstprogrammierte Beleuchtung mit einem Arduino.
Grüße Uwe

Ups... eine Nachkommastelle falsch...

sorry. Okay damit ist das Thema wohl tot... schade.

Wie gesagt Bau Dir eine Arduinoansteuerung der LEDs.

Hi

Deine Idee, die LEDs quasi ‘mitzuschneiden’ fällt auch raus, da Du die LEDs 31…90 nicht angesprochen bekommst.
Die LED 31 bekommt Ihre Daten von der LED 30, wenn die erste LED den 31.ten Datensatz zugeflüstert bekommt.
Jede LED, Die Ihre Farbe schon bekommen hat, steht quasi auf ‘Durchzug’ und wartet nur auf ein Stocken in der Übertragung, daß die aktuelle Farbe übernommen wird - so schalten alle LED gleichzeitig auf die neue Farbe um (vorher müssen Sie ja die durchlaufenden Farb-Informationen weiter leiten - kaum Zeit, was Anderes zu tun).

Du könntest die Farben ‘mitschneiden’ - Stripe 1 mit LED 1…30 würden diese Farben aber anzeigen.
Dann könntest Du diese Informationen an Stripe 2 schicken - LED 31…60.
Nun kommen neue Farben für Stripe 1 … wieder einlesen, Stripe 1 wechselt die Farbe.
Die soeben eingelesenen Farben müssten nach Stripe 2, die dort enthaltenen Farben aber nach String 3.
Das Alles bekommst Du auf gar keinen Fall mit einem großen Stripe hin, und nur unter großen Schwierigkeiten mit drei Einzel-Stripes.
Auch flimmert dann Stripe 1, da hier die Farben ALLER Stripes durch müssen.
Stripe 2 wäre nur noch ‘etwas’ am Flimmern.
Einzig Stripe 3 hätte eine fest zugeordnete Farbe.
Alles mit einem kritischem Timing.

Man könnte versuchen, den Assembler-Code in den Libs so umzustricken, daß man bis zu sieben Stripes versorgen kann - 1x Clock, 7x Daten.
Das Setzen der 8 Bits in dem Port ginge in der gleichen Geschwindigkeit - nur die Vorbereitung dieser Daten dürfte einiges an Rechenzeit verschlingen.
Auch denke ich, wenn Das so ‘einfach’ möglich wäre, gäbe es diese ‘7-Stripes gleichzeitig-Library’ bereits - mir ist in dieser Richtung Nichts bekannt - hätte aber auch nicht danach gesucht.

MfG

Die WS2812B haben keinen Clock.
Die WS2812B flimmern nicht während Daten übertragen werden.
Die erste WS2812B nimmt sich die ersten 24 Bit und schickt dann erst den restlichen Datenstrom an DO zur nächsten weiter.

postmaster-ino bitte Informiere Dich bevor Du Blödsinn als Wahrheit weitergiebst.

Grüße Uwe

Hi

Bitte lies anständig, bevor Du mir blöd-sinnigerweise Blödsinn vorwirfst!!

Wenn der Stripe 1 am Motherboard angeschlossen ist, wird Dieser JEDE der '30 LED-am-Stück'-Ausgaben anzeigen, sobald eine Pause eingetreten ist.
Wenn ich es irgendwie schaffe, daß mir das MB eben drei unterschiedliche dieser Pakete sendet, damit ich auch die 'dahinter liegenden Stripes' ans leuchten bringe, wird das MB zwischen den Paketen wohl eine Pause einlegen - und schon zeigt Stripe 1 den zuerst übertragenen Inhalt an.
Ob darin ein Sinn besteht, Das So zu machen, ist hier nicht gefragt.
Das Es mit einem StandAlone-Arduino einfacher/komfortabler geht, führte ich bereits aus.

MfG

postmaster-ino:
Bitte lies anständig, bevor Du mir blöd-sinnigerweise Blödsinn vorwirfst!!

Das möchte ich Dir wieder zurückgeben und wärmstens empfehlen.

postmaster-ino:
Wenn der Stripe 1 am Motherboard angeschlossen ist, wird Dieser JEDE der '30 LED-am-Stück'-Ausgaben anzeigen, sobald eine Pause eingetreten ist.
Wenn ich es irgendwie schaffe, daß mir das MB eben drei unterschiedliche dieser Pakete sendet, damit ich auch die 'dahinter liegenden Stripes' ans leuchten bringe, wird das MB zwischen den Paketen wohl eine Pause einlegen - und schon zeigt Stripe 1 den zuerst übertragenen Inhalt an.
Ob darin ein Sinn besteht, Das So zu machen, ist hier nicht gefragt.
Das Es mit einem StandAlone-Arduino einfacher/komfortabler geht, führte ich bereits aus.

MfG

Von dem hab ich gar nichts geschrieben/bemerkt/kritisiert.
Grüße Uwe

Hi

Wenn Du mir, liebenswürdigerweise, die Stelle aufzeigst, wo ich schrieb, daß die WS2812B während der Datenübertragung flimmern, nehme ich diese Kritik gerne an.
Ich schrieb, daß Diese in der Pause NACH der Datenübertragung der 30 LEDs die Farben übernehmen.
Wenn ich direkt im Anschluss die Farben für Stripe 2 aus dem MB raus gebe, wird der angeschlossene Stripe auch diese Farben, nach der Pause, übernehmen.
Wenn ich hier nicht immer die gleichen Daten sende, sehe ich hier ein Flimmern.
Wenn ich hier eh immer die gleichen Daten sende, kann ich mir den ganzen Aufwand sparen und alle drei Striped mit D_In am MB anschließen.

MfG

uwefed:
Die Frequenz des Datenübertragungsprotokolls ist 800kHz (1,25 µS pro Bit) Das sind 20 Takte!!! bezogen auf einen 16 Mhz Arduino.
...

20 Takte sind tatsächlich ein gutes Argument.

Was das „Assembler in C“ angeht, fällt mir ein, dass ich den C64 mal dazu gebracht habe, einen Screenshot mit 1-Druckpixel-Auflösung auf einem Okimate 20 (Farbdruckerlegende(?)) auszugeben. Den Test für meinen Algorithmus habe ich in einer Art von Pseudo-Assembler-Basic programmiert, der brauchte eine halbe Stunde. In Assembler gings schneller :slight_smile:

Wenn man ungefähr weiß, wie der Prozessor arbeitet, kann man in C(++) sehr hardwarenah programmieren und damit sehr schnellen Code erzeugen. Derartiges habe ich allerdings schon lange nicht mehr gemacht. Also haut mich nicht, wenn ich Blech sabble. Ich bin Rentner. Hauen: nein, auslachen: ja :slight_smile:

Gruß

Gregor

PS: Combie hatte mir mal beschrieben, wie man erreicht, dass beim Bauen des Sketches auch eine Datei mit dem entsprechenden Assembler-Code erzeugt wird. Das könnte hier sehr hilfreich sein.

postmaster-ino:
Hi

Wenn Du mir, liebenswürdigerweise, die Stelle aufzeigst, wo ich schrieb, daß die WS2812B während der Datenübertragung flimmern, nehme ich diese Kritik gerne an.

gerne:

Auch flimmert dann Stripe 1, da hier die Farben ALLER Stripes durch müssen.
Stripe 2 wäre nur noch 'etwas' am Flimmern.
Einzig Stripe 3 hätte eine fest zugeordnete Farbe.

postmaster-ino:
Ich schrieb, daß Diese in der Pause NACH der Datenübertragung der 30 LEDs die Farben übernehmen.
Wenn ich direkt im Anschluss die Farben für Stripe 2 aus dem MB raus gebe, wird der angeschlossene Stripe auch diese Farben, nach der Pause, übernehmen.
Wenn ich hier nicht immer die gleichen Daten sende, sehe ich hier ein Flimmern.
Wenn ich hier eh immer die gleichen Daten sende, kann ich mir den ganzen Aufwand sparen und alle drei Striped mit D_In am MB anschließen.

MfG

Hi

Danke Dir - nur sehe ich dort nicht den Bezug auf Clock, Der mir vorgeworfen wurde.

Nichts desto trotz: Wenn das MB nur für 20 LEDs Daten raus rückt, wird ein einfaches Verlängern nicht drin sein, da die LEDs 21 bis x die Daten im gleichen 'Rutsch' haben wollen - sonst übergibt LED 20 nämlich Nichts an 21 und dann hört die Story auf.

Auch wurde wohl schon genug dazu geschrieben, daß hier ein Schieberegister nicht der glücklichste Ansatz ist.

MfG

postmaster-ino:
Hi

Danke Dir - nur sehe ich dort nicht den Bezug auf Clock, Der mir vorgeworfen wurde.

Nichts desto trotz: Wenn das MB nur für 20 LEDs Daten raus rückt, wird ein einfaches Verlängern nicht drin sein, da die LEDs 21 bis x die Daten im gleichen 'Rutsch' haben wollen - sonst übergibt LED 20 nämlich Nichts an 21 und dann hört die Story auf.

Auch wurde wohl schon genug dazu geschrieben, daß hier ein Schieberegister nicht der glücklichste Ansatz ist.

MfG

Man könnte versuchen, den Assembler-Code in den Libs so umzustricken, daß man bis zu sieben Stripes versorgen kann - 1x Clock, 7x Daten.

Außerdem sind es 30 LED.
Grüße Uwe