LED Matrix mit GLEDIATOR/PixelController und Protokoll - Hilfe

  • Hallo liebe LED Community!


    Habe mich nun nach etlichen Tagen durchlesen dazu entschieden mich hier zu registrieren!


    Leider habe ich ein Problem mit meiner kleinen LED Matrix. Erstmal zur Erklärung der Hardware:


    LED Matrix bestehend aus 10 Streifen der APA102 LEDs mit je 10 Pixeln (Also 10x10 Pixel Matrix)
    500W Netzteil (ja, overkill :D )
    Steuerung: Diverse (Arduino Uno, Nano, Due, Pro Micro, ESP8266, selbstbau Teensy bzw. ATmega 32u4 Konform)
    Anordnung der Pixel: Schlangenförmig (Pixel 1 ist oben Links, Pixel 11 2. Reihe ganz Rechts)


    Die Matrix habe ich mit einer selbstgeschriebenen Arduino Software zum laufen bekommen. Dann kam ich auf die Idee, eine Software zu schreiben, die Bilder an die Matrix schickt. Habe ich nicht hinbekommen :(. Bin dann aber zufällig auf die Software Glediator und PixelController von PixelInvaders gestoßen.


    Super! Genau so was hab ich gesucht! Maximale Einstellungsmöglichkeit und viele unterstütze Protokolle.


    Leider unterstützen die Protokolle nur diese vermalledeiten WS2812 LEDs... Was ist mit den tollen APAs? :thumbdown: Also dachte ich mir, ich schreibe die Software für den Arduino um. Da fällt die von GLEDiator schon mal weg, da sie in reinem C geschrieben ist, und ich damit erst vor kurzem anfing. Ergo: Kann ich nicht modden. Die TPM2 serial des PixelControllers sieht sehr gut aus! Nutzt die FastLED library, welche inzwischen auch die APA102 LEDs unterstützt. Ideal!


    Also habe ich den Code umgeschrieben, damit er lauffähig mit den APA102 LEDs ist. Müsste funktionieren, da ich nur zwei Zeilen des Codes verformt habe. Der rest blieb beim Ursprung. Außerdem habe ich eine "Testroutine" eingebaut, welche alle Pixel auf Rot schaltet - Funktioniert wunderbar.


    Hier der Code:



    Diesen Code habe ich auf meinen Arduino Nano draufgemacht. Teste ich es nun mit GLEDiator, passiert nichts. Die RXD LED des Arduinos flickert/leuchtet wie blöd, es passiert aber nichts. Also habe ich zu Testzwecken eine USB to UART bridge dran gehangen und mal mitgesnifft. Ich erhalte nur datenmüll! So sehen die Daten aus, die vom PC an den Arduino gesendet werden:


    Ja, ich habe den richtigen COM Port und die richtige Baudrate (115200) ausgewählt.


    Probiere ich das selbe mit PixelController, sieht das so aus:


    ?(


    Jetzt die große Frage - Wie bekomme ich das alles zum Laufen.


    Habe ihr irgendwelche Ideen, Tipps oder Vorschläge? Ich könnte auch andere Protokolle oder Hardware nutzen, sofern diese die APA102 LEDs unterstützt bzw. der Code so modifiziert werden kann, dass er es unterstützt. Ich hätte auch die Möglichkeit, ArtNET oder TPM2.net zu nutzen - In verbindung mit meinem Arduino LAN Shield oder sogar einem ESP8266. Heißt aber wieder nicht wenig Arbeit für mich. Naja, das ist es mir wert.


    Ich hoffe wirklich dass ihr mir helfen könnt. Ich bedanke mich jetzt schon mal bei euch!


    Es grüßt


    Kentsfield

  • Leider unterstützen die Protokolle nur diese vermalledeiten WS2812 LEDs... Was ist mit den tollen APAs?


    Diese Protokolle (tpm2, tpm2.net, Glediator-Protokoll, etc.) unterstützen *weder* APA102 *noch* Ws2811 und Konsorten. Die Protokolle dienen nur dazu, die Daten definiert über eine Schnittstelle zu übertragen. Angesteuert werden die LEDs mit einem eigenen Protokoll, eben WS2811 oder APA, oder was es halt ist.


    die FastLED library hat auch absolut nix mit tpm2 zu tun. Die Lib ist dafür da, Daten aus dem Arduino an die jeweiligen LED-Chips auszugeben. Wie sie in den Arduino rein kommen (eben z.B. über TPM2) ist wieder eine andere Sache.


    Du brauchst also zwei Sachen in Deinem Sketch:


    1. Eine Routine, die Daten über tpm2 empfängt und in einen Puffer schreibt (gibt's irgendwo, mal nach Arduino und tpm2 googeln)
    2. Eine Routine, die die Daten aus diesem Puffer liest und an die LEDs ausgibt (z.B. die FastLED library)


    Ich erhalte nur datenmüll! So sehen die Daten aus, die vom PC an den Arduino gesendet werden:


    Stell doch mal die Anzeige auf Hex statt auf Ascii, dann sieht man auch, was da wirklich rauskommt... wenn Du Bytes, bei denen eigentlich der Wert (0-255 bzw. 00-FF) interessiert als Ascii-Zeichen darstellst, ist das klar, dass es wie "Müll" aussieht :D

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Ich hüpfe vor freude, denn - es funktioniert!


    Ich habe von djnijo Hilfestellung samt funktionierendes Script bekommen - Ich musste es nur leicht modifizieren.


    Tausend dank an alle und besonders an djnijo!


    Für alle interessierten, hier mein Script - Voll funktionsfähig mit Jinx! und APA102 LEDs.


  • Wie Klasse,


    wie lange habe ich genau dafür einen funktionierenden Sketch gesucht.
    um danke zu sagen, wollte ich mich extra anmelden :)


    nur kommt mir da noch eine Frage:
    Ich habe versucht, das Script so zu ändern, dass immer 2 LEDs zusammen gehören. (das benötige ich, weil ich immer 2 auf einen Wasserball geklebt habe (Bilder folgen))
    Nur dann funktioniert es nicht mehr.


    Habe dazu versucht, in Zeile 175 die Schleife zu verändern, dass sie
    [/i]setLedColor(led, r, g, b);[i]
    und
    [/i]setLedColor(led+1, r, g, b);


    ändert. Aber ich kann dazu ja nicht einfach die "led" Variable 2x inkrementieren lassen oder?


    Vielen Dank für das klasse Forum. Ihr habt mir allein durch mein Mitlesen schon sehr viel geholfen :)

  • 1) Soweit ich das sehe, sollte an dieser Stelle nichts anderes passieren. Die Routine setzt doch einfach alle LEDs auf dieselbe Farbe. Da ist es doch wohl egal, ob du zwei zusammenfasst oder nicht?!


    2) Im letzten Schleifendurchlauf bekommst du mit deiner Variante nen Speicherzugriffsfehler, da du nur NUM_LEDS definiert hast hier aber auf LED Nummer NUM_LEDS zugreifen willst (Zähler beginnt bei Null und endet bei NUM_LEDS-1). Außerdem schaltest du jede (bis auf die erste) doppelt auf die Farbe:

    Code
    for (int led = 0; led < NUM_LEDS; led++)
    {
        setLedColor(led, r, g, b);
        setLedColor(led+1, r, g, b);
    }


    Hierfür Abhilfe müsste das schaffen:

    Code
    for (int led = 0; led < NUM_LEDS; led += 2)
    {
            setLedColor(led, r, g, b);
            setLedColor(led+1, r, g, b);
    }


    Richtig sinnvoll ist es aber immer noch nicht (siehe Punkt 1)