Arduino Boblight Sketch --> Verlorene Bytes

  • Hi,


    ich habe folgenden Arduino Sketch von tweak4all


    mit Hilfe der onboard LED des Arduino Uno habe ich ein paar "Debugausgaben" eingebaut. Unter anderem einen Counter der hochzählt wenn im STATE_WAITING nicht das richtige Byte gefunden wurde.


    Ich hätte nicht damit gerechnet, aber zu meiner Überraschung blinkt die LED langsam. Erstmal war ich irritiert, aber anscheinend fängt ein Integer wieder bei 0 an, wenn er überläuft.


    Jetzt frage ich mich natürlich wo meine Bytes hin verschwinden.


    Meinem Verständnis nach müssten ja ununterbrochen die 6 Prefix Bytes und 150 LED Bytes gesendet werden. Und laut Debugausgaben tut Boblightd auch genau das.



    Wo ist mein Denkfehler? Kann ich mich irgendwie in die Übertragung einklinken und mithören?



    Achja, im Moment läuft der Arduino ohne angeschlossene LEDs. Da die aber sowieso keinen Rückkanal haben sollte sich das ja auch nicht auswirken, oder?


    Und wenn ich schonmal am Fragen bin. Für was ist das Delay in Zeile 111?


    Vielen Dank


    Christopher

  • Hast du denn mal mit 460800 baud versucht, wie oben im Header steht? Die Baudraten sind manchmal recht kritisch, wenn man nicht das richtige einstellt...dann kommt es zu Fehlern.

    - 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

  • Die loop() Funktion hat einiges an overhead. Pack in die setup() ein while(true) {}
    Und da den Inhalt aus der loop().


    Alternativ probiert mal meinen sketch, der ist recht ähnlich zu deinem. https://github.com/chriszero/neobob/blob/master/neobob.ino


    Der delay muss sein. Sonst können die Daten nicht in den strip gepusht werden.
    Habe ich auch drin SHOWDELAY_MIRCO = (NOLEDS * 8 * 20 / 16) + 200; // 20Cycles per bit @ 16MHz & 800kHz


    Teste mal meines ;) du musst nur den Include anpassen

  • Bei hohen Baudraten würde ich im loop kein digitalWrite zum debuggen verwenden, entweder direkt auf den port schreiben oder digitalWriteFast2 verwenden.

  • Wo ist mein Denkfehler?

    Ich meine man kann eigentlich nicht so einfach eine Variable mit dem Typ int (readSerial aus Zeile 41) mit einem char aus dem array für die Variablen prefix bzw. buffer ohne vorherige Umwandlung vergleichen (Zeile 78 )? Wäre es nicht sinnvoll aus readSerial auch ein char zu machen, in die Variable wird ja nie mehr als ein Byte eingelesen.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • chriszero:
    wirbel:
    Ich habe eure Vorschläge einfach mal zusammen umgesetzt. Gleiches Verhalten.



    seahawk1986: So sehr bin ich noch gar nicht in den Code gegangen. Beim Experimentieren bin ich dann darauf auf diese verlorenen Bytes gestoßen.

  • Meinen wolltest du wohl nicht versuchen. ;) Bei meinen Experimenten schaffte nur der Arduino mit FTDI Chip 500000 baud fehlerfrei. Versuchs doch mal mit 460800, wie in deinem ersten Sketch stand.

    - 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

  • seahawk1986: So sehr bin ich noch gar nicht in den Code gegangen.

    Ah ich habe gerade gelesen, dass das laut dem C99-Standard geht, weil der int alle Werte des char abbilden kann.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Blinkt die LED dauerhaft?
    Das die am Anfang blinkt bis der mal den Anfang hat dürfte vertretbar sein.


    Welchen arduino hast du? 3.3V/8Mhz? Oder 5V/16Mhz.
    Baudrate mal reduziert? 50leds ist ja nicht so viel. Obwohl es eigentlich ein vielfaches von 3 sein müsste?! RGB hat immer 3byte. Also eher 51. daran könnte das nämlich liegen.
    Zeigt sich das in optischer Natur ob der bytes verliert?

  • Blinkt die LED dauerhaft?

    Ja

    Welchen arduino hast du? 3.3V/8Mhz? Oder 5V/16Mhz.

    Arduino Uno SMD R3 (also 5V/16Mhz)

    Baudrate mal reduziert?

    Bisher nicht.

    50leds ist ja nicht so viel. Obwohl es eigentlich ein vielfaches von 3 sein müsste?!

    Ähhm. Hää? Moment mal. Hää
    50 RGB LEDs. Also 150LEDs. Du zählst doch pro LED 3 Bytes hoch.


    Zeigt sich das in optischer Natur ob der bytes verliert?

    Ich habe die LEDs noch nicht. Ich habe hier 50 WS2801 und die funktionieren mit NeoPixel nicht.
    Ich hatte es auf FastLED umgebaut und da dann mit meinem Debugzeug den Fehler gefunden und nach und nach wieder zurückgebaut. Eben mangels passender LEDs ohne angeschlossene LEDs.

  • Langsamere Baudrate reduziert nur die Blinkgeschwindigkeit.


    Ist es möglich, dass da doch falsche Zeichen von Boblight kommen und der Zähler deswegen hochläuft?


    Edit: Achja "blinken" ist vielleicht auch übertrieben. Die LED hält mehrere Sekunden die gleiche Farbe.
    Edit2: Farbe ist natürlich auch Quatsch. Geht ja bei der onboard LED nur an oder aus. Ich meine natürlich den gleichen Zustand.

  • Kannst sonst auch mal meinen Sketch mit boblight und den ws2801 versuchen: https://github.com/TheChief79/tpm2arduino Mit LEDs dran, sieht man dann doch mehr.

    - 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

  • Nein du gibst jede led an. Pro RGB led hast du 3 LEDs. Auch in boblight gibst du jede Farbe als einzelne LED an.
    Wenn du 50 RGB LEDs hast musst du 150 LED im Sketch angeben. Und auch in boblight 150 LEDs konfigurieren.
    Der schickt ja immer 3 byte pro RGB led, so steht es ja auch im Sketch. Wenn du jetzt nur 50 angibst geht das nicht auf deswegen deine "verlorene" bytes

  • Code
    case Data:
            if(Serial.available() > 2) { //Mehr als 2 Bytes verfügbar
              Serial.readBytes(buf, 3);  //Lese 3 Bytes
              strip.setPixelColor(pos++, buf[0], buf[1], buf[2]); // 1 Byte Rot, 1 Byte Grün, 1 Byte Blau; pos 1 hochzählen
            }
    
            if(pos > NOLEDS) { //Wenn pos NOLEDS übersteigt --> anzeigen
              state = Show;
            }
            break;


    pos wird pro 3 LEDs 1x hochgezählt. 3 LEDs ergibt eine RGB LED


    Um das aber auch auszuschließen. Mit 150 bei NUMLEDs passiert das Gleiche.


    TheChief: Muss das mit dem Patch sein?

  • Ich würde das morgen mal bei testen, ob da auch bytes verloren werden. Wobei mir das optisch noch nie aufgefallen ist in den 2 Jahren.

    Das ist schon möglich. Das ist ja mal wieder Jammern auf hohem Niveau.


    Ich bin vorhin einfach darauf gestoßen und dachte ich spreche es mal an.
    Mich wundert, dass dein Sketch und der von tweak4all so ähnlich ist. Wer hat da von wem abgeguckt :P

  • Mit Checksumme meinst du ein Postfix?


    Edit:


    Ich habe neobob jetzt wieder auf FastLED umgestellt, damit ich etwas sehen kann. Meine WS2812B Stripes hängen noch irgendwo zwischen China und hier fest.
    Das funktioniert soweit auch problemlos (von den verlorenen Bytes abgesehen)


    Obige Änderung soll auf ein Postfix prüfen. Ich habe erstmal mit einem einstelligen Postfix angefangen und schon damit funktioniert es nicht.
    Das erste auf die LED Werte folgende Byte ist also scheinbar nicht das Postfix Byte.


    Hier mal die Debugausgabe von boblight

    Code
    /dev/ttyACM0 write: 41 64 61 00 c7 92 d8 d8 d8 d7 d7 d7 d5 d5 d5 d3 d3 d3 d0 d0 d0 b9 b9 b9 b0 b0 b0 c3 c3 c3 59 57 57 15 15 15 1b 1e 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 02 02 02 02 0e 0e 0e 0c 0c 0c 0d 0d 0d 03 03 03 0a 0a 0a 09 09 09 0c 0c 0c 0e 0e 0e 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2f 2f ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec e4 e4 e4 a1
    /dev/ttyACM0 write: 41 64 61 00 c7 92 d8 d8 d8 d7 d7 d7 d5 d5 d5 d3 d3 d3 d0 d0 d0 b9 b9 b9 b0 b0 b0 c3 c3 c3 59 57 57 15 15 15 1b 1e 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 02 02 02 02 0e 0e 0e 0c 0c 0c 0d 0d 0d 03 03 03 0a 0a 0a 09 09 09 0c 0c 0c 0e 0e 0e 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2f 2f ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec e4 e4 e4 a1
    /dev/ttyACM0 write: 41 64 61 00 c7 92 d8 d8 d8 d7 d7 d7 d5 d5 d5 d3 d3 d3 d0 d0 d0 b9 b9 b9 b0 b0 b0 c3 c3 c3 59 57 57 15 15 15 1b 1e 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 02 02 02 02 0e 0e 0e 0c 0c 0c 0d 0d 0d 03 03 03 0a 0a 0a 09 09 09 0c 0c 0c 0e 0e 0e 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2f 2f ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec e4 e4 e4 a1
    /dev/ttyACM0 write: 41 64 61 00 c7 92 d8 d8 d8 d7 d7 d7 d5 d5 d5 d3 d3 d3 d0 d0 d0 b9 b9 b9 b0 b0 b0 c3 c3 c3 59 57 57 15 15 15 1b 1e 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 02 02 02 02 0e 0e 0e 0c 0c 0c 0d 0d 0d 03 03 03 0a 0a 0a 09 09 09 0c 0c 0c 0e 0e 0e 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2f 2f ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec e4 e4 e4 a1
    /dev/ttyACM0 write: 41 64 61 00 c7 92 d8 d8 d8 d7 d7 d7 d5 d5 d5 d3 d3 d3 d0 d0 d0 b9 b9 b9 b0 b0 b0 c3 c3 c3 59 57 57 15 15 15 1b 1e 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 02 02 02 02 0e 0e 0e 0c 0c 0c 0d 0d 0d 03 03 03 0a 0a 0a 09 09 09 0c 0c 0c 0e 0e 0e 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2f 2f ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec e4 e4 e4 a1
    /dev/ttyACM0 write: 41 64 61 00 c7 92 d8 d8 d8 d7 d7 d7 d5 d5 d5 d3 d3 d3 d0 d0 d0 b9 b9 b9 b0 b0 b0 c3 c3 c3 59 57 57 15 15 15 1b 1e 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 02 02 02 02 0e 0e 0e 0c 0c 0c 0d 0d 0d 03 03 03 0a 0a 0a 09 09 09 0c 0c 0c 0e 0e 0e 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2f 2f ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec e4 e4 e4 a1
    /dev/ttyACM0 write: 41 64 61 00 c7 92 d8 d8 d8 d7 d7 d7 d5 d5 d5 d3 d3 d3 d0 d0 d0 b9 b9 b9 b0 b0 b0 c3 c3 c3 59 57 57 15 15 15 1b 1e 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 02 02 02 02 0e 0e 0e 0c 0c 0c 0d 0d 0d 03 03 03 0a 0a 0a 09 09 09 0c 0c 0c 0e 0e 0e 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f 2f 2f ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec ec e4 e4 e4 a1


    41 64 61 00 c7 92 == Prefix
    a1 == Postfix

  • Ich habe das jetzt mal mittels des freien Serial TX gedebuggt. Boblight braucht ja nur den RX des Arduino, und der hat ja FullDuplex ;) Besser als die LED Blinken zu lassen.


    1. Wenn in in Boblight.conf zb. "channels" auf 30 steht, heißt das es sind 10 RGB LEDs
    2. dementsprechend die 10 LEDs im Sketch eintragen
    3. Logikfehler im Sketch, die 2 IF vertauschen. Der hatte immer 3 byte zuviel aus dem Serialbuffer gelesen, folglich passte der nächste Prefix nicht. Boblight zählt 1 basiert, unser Vergleich aber 0 basiert.


    4. Etwas komisch wird es wenn die Anzahl der LEDs größer 10(30) ist, dann läuft was gewaltig schief, (Zu hohe Baudrate, Puffer läuft voll, sonst was? )


    Habe jetzt heute keine Zeit und Lust mehr der Sache auf den Grund zu gehen, die Tage mal...

Jetzt mitmachen!

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