Hallo,
ich bin auf der Suche nach der Stelle in der FastLED library, wo dann wirklich die einzelnen LEDs raus getaktet werden.
Will dort nen Hook einfügen, der mir die UART pollt.
Kann mir da jemand helfen? Kanns einfach nicht finden.
Hallo,
ich bin auf der Suche nach der Stelle in der FastLED library, wo dann wirklich die einzelnen LEDs raus getaktet werden.
Will dort nen Hook einfügen, der mir die UART pollt.
Kann mir da jemand helfen? Kanns einfach nicht finden.
??? Erkläre deine Frage bitte etwas genauer!
Bei den WS2812B werden die einzelnen Leds nicht einzeln angesprochen. Es wird immer der ganze Streifen angesprochen.
OK also ich versuche etwas genauer zu werden.
ZUnächst. Du hast recht es müssten die WS2812B sein
Uns gehen in der Kommunikation mit dem Arduino Daten verloren und wir haben heraus gefunden, dass es nur passiert wenn wir die LEDs ansteuern.
Jetzt gehen wir davon aus, dass der Puffer einfach nicht groß genug ist und wir das Daten einfach öfter pollen müssen.
Erster Gedanke war, nach jeder gesetzten LED zu pollen.
Nach jedem Band zu pollen reicht leider auch nicht aus. Das haben wir schon probiert.
Gibt es denn eine Möglichkeit den Eingangspuffer zu vergrößern?
Oder hast du vielleicht sogar noch eine andere Idee?
Die Daten gehen verloren weil während der Ansteuerung des Strips die Interrupts gesperrt werden. Du musst die Kommunikation so synchronisieren, dass nur dann Daten gesendet werden wenn keine Daten auf die LEDs geschrieben werden, oder wenn du anfängst Daten zu empfangen erst mal die Daten fertig einlesen und erst dann wieder die LEDs ansteuern.
Ist es möglich, dass ihr den Sketch hier zu Verfügung stellt?
Dann kann man genauer sehen, wo euer Problem sitzt.
Einzelne Leds werden bei der FastLED sowie bei allen anderen WS2812-Libarys nicht gesetzt.
Gesendet wird an die Leds ein Byte-Array mit der Länge von NUM_LEDS * 3. * 3, da jede Farbe ein Byte belegt.
Das beschreiben dieses Arrays hat jedoch noch nichts mit dem versenden der Informationen gemeinsam. Die Funktion FastLED.show() macht dieses erst mölgich. Hierbei wird das Array mit Bitbanging sowie einem zeitkritischen Timing rausgeschickt. In dieser Zeit läuft kein anderer Befehl auf dem MCU. Die Interupts, soweit ich die FastLED kenne, sollten dabei auch gesperrt sein.
Somit ist es nicht möglich, etwas anderes zu tun, bis der kompletten WS2812 Streifen beschrieben ist.
Abhilfe könnte es schaffen, die Streifen aufzuteilen und an unterschiedlichen Ports zu hängen. Dazu müsste ich gleich mal eben in die Libary schauen, wie es ermöglicht wird, nur ein bestimmtest Array zu schicken.
Weitere Infos über CPU Takt, eingesetztem AVR-Board und Anzahl der Leds wäre nicht verkehrt.
Da die Ansteuerung der WS28xx SEHR zeitkritisch ist bzw. bei geringsten Timingunschärfen nicht mehr funktioniert, geht auf einem AVR während des LED Schreibens nichts anderes. Auf ARM, z.B. Teensy ist das etwas anderes.
Wie Serenifly schon schreibt: Inputdaten können nur verarbeitet werden, wenn gerade kein FastLED.show() abgearbeitet wird. Interrups sind während des Schreibens gesperrt.
Das Problem ist nicht FastLED, sondern die Kommunikation mit dem Arduino.
Eine Alternative wäre es, die Daten frameweise zu senden nur nach jedem empfangenem Frame (und nicht kontinuierlich) die LEDs zu schreiben.
Woher kommen die Daten? Wieviele LEDs? Wieviele fps sind angestrebt?
Grüße
Helmuth