Hack einer 16*32 RGB LED Matrix – Teil I Die Vorüberlegungen

Das Adafruit oder ähnliche 16*32 RGB LED Matrix Panels bestehen aus 16 Zeilen mit 32 Spalten ziemlich heller RGB LEDs. In Summe also 512 RGB LEDs pro Panel, die irgendwie auch angesteuert werden wollen. Das Panel hat leider keine PWM Steuereingänge, die Farbkanäle lassen sich nur digital Ein- und Ausschalten! Eine Helligkeits- bzw. Farbsteuerung muss daher manuell durchgeführt werden. Mit Einschalten aller RGB LEDs ergibt sich eine gleichmäßig weiße Ausleuchtung. Die Panels sind elektrisch kaskadierbar, ein Arduino Uno mit der Adafruit Bibliothek jedoch nur eingeschränkt dazu in der Lage.

Es werden 12 Arduino Pins und 800 Byte RAM bei Verwendung der Library benötigt um ein 12-bit Farbimage zu speichern. Die Adafruit Bibliothek unterstützt ausschließlich den Uno oder den Mega. Der Arduino Leonardo oder andere Arduino Mikrocontroller werden derzeit nicht unterstützt.

Ein sehr gutes Tutorial ist bei der Lady Ada zu finden. Die beiden später ggf. noch notwendigen Bibliotheken RGB-Matrix-Panel sowie die Adafruit-GFX-Library können über das jeweilige Adafruit GitHub Repository durch Klick auf den Button „Download Zip“ heruntergeladen werden.

Stromversorgung

Die Stromversorgung des LED Panels darf keinesfalls über den Arduino erfolgen, da dieser nicht genügend Leistung liefern kann und zerstört werden würde! Das 16*32 RGB LED Display darf daher nur über ein separates Netzteil mit 5V und mindestens 2,5A betrieben werden. Werden Panels kaskadiert, vervielfacht sich entsprechend der Strombedarf und ein entsprechend leistungsstärkeres Netzteil ist notwendig!

Hardware Hacking des Panels

Um überhaupt erst einmal eine grobe Idee über die grundsätzliche Funktionsweise des Panels zu entwickeln, ist es durchaus sinnvoll auch einmal die Schaltung nebst Datenblätter dazu anzuschauen. Ein konkretes Schaltbild konnte ich jedoch bisher nicht ausfindig machen. Deshalb habe ich erst einmal festgehalten, welche ICs überhaupt verbaut worden sind, da außer bei Adafruit ansonsten nichts verwendbares an Informationen zu finden war. Jedoch selbst bei der bereits recht ausführlichen Beschreibung von Adafruit fehlen immer noch diverse Details.

Übersicht der Integrierten Schaltkreise

  • Menge Beschriftung  Beschreibung
  • 2             74HC245            Oktal Bustreiber, bidirektional
  • 12           ICN2026            16-fach Schieberegister mit Konstantstromquellen (ChipOne)
  • 1              74HC138           1 aus 8 Dekoder
  • 4              XCX4953           Vermutlich Dual MOSFET-Treiber mit Open Drain

Bei vielen der weitgehend baugleichen RGB LED Matrix Panels scheint die restliche Ansteuerelektronik offensichtlich immer über 2 Stück 74HC245 8-fach CMOS Bustreiber angebunden zu sein. Von hier verteilen sich neben den Adress- und Steuerleitungen, die Datenleitungen der beiden RGB-Ports 0 und 1 unter anderem auf 2 Schieberegisterarrays mit Konstantstromquellenausgang. Jedes der beiden Schieberegisterarrays besteht aus 6 Stück der 16-bit Schieberegister SM16126 oder auch ICN2026 bzw. SCT2026. Jeweils 2 der 16-bit Schieberegister sind immer kaskadiert. In Summe sind das also die 96 Speicherstellen je Array für die 32 RGB-LEDs einer Zeile, wobei jeweils immer 3 Speicherstellen den Pixelwerten einer RGB LED zugeordnet sind. Zwei dieser Arrays werden grundsätzlich parallel betrieben, wodurch immer 2 Zeilen parallel angesteuert werden können.

Weitere 3 Leitungen (A, B, C) gehen vom Bustreiber zu einem 74HC138, einem 1 aus 8-Decoder zur Adressierung der jeweiligen LED-Zeile. Bei den größeren 32*32 Panels gibt es übrigens auch noch die Adressleitung D, wobei dann die Dekodierung mit nur einem 74HC138 alleine vermutlich nicht mehr ausreichen dürfte. Auf den mir gerade zur Verfügung stehenden Panels sind 4 weitere 8-pol. ICs mit der Bezeichnung XCX4953 verbaut. Leider konnte ich diese auf Anhieb nicht identifizieren. Ich vermute jedoch, dass es Treiber-ICs bzw. MOSFET Arrays mit Open Drain Ausgang für die 16 LED-Zeilen sind, zumal sich der Dekoder 74HC138 in direkter Nähe dazu befindet und zur Ansteuerung dafür prädestiniert wäre. Aus den jetzt vorliegenden Informationen und Annahmen konnte ich nachfolgendes rudimentäres Blockschaltbild entwickeln.

Vorläufiges Blockschaltbild eines 16*32 RGB LED Matrix Panels

Blockschaltbild 16*32 RGB LED Matrix

Mit Hilfe der Datenblätter der jeweiligen ICs und obigem nicht verifiziertem Blockschaltbild kann nun möglicherweise sogar eine passende Ansteuerung ohne die Adafruit Bibliothek entwickelt werden.

Die Funktionsweise in Kurzform

Die Beschreibung der Funktionen bezieht sich hier immer mit Blick von vorne auf die LEDs des Panels und mit dem Dateneingang auf der rechten Seite! Nach einigen Korrekturen und Erweiterungen ergibt sich jetzt nachfolgende Funktionsweise.

Um die Ansteuerung, insbesondere die Anzahl der benötigten Pins überschaubar zu halten, wird das Panel im 1/8 Interleave-Modus betrieben. Das bedeutet, dass immer 2 Zeilen von 16 parallel angesteuert werden. Also die 1. zusammen mit der 9. Zeile, die 2. mit der 10. Zeile usw. bis zur 8. mit der 16. Zeile. Daraus ergeben sich 8 Bereiche zu je 2 Zeilen, die adressiert und gesteuert werden müssen.

Adressleitungen

Diese 8 * 2 Zeilen werden über die Adressleitungen A, B, C und bei 32*32 Panels auch noch über D adressiert. Bei 3 Bits ergeben sich bekanntermaßen 8 Adressierungsmöglichkeiten (dezimal 0 bis 7), ausreichend für das 16*32 Panel, bei 4 Bit entsprechend 16 Möglichkeiten, welche für das 32*32 Panel notwendig sind. Mit dem jetzigen Kenntnisstand kann also schon mal jede Zeile des Displays über das entsprechende Bitmuster an den Pins A, B, und C adressiert werden.

  • MSB LSB
  • C  B  A      Zeile von oben
  • 0  0  0      1
  • 0  0  1      2
  • 0  1  0      3
  • 0  1  1      4
  • 1  0  0      5
  • 1  0  1      6
  • 1  1  0      7
  • 1  1  1      8

RGB Datenleitungen

Weiterhin gibt es jeweils 2 Satz der RGB Datenports für die Farben Rot, Grün und Blau. Die hier mit R0, G0, B0 bezeichneten Anschlüsse dienen der Ansteuerung der oberen Hälfte des RGB LED Matrix Panels und die Anschlüsse R1, G1 und B1 der unteren Hälfte der jeweiligen Sektion. Durch entsprechende Signalpegel am oberen RGB Port 0 bzw. am unteren RGB Port 1 können so gezielt die einzelnen LED-Farben des oberen oder unteren Bereiches getrennt ausgewählt werden. Mit einem statischen HIGH-Pegel wird der jeweilige Farbkanal eingeschaltet.

Verbleiben dann noch 3 letzte Steuerleitungen CLK, OE, LAT (STB). Diese Steuerleitungen sind offensichtlich flankengesteuert.

CLK Taktleitung

Jeweils über die positive Taktflanke werden die Daten in die Schieberegister des Panels eine Position weiter geschoben. Für jede Zeile eines Panels werden 32 Taktzyklen benötigt, um alle RGB Daten für jeden LED Pixel einer Reihe an die gewünschte Position zu bringen.

LAT(STB) /Latch oder /Strobe

Nachdem alle 32 Bits durchgetaktet sind, wird mit der negativen Flanke eines kurzen HIGH/LOW Impulses der Leitung LAT (STB) der Inhalt der Schieberegister in das Ausgangsdatenregister (Latch) gespeichert werden. Der Ruhezustand des LAT Pins ist typischerweise LOW, damit nur die gerade im Latch zwischengespeicherten Daten weiter verarbeitet werden. Wird der LAT Pin dauerhaft auf HIGH gesetzt, werden die Daten des Schieberegisters direkt an die Ausgänge durchgereicht! Jede Änderung der Eingangspins wird damit sofort am Ausgang sichtbar, was in der Regel nicht erwünscht ist.

OE /Output Enable

Die Freigabe der Daten des Ausgangsregisters zur Anzeige auf das Panel wird über den Output Enable Pin gesteuert. Bei einem HIGH-Pegel ist das Panel ausgeschaltet. Mit der negativen Flanke auf LOW ist das Panel eingeschaltet und wird mit den im Ausgangsregister anstehenden Daten angesteuert.

Zusammenfassung der Funktion

Zusammengefasst stelle ich mir die Ansteuerung einer Doppelzeile (Sektion) so vor:

  1. Auswahl der gewünschten Sektion über eine 3-bit Adresse an den Pins A, B und C. Am einfachsten alle Pins auf LOW entsprechend der Zeile 0 bzw. der 1. Zeile oben
  2. Während der Initialisierung den Pin OE auf HIGH setzen um das Panel auszuschalten
  3. Bei der ersten Ansprache den Pin LAT auf LOW, damit allenfalls die gerade zufällig gelatchten Daten weiter verarbeitet werden
  4. Taktsignal zur Initialisierung von CLK auf LOW setzen
  5. Über die RGB Ports 0 und 1 ggf. das gewünschte Farbmuster auswählen, der Einfachheit halber ganz simple beide RGB Ports, also alle Pins auf HIGH setzen (entspricht der Farbe Weiß)
  6. Nach der vorangegangenen Initialisierung über eine Schleife mit 32 LOW/HIGH Impulsen das Taktsignal an CLK erzeugen und die gewünschten Daten mit jeder positiven Flanke weiter in die Schieberegister takten
  7. Über einen kurzen HIGH/LOW Impuls am LAT Pin mit der negativen Flanke das vorhandene Bitmuster der Schieberegister in die Ausgangslatches zwischenspeichern
  8. Als letztes Ereignis den OE Pin auf LOW setzen um die Anzeige des Panels einzuschalten

Da die 74HC-Bausteine relativ schnell sind und die Arduino Funktion digitalWrite() relativ zeitintensiv ist, sollten irgendwelche sonst üblichen Pausen nach einem Pegelwechsel nicht unbedingt notwendig werden. Im Einzelfall einfach mal schauen, ob die Hardware genügend Zeit hat den Befehlen zu folgen.

Sollte bis hierhin soweit alles funktionieren, kann später vielleicht auch einmal geprüft werden, inwieweit sich die Gesamthelligkeit des Panels über den Output Enable Pin OE in bestimmten Grenzen dimmen lässt.

Anschlussbelegung der Stiftleiste

  • 16*32 RGB LED Matrix – Arduino

    Pinbelegung 16-pol. Header
    Quelle: Adafruit
  • R0 (obere Hälfte)              – D2
  • G0 (obere Hälfte)              – D3
  • B0 (obere Hälfte)              – D4
  • R1 (untere Hälfte)            – D5
  • G1 (untere Hälfte)            – D6
  • B1 (untere Hälfte)            – D7
  • A (Adresse)                          – A0 (D14)
  • B (Adresse)                         – A1 (D15)
  • C (Adresse)                         – A2 (D16)
  • CLK                                        – D8
  • OE                                          – D9
  • LAT (STB)                            – D10

Die Verdrahtung erfolgt hier in Anlehnung der Vorgaben der Adafruit Library RGB-Matrix-Panel bzw. des Tutorials, damit diese später ohne jegliche Änderung der Hardware ebenfalls verwendet werden kann. Mehr auch dazu im nächsten Beitrag.

Advertisements

4 Gedanken zu “Hack einer 16*32 RGB LED Matrix – Teil I Die Vorüberlegungen

  1. Danke für diese tolle Artikelserie! Hat mir wirklich sehr weitergeholfen um mein 64×32 China-Panel doch noch zu laufen zu bringen.

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 )

Google+ Foto

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

Twitter-Bild

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

Facebook-Foto

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

Verbinde mit %s