Arduino Boblight Sketch --> Verlorene Bytes

  • Wie sich herausgestellt hat, sind die letzten drei Bytes im Adalight Modus nicht fest, sondern hängen von der LED-Zahl ab.


    Hier mal mein letzter Stand. --> https://gist.github.com/CReimer/21239b5551cd6b8bd1fb


    Deinen Zählfehler habe ich umgangen, indem ich einfach nicht mehr zähle :D
    Und das Prefixproblem ist auch weg. Die letzten 3 Bytes des Prefix werden einfach ignoriert.


    Das ist so zwar verschwendete Bandbreite, aber die vorhandenen "Protokolle" sind eben so gebaut.
    Im Idealfall hätte man exakt 1 Byte als Prefix. Spätestens nach dem zweiten oder dritten Frame spielt sich das dann sauber ein.


    Schöner ist da das Sedu-"Protokoll". Da sind es nur 3 Bytes. 2 am Anfang und 1 am Ende. Das zweite am Anfang ist wieder mit Zusatzinfos versehen, die im Falle des Arduino wieder unnötig sind.
    An das werde ich später meinen Sketch noch anpassen und dann komme ich auch nicht wirklich weiter bis die Chinesen meine LED Stripes endlich liefern.


    Edit: Sedu ist ja noch schlechter. Das hat feste Bytelängen. Das kleinste ist 256 Byte. Wenn ich das jetzt richtig gesehen habe wird der Rest einfach mit Nullen gefüllt. Ich lasse es also beim Adalight Protokoll.

  • Für Hyperion ist auch schnell ein neues Device programmiert, sieht nicht sonderlich schwer aus. Ist wenn es vom Entwickler gemergt wird hat man auch kein hickhack mit patchen.
    Sozusagen ein "momo" Device mit konfigurierbarem Präfix.


    Das adalight hat halt den Vorteil das die Anzahl der LED nicht im Sketch festgelegt ist.


    Was mich noch stört an der Sache ist die serielle Verbindung, und das bei Zeiten von USB. Mich reizt ein Ambilight welches direkt den USB nutzt, da wäre massig Bandbreite da, selbst bei USB 1.1

  • Zitat

    Edit: Sedu ist ja noch schlechter. Das hat feste Bytelängen. Das kleinste ist 256 Byte. Wenn ich das jetzt richtig gesehen habe wird der Rest einfach mit Nullen gefüllt. Ich lasse es also beim Adalight Protokoll.


    Das SEDU Board kann mehrere Protokolle. Das, was Du meinst, ist das miniDMX Protokoll. Das arbeitet mit festen längen und dementsprechend Overhead.


    http://www.ledstyles.de/index.…Modifikation-Erweiterung/


    Daraus entstand dann wohl das tpm2 Protokoll, welches soviele Bytes benutzt, wie man LEDs hat (+ ein paar Bytes fürs Protokoll). Das tpm2 Protkoll nutze ich auch bei meiner Firmware und funktioniert auch mit Boblight.


    http://www.ledstyles.de/index.…ur-Matrix-Lichtsteuerung/


    Was mich noch stört an der Sache ist die serielle Verbindung, und das bei Zeiten von USB. Mich reizt ein Ambilight welches direkt den USB nutzt, da wäre massig Bandbreite da, selbst bei USB 1.1


    Wie gesagt, mit libusb und libusb_bulk_transfer kann man auch Boards ohne FTDI mit ensprechender Geschwindigkeit nutzen. Bei Bedarf kann ich mal mein kleines Testprogramm anhängen, vielleicht entwickelt sich daraus ja eine Alternative zum seriellen Schreiben.

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Für Hyperion ist auch schnell ein neues Device programmiert, sieht nicht sonderlich schwer aus. Ist wenn es vom Entwickler gemergt wird hat man auch kein hickhack mit patchen.

    Möchte ich nicht. Es gibt so schon zu viele Varianten. Da muss wirklich nicht noch eine dazu.

    Das adalight hat halt den Vorteil das die Anzahl der LED nicht im Sketch festgelegt ist.

    Ich dachte daran, das im Sketch wieder zu "entschlüsseln". Dann kam mir aber der Gedanke, dass man dadurch immer noch nicht alles abgedeckt hat. Man muss der FastLED Library ja nicht nur die Anzahl der LEDs mitteilen, sondern auch den Controller. Und das nur damit die 3 Bytes Sinn haben die Konfiguration auseinander reißen...

    Was mich noch stört an der Sache ist die serielle Verbindung, und das bei Zeiten von USB. Mich reizt ein Ambilight welches direkt den USB nutzt, da wäre massig Bandbreite da, selbst bei USB 1.1

    Da wirst du wohl Abstand von den ATmega328 Boards nehmen müssen und da wird es dann aufwändig.
    Die neueren Boards (oder auch der SPI des RPi) laufen mit 3,3V. Da reagieren die WS2812B aber noch nicht zuverlässig.

  • Keine Ahnung für was man den brauchen sollte. Ich würde das Teil sogar als gefährlich bezeichnen.
    Da werden die Digitalausgänge des Teensy 3.x auf LAN-Kabel gelegt.


    Der Teensy ist genauso gut wie jedes andere ARM basierte Entwicklerboard. Die Idee ist ja der direkte USB am Mikrocontroller ohne vorheriges wandeln nach Serial


    Es geht auch mit Serial (FTDI vorausgesetzt). Man müsste aber wohl langsam auf 1 MBaud hochgehen, damit man nicht bei ~200 LEDs beschränkt ist.


    Edit: Es geht wohl auch mit dem Uno indem man den 16U2 mit einer anderen Software versieht. Ich trau' mich aber nicht. https://github.com/NicoHood/HID

  • Also hier läufts auch smooth mit 214 LEDs und 500kBaud. Wo genau liegen jetzt eigentlich die Probleme? Man kann ja anhand der Prokolllänge und der Baudrate/benötigen Framerate ausrechnen, für wieviele LEDs das Setup reicht.


    (214x3 + 5) x 50 Hz = 32350 byte/s = 258800bit/s also noch reichlich Platz nach oben.

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Ich bin von 100Hz ausgegangen.


    Es haben sich drei eigentliche Probleme herauskristallisiert.


    Problem 1: Der ATMega 16U2 auf den aktuellen Arduinos ist ungeeignet für einen konstanten Stream. Zumindest bei mir blockiert irgendwann das /dev/ttyACM0 Device. (Ausweg: Einen FTDI an den RX-Pin des Arduino hängen)
    Problem 2: In chriszero's Sketch ist ein Zählfehler. (Ausweg: Chriszero's Fix hier aus dem Thread nehmen und dort aber '-1' weglassen oder meinen Sketch nehmen)
    Problem 3: Boblight verzählt sich irgendwie. Sichtbar wird das durch flackern der LEDs. Falschfarben und durch das DEBUG Define in meinem Sketch. (Ausweg: Hyperion. Ein gefixtes Boblight wäre aber auch nicht schlecht)

  • Ob man 100 Hz braucht, wenn Filme mit hauptsächlich 50 Hz übertragen werden? Muss ja dann auch 100 mal pro Sekunde gegrabbt werden.


    Das erste Problem kenne ich. Abhilfe würde hier nur libusb schaffen. Problem bei den virtuellen seriellen Schnittstellen ist, dass den Sketch die Baudrate nicht wirklich interessiert. Zumindest beim Leonardo. http://forum.arduino.cc/index.php?topic=108599.0

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Wegen Boblight: Ich habe mal die "Failed bytes" Meldung ausgeblendet, wenn es keine Fehler gibt. Das hier ist was übrig bleibt.



    Edit: 150 Channels bzw. 50 RGB-LEDs.


    6 Stelliger Prefix also müsste sich nach 156 Bytes alles sauber wiederholen.


    Edit2: bei einem zweiten Versuch ergibt sich folgendes:




    Edit3: Sieh mal an. Wenn ich bei boblight-X11 den Sync-Modus ausschalte "-y off" läuft es fehlerfrei. Jetzt muss ich nur noch herausfinden, was dieser Modus tut und warum es damit nicht funktioniert.


    Edit4: Das kann man auch global in der Boblight.conf abschalten:


    Zitat

    allowsync
    Allows sync mode when a client requests it, this setting is optional, the default is on.
    When sync mode is on, a device gets woken up immediately when a client sends input to a light that that device is using, this works quite well with clients like boblight-X11 and boblight-v4l because the light updates are exactly synchronized to the client's input.
    However when a client updates too frequently or too many clients are using one device, the device's output can become constipated and all hell will break loose.
    Sync mode can also be disabled in boblight-X11 or boblight-v4l by using the "-y off "flags.
    Sync mode doesn't work with sound devices, they run synchronized to the soundcard and can't be woken up early.

  • Zum Syncmode:
    So wie ich das aus der Source von Boblight lese, wird bei aktivem Syncmode der Thread des Device (unsere Ambilight-Hardware) geweckt wenn der Client Daten schickt. Das heißt das "Intervall Setting" wird über den Haufen geworfen. Wenn du also im Boblight 100Hz eingestellt hast und die Daten kommen zwischen den Waitstates des Thread (was zu 99% passiert) hast du weit über 100Hz aktualisierungsrate. -> Da läuft bestimmt der Puffer des Arduinos über...


    Edit:
    Arduino hat einen 64Byte Großen Ringpuffer für Serial RX, der wird nicht schnell genug leergelesen, Hardware Flusskontrolle nicht verfügbar in den Arduino Libs (Xon/Xoff)
    Ich probier grade einen Workaround...

  • Eigentlich sollte Serial.readBytes unabhängig vom Buffer direkt in das 'leds' Array schreiben. Wenn das nicht schnell genug geht, weiß ich auch nicht.
    Ich sage dem ja lese mir 150 Bytes in das Array hier.


    Bei dir ist das etwas fummeliger aber mit Neopixel geht das so anscheinend nicht besser.

  • Fummelst Du jetzt immernoch mit dem internen USB Anschluss rum?

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Naja, Du bist ja eigentlich nicht der erste, der sich mit einem Arduino und ein paar LEDs ein Ambilight baut. Daher verstehe ich die Probleme nicht. Vielleicht bist Du ja der erste, der 100Hz haben will?


    Mit FTDI kann ich die Probleme nicht nachvollziehen. Aber wenn ich den DEBUG Code in meinem Sketch aktiviere und viele Daten über Serial zurück schreibe, dann klemmts auch bei mir. Im Normalbetrieb schreibt meine Firmware genau 1 byte zurück, wenn ein Datenframe ordentlich verarbeitet wurde.


    Weiss nicht, wie es beim UNO ist, aber wenn man einen FTDI an Pin 0 und 1 klemmt, sollte es dann nicht Serial1 sein in deinem Sketch?

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Vielleicht bist Du ja der erste, der 100Hz haben will?

    Vielleicht verstehe ich den Sync Modus auch immernoch falsch, aber sollte das dann nicht sogar runter gehen auf die Display Wiederholrate? (im Fall meines Desktops 60Hz)

    Weiss nicht, wie es beim UNO ist, aber wenn man einen FTDI an Pin 0 und 1 klemmt, sollte es dann nicht Serial1 sein in deinem Sketch?

    Für mich sieht das aktuell so aus, als wären die einfach parallel. Der Uno hat nur ein Serial Interface.

  • Also ich habe jetzt viel getestet.
    Dieses Phänomen das der Arduino Bytes "verliert" tritt schon bei einem einfachem "Serial Echo" auf Sprich die empfangenen Bytes einfach wieder zurückschreiben.


    Mit einem Teensy funktioniert das alles ohne Probleme, da bleibt nichts auf der Strecke, egal wie schnell, oder mit syncmode... Irgendetwas limitiert da, sei es drum


    Prinzipiell reicht es ja wenn der syncmode deaktiviert wird, das fällt bei einer Aktualisierungsrate von +50Hz garantiert nicht mehr auf.

  • Dann halten wir mal fest.


    Wenn sich jetzt jemand neu ein DIY Ambilight aufbaut sollte er besser gleich zum Teensy greifen.
    Ich habe jetzt auch schon darüber nachgedacht mir einen Teensy zu holen, aber es funktioniert ja mit meinem Arduino auch. (FTDI vorausgesetzt und abgesehen vom Sync-Modus)


    Und extra deswegen nochmal 25€ Teensy + 5€ Levelshifter-Platine. Ich habe ja jetzt schon zusätzlich 5€ für eine FTDI Platine ausgegeben.

  • Der Arduino mit seinem 328p ist ja deswegen nicht schlecht, mir ist das im normalem Betrieb mit meinem 576 Kanal Ambilight ja gar nicht aufgefallen, nichteinmal das der nur jede zweite Message in die LEDs gepumpt hat.
    Der Sinn des syncmodes erschließt sich mir nicht ganz, bei einer hohen (ich habe 50Hz) Aktualisierungsrate ist das nicht zu bemerken.
    Die Rate die das Boblight Plugin nutzt ist (und sollte auch) ja nicht nicht sehr hoch, die liegt bei mir bei 15 Grabs pro Sekunde (ansonsten steigt die CPU Last immens an). Boblight errechnet dann die Zwischenwerte je nach dem wie oft der LED Streifen Aktualisiert wird.


    Beim atmoplugin (tpm2) tritt das nicht zu Tage weil es normal nicht über Boblight läuft, falls man es über Boblight laufen lässt passiert das bestimmt auch.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!