Go Down

Topic: WS2812 - LED Lichterkette verlängern (Read 176 times) previous topic - next topic

Ludacrysis

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?

gregorss

Könnt ihr mir hier ein paar Denkanstöße geben?
Gesabbel von mir: Klickmich

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen (Häuptling „Großes Lötauge" der M3-Hopi)
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

uwefed

Quote
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

gregorss

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
Wenn man keine Probleme hat, kann man sich welche machen (Häuptling „Großes Lötauge" der M3-Hopi)
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

postmaster-ino

#4
Aug 18, 2018, 05:40 pm Last Edit: Aug 18, 2018, 05:43 pm by postmaster-ino
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 :)

MfG²

Ludacrysis

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.

Ludacrysis

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?

uwefed

#7
Aug 18, 2018, 09:51 pm Last Edit: Aug 18, 2018, 09:53 pm by uwefed
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

Ludacrysis

Ups... eine Nachkommastelle falsch...

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

uwefed

Wie gesagt Bau Dir eine Arduinoansteuerung der LEDs.

postmaster-ino

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

uwefed

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

Go Up