Impressum DatenschutzerklärungDiese Seite per HTTPS ansehen.


Arduino mit 32x32 RGB LED Matrix geschrieben am 16.02.2014

Durch einen glücklichen Zufall bin ich über eBay an ein 32x32 RGB LED Matrix Panel sehr günstig gekommen.

Eine andere günstige Quelle ist www.exp-tech.de - ca. 40,- EUR wenn verfügbar.

Nachdem ich mir die Pin-Belegung zusammengesucht und die Adafruit_GFX- und RGBmatrixPanel-Bibliothek geladen habe funktionierte der erste Test auf Anhieb.

colorwheel demo

Die Power des von mir verwendeten Arduino Mega 2560 reicht aus um das Plasma-Demo einigermaßen flüssig abzuspielen:


erste eigene Grafik

Die o.g. Bibliothek erlaubt es mit einfachen Befehlen Grafiken zu zeichnen. Hier habe ich mal das Arduino-Logo nachgebaut:

int c=matrix.Color444(15, 15, 15); matrix.fillCircle(16,16,15,matrix.Color444(0, 1, 1)); matrix.drawLine(8,21,10,21, c); matrix.drawLine(5,19,7,21, c); matrix.drawLine(4,15,4,18, c); matrix.drawLine(6,12,4,14, c); matrix.drawLine(7,11,10, 11, c); matrix.drawLine(11,11,21, 21, c); matrix.drawFastHLine(15, 16, 3, c); matrix.drawLine(11,21,21, 11, c); matrix.drawLine(22,11,25, 11, c); matrix.drawLine(26,12,28, 14, c); matrix.drawLine(28,15,28, 18, c); matrix.drawLine(27,19,25, 21, c); matrix.drawLine(22,21,24, 21, c); matrix.drawLine(7,16,11, 16, c); matrix.drawLine(21,16,25, 16, c); matrix.drawLine(23,14,23, 18, c);

Man kann es auch animieren, dann sieht es so aus:


Hardwaremodifikation

Da quadratische Pixel besser zusammenpassen als Punkte, habe ich mit meinem 3D-Drucker Gitter (Raster 6x6mm²; 3mm hoch) ausgedruckt und es auf dem Panel befestigt:

Matrix

Leider reicht meine Druckfläche nicht aus um das ganze Gitter zu drucken.
Als Bildschirm dient ein normales Blatt Papier.

Nebenbei habe ich auch angefangen mit ein kleines Mal und Animationsprogramm zu schreiben.
Hier im Video sieht man noch den Versuch mit weißem PLA. Da kam es aber einen Ghosting-Effekt (die benachbarten Pixel leuchteten mit), so das ich das Gitter dann mit schwarzen PLA druckte:


TODO (erledigt)

Momentan bin ich dabei das Animationsprogramm zu erweitern, ein Gehäuse zu suchen (Ikea RIBBA) und das Board mit einem Ethernet-SD-Shild auszustatten.
Dabei musste ich die Pins für die RGB-Matrix neu zuordnen:

#define OE 34 #define LAT 35 #define CLK 36 #define A A12 #define B A13 #define C A14 #define D A15

Damit das Funktioniert muss in der RGBmatrixPanel.cpp in Zeile 58 von PortB auf PortC gewechselt werden:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ... #define DATAPORT PORTA #define DATADIR DDRA #define SCLKPORT PORTC //old PORTB ... PINs mit neuer Belegung

[update: 15.2.2014]
Die erste Version des Webinterface ist fertig. Damit kann ich Dateien auf die SD-Karte im Arduino hoch laden und Animationen starten und Stoppen.

Und auch eine neue Animation habe ich erstellt:


Animationsformat

Um die Animation möglichst klein und einfach zu halten, habe ich folgende Befehle definiert:

frgb //fillScreen lxxyyxxyyrgb //line pxxyyrgb //drawpixel dxxxx //delay

rgb steht dabei für die zu verwendeten Farbe. Jeder Farbkanal kann einen Wert von 0..9 und A..F (10..15) annehmen. Die Farbe ist somit im Format 444 definiert - das macht ca. 4096 verschiedene Farben.

Mit f kann der Bildschirm mit einer Farbe gefüllt werden. Ich setzte den Befehl immer von den Bilddaten, damit der Bildschirm gelöscht wird (f000).

Zum Zeichnen einer Linie kommt nach dem Befehl l der Startpunkt, danach der Endpunkt und die Farbe. xx und yy können Werte von 00 bis 99 annehmen, die führende 0 ist zwingend. Der maximale sinnvolle Werte ist 31, da mein Pannel 32x32 Pixel groß ist.

Mit p kann ein Pixel mit der Farbe rgb an Position xxyy gemalt werden.

Mit dem Befehl d wird definiert, wie lange nach dem Bild gewartet werden soll bis das nächste Bild angezeigt wird. Die Zeit geht von 0000 bis 9999 Millisekunden (mit führenden Nullen). Für eine Bildwiederholrate von 25 Bilder pro Sekunde würde man einen Wert von 0040 nehmen.

Das erste Bilder der oben zu sehende Animation ist dann so codiert:

f000 l12041604f00 l11051705f00 l10061806f00 l10071507f00 p1607fff l17071807f00 l10082008f00 l10091809f00 l11101710f00 l12111611f00 l13121512f00 l13131513f00 l11141914f00 l07151015f00 l12151615f00 l20152315f00 p0616f00 l11161716f00 l11171717f00 l11181718f00 l10191819f00 l10201820f00 l11211721f00 l12221622f00 p1223f00 p1623f00 p1224f00 p1624f00 p1125f00 p1525f00 p1126f00 p1526f00 p1027f00 p1527f00 l10281328f00 l15281828f00 d0100

Pixel gleicher Farbe die hintereinander kommen habe ich mit der Lauflängenmethode kodiert und per Line definiert (z.B. l15281828f00).

Als Dateiendung habe ich momentan ".ANI" gewählt. Diese Dateiendung wird im Webinterface auch vorgefiltert, so das man in der einfachen Ansicht nur die Animationen angezeigt bekommt.

Steuerung per Web

Klickt man auf das "+" sieht man die komplette Liste und Unterordner. Dazu die Möglichkeit Dateien hoch zu laden oder zu löschen.

[update 09.03.2014] der Editor ist fertig, auf Seite der Soft- und Hardware funktioniert alles:

A: Arduino Pixelmatrix Editor

TODO

  • Ethernet (Webserver) OK
  • SD (load Animation) OK
  • Echtzeituhr für ein richtiges Dateidatum OK (per Client)
  • Animationsprogramm für iPad/Handy (Web/HTML5) OK
  • Als Bildschirm anderes Papier ausprobieren (grau,schwarz,dünner...)
  • Gitter genauer?

Da der Arduino keine Uhr hat, hatte ich überlegt einen entsprechenden Chip einzubauen. Nun habe ich eine andere Lösung gefunden: da die Dateien von einem Webbrowser kommen übertrage ich im Header mit...

JavaScripttheXMLHttpRequest.setRequestHeader("X-Date",getDatum());

...das aktuelle Datum und die Zeit des Webbrowsers!

Aktueller Arduino Mega 2560 Code (IP ist auf 192.168.0.12 eingestellt):
download: my32x32_rgb_led_matrix_net_SD.ino 39.55kb
und alles was zur Zeit auf der SD-Karte liegt (Editor, Animationen):
download: SD-Karte_2014-03-15.rar 83.68kb
Der Code ist frei benutzbar.

Dazu wird die SdFat, RGBmatrixPanelmaster und AdafruitGFXLibrarymaster-Bibliothek benötigt.

neues Herz mit mehr Power

[update: 01.05.2018] Das Projekt ist jetzt umgestellt, es wird jetzt mit einem ESP32 betrieben, siehe github.
Es sind jetzt Bildwiederholraten von bis zu 25fps möglich (theoretisch bis zu 50 aber ich lasse im ESP32 nur 25 zu).

Dazu wurde das Dateiformat erweitert: beim speichern werden zusammenhängende Blöcke gesucht-das spart wieder einiges an Speicherplatz.

r01021015024

r steht für Rechteck, dann kommen 01 und 02 für die obere linke Ecke; 10 die Breite. 15 die Höhe. Die restlichen drei Werte stehen für die Farbe (siehe oben).

Datum und Uhrzeit der Datei wird nicht mitgespeichert.

Kommentare:


#1 Martin schrieb am 28.06.2015 um 17:40
Coole Idee das mit dem Raster und sieht deutlich besser aus das Bild. Viel Spass noch damit!

#2 Mirko schrieb am 04.06.2016 um 09:24
Hallo,
Tolles Projekt. Was die Oberfläche angeht würde ich mal ne Folie aus nem TFT Panel probieren. Gleich hinter dem eigentlichen Glas Panel befinden sich zwei bis drei verschiedene lichtdurchlässige Folien die man aufs Gitter setzen könnte.



Inhalt zur freien Verwendung gibs es beim Thema Downloads.
nach oben springen
mehr auf: Instagram, github, thingiverse