LED Matrix Demo Applikation (.NET)

Guten Tag zusammen,

ich habe schon vor längerer Zeit mit dem Gedanken gespielt ein Programm zu entwickeln, welches mir am Computer hilft meine Animationen für den LED Coffee Table zu entwerfen.
Ziel sollte es sein, dass man einfach Algorithmen testen kann um diese dann auf seinen Arduino zu übertragen.

Der Versuch ein paar nette Animationen zu sammeln ist leider nicht so sehr erfolgreich gewesen :~

Das Programm sieht wie folgt aus:

Reiter Actions:
Unter Demo können ein paar Animationen ausgewählt werden und per Klick auf den Start-Button aktiviert werden.
Das Interval beschreibt die Zeit zwischen jeder Aktualisierung.
Die Button daneben legen die verwendeten Vordergrund- oder Hintergrundfarben fest. Die Farbe, die für den Vordergrund verwendet wird, kann auch gleichzeitig per linker Maustaste auf die Matrix übertragen werden.


Reiter Setup:
Hier kann die Richtung der LED-Kette festgelegt werden. Das ist nötig, wenn man nicht per Koordinatensystem, sondern per Array, bzw. LED-Nummer die Farbe ändern möchte.
Weiterhin können die LED´s als Rechteck oder Kreis, 2 oder 3 Dimensional angezeigt werden. Label blendet die laufende Nummer der LED´s ein.
Größe und Abstand der LED´s ist selbsterklärend, denke ich.
Per Save & Load können die aktuellen Einstellungen und die angezeigte Matrix per XML exportiert & wieder importiert werden.
Image wandelt ein Bild um, Folder zeigt alle Bilder in einem Ordner nacheinander an. Dabei muss allerdings der Pixelflow auf UpperLeftToBottom stehen.

Reiter Info:
Zeigt die aktuelle Farbe und Transparenz zu der LED an, die sich gerade unter dem Mauszeiger befindet.

Im Anhang befindet sich weiterhin das Programm zum ausführen und der Quellcode der Anwendung (Visual Studio 2010 Projekt in C# ).
In dem Programmcode der Form LED Matrix ist allerhand Code für die Button, Laden und Speichern der Einstellungen, usw. Wichtig ist erstmal nur die Funktion private void Loop(). Diese kann verwendet werden um eigene Animationen zu programmieren. Die Grundlegenden Funktionen sind dort bereits zu Demonstrationszwecken enthalten:

            //All Pixel
            matrix.All(backgroundColor);
            DisplayMatrix();

            //First Pixel
            matrix.SetLed(0, foreColor);
            DisplayMatrix(1000); //1 Second Delay

            //Last Pixel by coordinates
            matrix.SetPixel(matrix.GridWidth - 1, matrix.GridHeight - 1, foreColor);
            DisplayMatrix();

            //Set PixelRange
            matrix.SetRange(3, 8, foreColor);
            DisplayMatrix();

            //Set Pixel Range by coordinates
            matrix.SetPixelRange(2, 3, 7, 8, foreColor);
            DisplayMatrix();

            //Draw a Circle
            matrix.DrawCircle(5, 4, 4, matrix.RandomColor());
            DisplayMatrix();
            //Fill this Circle
            matrix.FillCircle(5, 4, 4, matrix.RandomColor());
            DisplayMatrix();

            //Draw Rectangle
            matrix.DrawRect(1, 1, 8, 8, matrix.RandomColor());
            DisplayMatrix();

Die Funktionen sind an die Library von Bliptronics angelehnt. Das ermöglicht quasi eine 1:1 übernahme des Codes in die Arduino IDE.
Die Library habe ich für mich etwas angepasst und erweitert. Die stelle ich gerne auch nochmal zur Verfügung. Sicherlich kann man diese relativ einfach auch für andere Hersteller anpassen.

Geplant ist noch ein Protokoll um per Serieller Schnittstelle direkt mit dem Arduino zu kommunizieren und die LED´s live zu steuern.

Über etwas Feedback würde ich mich freuen :slight_smile:

Gruß,
Thomas

Setup.jpg

LED Matix Anwendung.zip (72.7 KB)

LED Matrix Source.zip (110 KB)

Hi Trib,

das ist ein interessanter Anfang! Ich würde mir viel mehr Interaktionsmöglichkeiten wünschen: Formeln eingeben und simulieren zum Beispiel. Momentan kann man ja "nur" aus Deinen fertigen Effekten auswählen, wenn ich das Recht verstehe.

Plasma- und Feuereffekte, Fraktale, Wobblingsachen, Filter und Ebenen, Formeln deren Parameter durch Formeln mit Parametern manipuliert werden...wo man halt immer was Neues sieht, Zellautomaten...

"Rohdatenexport" wäre hilfreich, also ein 3dimensionales 2dimensionales Array mit den RGB Werten drin...

Was auch schick wäre: GIF-Import, um auf einem größeren Tisch fix mal ein Icon/Photo einbinden zu können.

Ideen hätt´ ich da noch viele.

Und dann können wir über die komplexen Inhalte mit unserer neuen Überblendfunktion drüberfahren, damit das alles butterweich wird, das wäre doch mal was. :slight_smile: (http://arduino.cc/forum/index.php/topic,151103.0.html)

Ein Coffetable, auf dem alles schön smooth läuft und nicht von einem Bild zum nächsten stolpert, das habe ich die ganze Zeit im Hinterkopf.

Dran bleiben, die Idee hat Potential!

Helmuth.

P.S. Und eine Adaption für 1 dimensionale Displays = Strips. Ok, gefunden.

Flow direction "Zick zack" wäre noch was für die Spezis, die so verkabelt haben...

Hallo Helmuth,

danke für deine Antwort!

Helmuth:
Ich würde mir viel mehr Interaktionsmöglichkeiten wünschen: Formeln eingeben und simulieren zum Beispiel. Momentan kann man ja "nur" aus Deinen fertigen Effekten auswählen, wenn ich das Recht verstehe.

Es liegt der Quellcode in Anhang offen, so dass jeder (Vorrausgesetzt er hat Visual Studio installiert) seine eigenen Effekte programmieren kann.
Dazu gibt es zahlreiche Hilfsklassen, so dass es auch für C# Fremde kein Problem darstellen sollte.
Die Funktionen SetPixel oder SetRange sind dabei sicherlich selbsterklärend.
Zwar hatte ich erst überlegt eine Möglichkeit zu schaffen, Code auch von außen verarbeiten zu lassen. Die Grundfunktionalitäten von Visual Studio sind aber so umfassend, dass ich die nicht alle nachprogrammieren wollte. (Syntax Highlighting, Intellisense, JustInTime Überprüfung, usw.)

Helmuth:
Plasma- und Feuereffekte, Fraktale, Wobblingsachen, Filter und Ebenen, Formeln deren Parameter durch Formeln mit Parametern manipuliert werden...wo man halt immer was Neues sieht, Zellautomaten...

Finde ich auch gut! Es steckt ja erstmal alles in den Kinderschuhen. Ein paar Dinge habe ich auch schon für den Arduino fertig, aber noch nicht in die Anwendung übernommen. Wollte die nicht zu voll packen.

Helmuth:
"Rohdatenexport" fehlt mir, also ein 3dimensionales Array mit den RGB Werten drin...

Kommt! Muss mir nur ein sinnvolles Format überlegen. Bzw. ihr helft mir eine schlanke Lösung zu erarbeiten.
Entweder exportiert man immer alles oder nur die LEDs die auch wirklich geändert werden. Das würde die Datei deutlich verkleinern. Bin da offen für Anregungen!

Helmuth:
Was auch schick wäre: GIF-Import

Glaube das ist garnicht so kompliziert, da die Bilderumwandlung recht offen von mir programmiert wurde. Man müsste vorher nur die einzelnen Frames des Gifs auseinander nehmen.

Helmuth:
Und dann können wir über die komplexen Inhalte mit unserer neuen Überblendfunktion drüberfahren, damit das alles butterweich wird, das wäre doch mal was. :slight_smile: (http://arduino.cc/forum/index.php/topic,151103.0.html)

Eine Art Ambiente-Beleuchtung hatte ich auch mal realisiert. Die änderte in einem vorgegebenen Interval die Farbe von einer zur anderen. Kann ich ebenfalls aus meinem Arduino-Projekt übernehmen. (Bzw. schaue ich mir mal eure Lösung genauer an)

Vielen Dank nochmal für dein Interesse!

Finde ich auch gut! Es steckt ja erstmal alles in den Kinderschuhen. Ein paar Dinge habe ich auch schon für den Arduino fertig, aber noch nicht in die Anwendung übernommen. Wollte die nicht zu voll packen.

Naja, so ist es halt noch ziemlich "Brot und Butter", also nix wirklich neues/besonderes.

"Rohdatenexport" fehlt mir, also ein 3dimensionales Array mit den RGB Werten drin...

Kommt! Muss mir nur ein sinnvolles Format überlegen. Bzw. ihr helft mir eine schlanke Lösung zu erarbeiten.
Entweder exportiert man immer alles oder nur die LEDs die auch wirklich geändert werden. Das würde die Datei deutlich verkleinern. Bin da offen für Anregungen!

Mach eine Lösung für alles ohne Sonderfälle = jedesmal kompletten Inhalt ausgeben, den man dann mit anderen Funktionen rumschubsen kann.

byte complete_frame[all_leds][3]={ ... };

Das wäre später am einfachsten und schnellsten zu behandeln.

Helmuth:
Was auch schick wäre: GIF-Import

Glaube das ist garnicht so kompliziert, da die Bilderumwandlung recht offen von mir programmiert wurde. Man müsste vorher nur die einzelnen Frames des Gifs auseinander nehmen.

Ok, das wäre der 2. Schritt. Ich dachte vorerst nur an Standbilder.

Helmuth:
Und dann können wir über die komplexen Inhalte mit unserer neuen Überblendfunktion drüberfahren, damit das alles butterweich wird, das wäre doch mal was. :slight_smile: (http://arduino.cc/forum/index.php/topic,151103.0.html)

Eine Art Ambiente-Beleuchtung hatte ich auch mal realisiert. Die änderte in einem vorgegebenen Interval die Farbe von einer zur anderen. Kann ich ebenfalls aus meinem Arduino-Projekt übernehmen. (Bzw. schaue ich mir mal eure Lösung genauer an)

Diese Funktion fährt JEDEN Pixel eines Arrays weich von einem RGB Wert zum nächsten über n Zwischenbilder...schau Dir das mal genauer an, es lohnt sich für diese Art von Projekt.

Beste Grüße, weitermachen! :wink:

Helmuth

Nachtrag: live steuern finde ich selbst nicht so spannend, aber http://www.solderlab.de/index.php/software/glediator kennst Du, oder? Bevor Du das Rad neu erfindest...

Hier ein paar Eindrücke, was man damit machen kann: https://www.youtube.com/results?search_query=glediator+matrix&oq=glediator+matrix&gs_l=youtube.3...9682.11092.0.11300.7.7.0.0.0.0.121.653.6j1.7.0...0.0...1ac.1.QXay8MeNXfI

Die fps-rate einer Matrix ist ja im wesentlichen durch die Geschwindigkeit der Kommunikation mit den PWM Chips begrenzt, mit ´nem WS2812 gehen z.B. ca. 30 fps bei 500 LEDs. Das reicht für eine 22x22 Matrix, was doch für den Anfang ganz ok ist. :wink:

Mach Dir also keine Sorgen, den Datenstrom "schlank" zu halten, mach es so universell wie möglich, damit man das auf möglichst viele Projekte portieren kann.

Nochmal ich, habe mir Deine Ausgabe vom Programm mal angesehen, jetzt weiß ich was Du mit Datei "schlank halten" meinst... :wink: Momentan sieht Dein Output ja so aus:

  <Chain>
    <LED>
      <ID>0</ID>
      <R>112</R>
      <G>129</G>
      <B>173</B>
      <Opacity>255</Opacity>
      <RGBColor>
        <R>112</R>
        <G>129</G>
        <B>173</B>
        <A>255</A>
      </RGBColor>
    </LED>
    <LED>
      <ID>1</ID>
      <R>48</R>
      <G>82</G>
      <B>157</B>
      <Opacity>255</Opacity>
      <RGBColor>
        <R>48</R>
        <G>82</G>
        <B>157</B>
        <A>255</A>
      </RGBColor>
    </LED>

Kreiere doch ein neues Dateiformat, z.B. die ersten 2 Byte = Zeilen der Matrix, Byte 3 und 4 = Spalten und dann schreibst Du am Stück und ohne irgendetwas dazwischen nacheinander für jeden Pixel r, g und b rein. Dann könnte man das intern (im Arduino) direkt und schnell weiterverwenden. Eventuell auch erst alle r, dann alle g, usw.

Ich weiß nicht, wie so ein 2dimensionles Array im Arduino RAM abgelegt wird, vielleicht (hoffentlich) kann das jemand anderes beantworten, aber ich würde es auf jeden Fall genauso machen, damit Du Dir jede spätere Konvertierung sparen kannst.

Dann kopierst Du das alles in einem Zug z.B. von einer SD Karte in den RAM und vergeudest keine Zeit, die relevanten Infos (Farbwerte) in der Datei zu suchen und einzeln rauszupopeln...

Grüße Helmuth

edit: Falls man SD und FastSPI gleichzeitig zum Laufen bekommt... siehe hier: http://arduino.cc/forum/index.php/topic,151630.0.html

Die Funktion die Matrix zu Importieren und zu Exportieren hat aktuell nichts mit dem Arduino zu tun. Sie dient einzig und allein dazu seine gerade kreierte Matrix samt Einstellungen persistent abzulegen :slight_smile:
In .NET ist es dazu üblich auf eine XML-Struktur zu setzen, da das Framework einem quasi jegliche Arbeit abnimmt XD

Wie gesagt, der Plan war erstmal ein vernünftiges Format zu erarbeiten bevor ich an einem für den Arduino lesbaren Export baue.
Ein Zweidimensionales Array würde ich nicht verwenden. Das erzeugt nur unnötig mehr Daten. Ob ich nun Koordinaten mit gebe oder einen laufenden Index, macht letztendlich keinen Unterschied, da ich die Datei ohnehin Zeilenweise auslesen muss.
Wenn immer alle LED´s gespeichert werden, könnte ich dann sogar auf den Index verzichten.
(Je länger ich darüber nachdenke macht es nur Sinn alle LED´s zu exportieren. Für Reihenweise Färbungen o.ä. sollte man ohnehin lieber programmieren und nicht auf eine Textdatei setzen)

Optimaler weise sollten die Trennzeichen auch weise gewählt werden um diese auf dem Arduino vernünftig verarbeiten zu können. Z.B. statt einem Zeilenumbruch (2 Zeichen) nur ein ; zu verwenden oder so.
Also:
255,255,255;5,27,100;255,0,255;0,255,255*
wobei das ";" die Farben trennt und der "*" das Ende der Matrix beschreibt. Dann können auch mehrere Animationen in eine Datei abgelegt werden. Bei meiner 10x10 Matrix ist die Datei dann ~2KB groß bei einer 50x50 Matrix schon ~28KB.

Das Glediator-Programm sieht schonmal super aus. Da kann ich sicherlich einige Anregungen einholen. Da ich schon ein fertiges Programm für die Serielle Schnittstelle habe, werde ich es trotzdem integrieren. Schadet ja nicht :wink:

Trib:
Die Funktion die Matrix zu Importieren und zu Exportieren hat aktuell nichts mit dem Arduino zu tun. Sie dient einzig und allein dazu seine gerade kreierte Matrix samt Einstellungen persistent abzulegen :slight_smile:
In .NET ist es dazu üblich auf eine XML-Struktur zu setzen, da das Framework einem quasi jegliche Arbeit abnimmt XD

Ok, davon habe ich keine Ahnung.

Wenn immer alle LED´s gespeichert werden, könnte ich dann sogar auf den Index verzichten.
(Je länger ich darüber nachdenke macht es nur Sinn alle LED´s zu exportieren. Für Reihenweise Färbungen o.ä. sollte man ohnehin lieber programmieren und nicht auf eine Textdatei setzen)

Genau das meine ich mit ganzes Frame ablegen. Auf dem Arduino eine handvoll Effektfunktionen, die sich easy formulieren lassen und Dein Programm für den schwierig oder gar nicht berechenbaren Content.

Optimaler weise sollten die Trennzeichen auch weise gewählt werden um diese auf dem Arduino vernünftig verarbeiten zu können. Z.B. statt einem Zeilenumbruch (2 Zeichen) nur ein ; zu verwenden oder so.
Also:
255,255,255;5,27,100;255,0,255;0,255,255*

Wozu? 8 Bit = 1 Byte = 256 mögliche ASCII Codes. Was willst Du mehr? Du speicherst nicht als lesbaren Text, sondern schreibst das dem Farbwert entsprechende ASCII Zeichen in die Datei. Du definierst den Zustand einer LED mit 3 aufeinander folgenden Bytes in der Datei. Wozu Trennungen? Du definierst ein Dateiformat und dann weißt Du hinterher ganz genau, dass z.B. das 30. Byte der Datei dem 8bittigen Blauwert der 10. LED entspricht. Du willst doch während des Programmablaufs nicht ewig in der Datei nach Trennungen rumsuchen und dann konvertieren, was Du findest, sondern Du willst einfach die Daten haben - und das möglichst flott. Spielt doch keine Rolle, dass DU die Datei nicht mehr wirklich lesen kannst, weil es nur noch eine Ansammlung von Sonderzeichen ist.

edit: Vor Programmbeginn überprüfst Du einmal, wie groß die Datei ist, woraus sich eindeutig schlussfolgern lässt, wieviele Frames sie beinhaltet.

Das Glediator-Programm sieht schonmal super aus. Da kann ich sicherlich einige Anregungen einholen. Da ich schon ein fertiges Programm für die Serielle Schnittstelle habe, werde ich es trotzdem integrieren. Schadet ja nicht :wink:

Freut mich das zu hören, ich fürchtete schon, Du verlierst die Lust an Deinem Programm, nachdem Du Dir das angeschaut hast :wink:

Beste Grüße