2048 Pixel RGB-LED-Matrix: Basic

In den vergangenen Tagen habe ich mich in meiner Freizeit mal wieder meinem Lieblingsthema gewidmet: der LED.

Über das ledstyles.de Forum bin ich in einem Beitrag auf die Adafruit RGB-LED-Matrizen aufmerksam geworden. Diese hatten schon für schmales Geld 512 Pixel an Board. Natürlich kommen die Panels ursprünglich aus China und so beschloss ich diese dort für 10 € a 512 Pixel zu bestellen. Vier Stück, insgesamt 2048 Pixel und 6 mm Pitch, sollten erstmal ausreichend sein.

Die Ansteuerungen, die Adafruit im Paket hatte, überzeugen mich gar nicht: zu wenig Farbstufen (selbst bei dem FPGA Projekt) oder einfach nicht flackerfrei, wie mit dem Raspberry PI versucht wurde… klar, ist ja auch kein Echtzeitbetriebsystem!

Nun stellte sich natürlich die Frage wie ich es ansteuern werde. Ein Kumpel erzählte mir vom TI Cortex M3 Stellaris Nachfolger, der Tiva Cortex M4 Controller. Glücklicherweise gab es das Dev-Board mit Ethernet für gerade mal 15 € (!!) direkt von TI versandkostenfrei (TM4C1294). Das Discovery F4 Board darf nun in den Schubladen verschwinden, wenn ihr Ethernet braucht. 😉

Also schnell entschieden das (für Dev-Board-Verwendung) kostenlose CC Studio 5.4 aufzuspielen und einige Speedtests durchzuführen. Wichtig ist, dass einkommende Daten schnell genug verarbeitet werden können. Hier übernimmt der mit 120 MHz getaktete Prozessor die Aufgabe, dass eingehende Bilddaten DMA gerecht aufbereitet werden. Dies kostet sehr viel Speicher, bringt aber den Vorteil, dass das Schreiben der Pixeldaten, kaum mehr CPU Ressourcen benötigt und damit hohe Refresh-Raten erreichbar sind.

Der Speedtest offenbarte, dass ich die Idee weiter verfolgen kann. Ein Eingangs-Bild mit 512 Pixeln konnte in ein Ausgangs-Bild mit 256*256 Byte 57 mal die Sekunde umgerechnet werden. Das reicht für die übliche DMX Geschwindigkeit oder ist mehr als doppelt so viel, wie LED-Programme wie Jinx! und Glediator bei 25 Hz benötigen. Somit können gar zwei Panels berechnet werden.

Den Quellcode und die Techniken, möchte ich in den nächsten Blogeinträgen weiter erläutern. Hier erst einmal die Liste der Funktionen:

  • Es wird eine WS2801 Pixel Matrix emuliert. Ihr könnt also bereits bestehende LED-Controller zur Ansteuerung verwenden.
  • Alle Boards sind wie WS2801 Pixel auch anreihbar.
  • Ein Panel mit 512 Pixeln pro TI-Board kann mit 50 Hz Bilddaten versorgt werden oder zwei Panel mit 25 Hz.
  • 31 Dimm-Level, ohne die Farbdynamik zu reduzieren.
  • Die Farbtiefe beträgt mindestens 7 Bit nach Gammakorrektur pro Farbe! => 21 Bit Farbtiefe
  • 270 Hz Update Rate

Das Projekt ist direkt aus dem TI Beispiel „Blinky“ hervorgegangen, daher der Projektname. Erst blinkte nur eine LED und nun so viele ihr wollte 😉

Es gibt im Quellcode zwei wesentliche Dinge zu verstellen:

„LED_Matrix.h“

Es gibt das #define PANELS. Wollt ihr mit einem Board zwei Panels ansteuern, tragt hier „2“ ein. Dies führt dazu, dass 1024 Pixel aus der WS2801 Ansteuerung abgegriffen werden bevor der Datenstrom weitergeleitet wird. Eine „1“ kann nur ein Panel ansteuern, dafür können mehr Bilddaten pro Sekunde eintrudeln.

Das Dimm-Level soll später einmal per User Switch auf dem Board verstellbar sein, ist aktuell aber nur durch ein #define GLOBAL_LINEAR_DIM zu erreichen. Dabei ist „0“ die hellste Stufe und „30“ komplett dunkel.

Alle Quellcode-Einstellungen werden nun automatisch vorgenommen und kompiliert. Mit dem Button „Debug“ wird das Programm auf das TI Board gespielt. In den Projekteinstellungen solltet ihr jedoch vorher unter „ARM Linker“ -> „File Search Path“ die mitgelieferte driverlib.lib eingebunden haben, sonst kommt es zu Fehlern.

Bild

Elektrische Verbindung

Da die Matrix zum großen Teil parallel angesteuert wird, sind reichlich Drahtverbindungen herzustellen. Ich habe hier einen Lochrasteraufbau vorgesehen, um das Problem wenigstens etwas zu entschärfen.

Außer Draht und evtl. Lochraster braucht ihr auch noch ein „AND“ Gatter. Das ließ sich leider nicht vermeiden und ist in späteren Blogeinträgen erläutert. Bitte besorgt euch unbedingt ein 74AC08 Gatter + 100 nF Kondensator! Die HCT Gatter sind z.B. deutlich langsamer (15 ns) und führen bei diesen hohen Ansteuerfrequenzen der Matrix zu Problemen.

Später werde ich einen Schaltplan uploaden, aber im Grunde sollte es nicht nötig sein. Mit P1 meine ich Panel eins und mit P2 natürlich das zweite. Sind beide erwähnt, soll die Verbindung an beide Panels parallel gehen. Wollt ihr nur eins verwenden, braucht ihr das zweite natürlich nicht anschließen.

Dev-Board                    Panel

PQ1                              P1,P2.A

PQ2                              P1,P2.B

PQ3                              P1,P2.C

PB3                              AND Gatter Eingang 1.1

PK5                              AND Gatter Eingang 1.2

AND Gatter Ausgang 1 -> P1,P2 Clock

PK0                              P1.R1

PK1                              P1.G1

PK2                              P1.B1

PK3                              P1.R2

PC7                              P1.G2

PC6                              P1.B2

PC5                              P1,P2.OE

PC4                              P1,P2.LAT

PA6                              P2.R1

PA7                              P2.G1

PG1                              P2.B1

PG0                              P2.R2

PM3                              P2.G2

PM2                              P2.B2

GND                              GND

Natürlich müsst ihr das Logikgatter noch mit Ground und +5V vom Board versorgen. Dort sind einige Pins für die Versorgung zur Verfügung. Auch könnt ihr direkt 5 Volt vom Netzteil, das eure Panels versorgt, auf das Board geben. Nur bitte vergesst dann nicht, den JP1 Jumper auf Boosterpack-Stellung zu stecken!

Habt ihr die Matrix mit dem Board verbunden, braucht ihr noch den WS2801 Eingang:

PD3 ist die CLOCK Leitung

PD0 ist die DATA Leitung

Bitte noch manuell den CLOCK Pin (PD3) mit PD2 brücken. Damit erkennt das Board, dass alle Daten eingetroffen sind und das Bild errechnet werden kann. Vorsicht ist geboten, wenn ihr mit 5 Volt Pegel von eurem LED-Controller kommt, was fast immer der Fall sein wird. Dann braucht ihr nur direkt vor die PINs PD3 und PD0 einen 500 bis 2000 Ohm (Kohleschicht) Widerstand zu hängen. So wird der Spannungspegel durch die Schutzdioden des TI-Prozessors auf 3,3 Volt gesenkt.

Wollt ihr ein weiteres TI Dev-Board anreihen, dann müsst ihr folgende Ausgänge wieder mit den gerade erwähnten Eingängen verbinden:

PF3 mit PD3

PF1 mit PD0

Schutzwiderstände sind bei dieser Anreihung nicht mehr notwendig, da beide Boards mit 3,3 Volt Pegel arbeiten.

Bitte verbindet auch die Massen der beiden Boards und die Masse des LED-Controllers mit dem ersten Board!

 

Habt ihr alles verdrahtet, dann könnte es so wüst wie bei meinem Aufbau aussehen 😉

Foto 02.06.14 09 25 41 Foto 02.06.14 12 44 17 Foto 02.06.14 12 44 35

 

Hier noch ein Video, um das Ganze zu demonstrieren. Als Player wurde Jinx! unter Win7 verwendet, der LED-Controller heißt SEDUV3.

Zu beachten ist noch: Betreibt ihr ein Panel, muss die Gamma-Korrektur von extern erfolgen. Bei zwei Panel sollte ihr diese an eurem LED-Controller deaktivieren, da es intern schon erledigt wird.

 

Den Quellcode des CCS5.4 Projektes könnt ihr euch HIER herunterladen.

Dabei wären noch folgende interessante Sachen zu tun:

TODO:

  • WS2801 Eingang umstellbar auf UDP-Empfang (ARTNET oder TPM2.NET Protokoll)
  • verlustfreie Helligkeitsstufen per Userswitch einstellbar machen
Advertisements
Dieser Beitrag wurde unter Allgemein, LED-Matritzen abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

16 Antworten zu 2048 Pixel RGB-LED-Matrix: Basic

  1. Markus schreibt:

    Hallo Sebastian! Das ist ja wirklich sehr schön anzusehen! Vielen Dank für deine Mühe, das würde ich gerne nachbauen! Hast du irgendwie einen Tipp oder einen Link wo man die Panels für nen Zehner an adafruit vorbei bekommt? Sowas wie Ali? Haben die eine feste Bezeichnung, nicht dass man irgendeinen Schrott kauft. Vielen Dank im Vorraus! Grüße Markus

  2. Markus schreibt:

    Hi Sebastian,

    jetzt sind endlich meine Teile angekommen, und ich bin fleissig am Löten. Wollte dich nur auf einen Fehler in deiner sonst perfekten Beschreibung aufmerksam machen:

    […] müsst ihr folgende Ausgänge wieder mit den gerade erwähnten Eingängen verbinden:

    PF3 mit PB3
    PF1 mit PB0

    Das sollte wohl PD3 und PD0 heissen.

    Gerade warte ich noch auf mein Sedu v3 von turi

    Melde mich wenn es was anzusehen gibt 😉

    Grüße

    Markus

  3. Patrick schreibt:

    Hallo,

    hat denn jetzt schonmal jemand versucht das TPM2.NET Protokoll zu implementieren? Das Board ist doch bestimmt perfekt dafür geeignet mit dem Ethernet Anschluss.

    Grüße

    Patrick

    • Hallo Patrick,

      ich hatte mal mit dem Arduino/Energia UDP Stack ein paar Performance-Tests gemacht. Ist ja auch bloß der lwIP Stack darunter, aber mit ein paar interessanten Einstellungen…
      Erst Minuspunkt, es werden erstmal hart 40 kb RAM reserviert…
      Außerdem ist der Stack viel zu langsam, ich habe knapp 5000 Pixel bei 25 Hz herreinbekommen… und da hatte der Prozessor keine anderen Aufgaben als nur zu Empfangen!
      Da der Prozessor hier auch so schon genug zu ackern hat, könnte ich mir maximal vorstellen, dass ein Modul mit 512 Pixeln ansteuerbar wäre. (auch wegen RAM bedarf)
      Aber wenn du mein Quellcode mit tpm2.net zu WS2801 auf ein Board bringst und zwei weitere damit versorgst, hast du 2048 LEDs am Ethernet 🙂

      VG Basti

  4. Die fertige LED-Matrix steht bei mir recht viel rum und wartet nur auf rare Gelegenheiten. Wer sie mir gern abkaufen würde, kann sich gern melden.

    VG
    Basti

  5. Sanne schreibt:

    Hallo Sebastian

    Du machst unglaublich schönen Dinge!
    Ich bräuchte genau so etwas in Kleinformat, habe aber selber zu wenig Ahnung von solcher Technik. Könnte ich dich dafür beauftragen?
    Gerne höre ich von dir.

    LG
    Sanne

    • Hallo Sanne,
      ich danke dir!
      Leider habe ich keine Zeit, um solch oder ähnliche Sachen herzustellen. Jedoch steht meine Matrix aus diesem Blogpost nur im Wege rum und wir nur zur Silvesterparty mal aktiviert… also falls sie dir nicht zu groß ist, lässt sich sicher ein Preis finden!

      Viele Grüße
      Basti

  6. Thorsten schreibt:

    Hallo Sebastian,
    ich kämpfe auch gerade mit solchen Modulen und fand deine Variante den external Memory Controller zu nutzen sehr elegant. Leider sind Deine Sourcen aber nicht mehr verfügbar und so ganz theoretisch kann ich die Funktion nicht nachvollziehen. Kannst Du sie mir noch irgendwie zukommen lassen.
    Was hast Du eigentlich für ein Netzteil genutzt. Meine diversen Versuchen fiepen leider je nach Bildinhalt recht stark. Bei meinem alten Panel (http://www.trektech.de/ledpanel.htm) habe ich riesige Elkos und Spulen reingefriemelt um das weg zu bekommen.
    Viele Grüße
    Thorsten

  7. baumaista schreibt:

    Hi Sebastian,
    ich hab Interesse an der Matrix, falls Du es nicht losgeworden bist und dieses Jahr für Silvester was anderes planst. Wie kommen wir in Kontakt?
    Gruß,
    Robert

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s