WS2812 Matrix als HDMI Monitor

Dieser Beitrag wurde am 09.11.2022 aktualisiert.

WAK-LAB Matrix
WAK-LAB Matrix

Das WAK-Lab hatte die Idee von einer LED Matrix als Event Leinwand oder anderen Nerd Kram. Das Ganze 2m x 1,3m groß mit 60×33 Pixel. In dem Zusammenhang sind zwei Ansteuerungselektroniken entstanden. Die erste Variante benutzt einen ESP32, um über UDP und DMA die LEDs anzusteuern. Details dazu liegen auf Github. Soweit alles prima.

Nun kam die Frage auf, ob man das direkt als Monitor an einen PC oder andere Videoquelle anschließen kann. Der erste Gedanke war VGA + AD Wandler. Jedoch als das Design fast fertig war, kommt ein Bekannter um die Ecke und sagt “nimm doch HDMI, ist doch eigentlich ganz einfach”. LOL. Okay, das Datenblatt “TMDS Video Interface in the Spartan-6 FPGA” (Xilinx xapp495) beschreibt HDMI sehr gut. Ich hatte zufällig ein Spartan 6 Bord da und das passte prima zu diesem Projekt.

Damit das Ganze auch an jeder Grafikkarte funktioniert, braucht man noch ein elektronisches Datenblatt (EDID), was man mit einem 2k EEPROM über I2C Adresse 0x50 liefert. Damit das nicht zu schwierig wird, gibt es später noch ein Python Script, um das Datenblatt zu erstellen.

PISLX16 Spartan 6 LX16 FPGA Board
PISLX16 Spartan 6 FPGA Board
HDMI-Shield
das entwickelte HDMI-Shield

Im oben genannten Paper wird das Spartan-6 DVI SP601 Board beschrieben. Aus den Schaltplänen ging gut hervor, wie man ein passendes Shield designt. Auf dem Shield sind nun 4 Kanäle für WS2812 und ein Anschluss für ein HUB75 RGB LED Panel. Das ist einfach zum Testen mit drauf gekommen.

Umsetzung

Wir suchen uns zunächst die Belegung des HDMI Ports. Zu beachten ist, dass HDMI-A anders belegt ist als Mini und Mikro. Für die Terminierung sollten 50 Ohm pro Leitung verwendet werden. Da das FPGA Bord jeden Eingang mit 33 Ohm schützt, habe ich einfach noch 17 Ohm in Reihe dazu gesetzt. Die Signale werden differentiell übertragen und sollen einen Wellenwiderstand von 100 Ohm haben. Deshalb habe ich auch das Layout entsprechend aufgebaut (zumindest soweit ich das beeinflussen konnte). Für das Material JLC7628 habe ich 8mil Leiterbahnbreite und 8mil Abstand bei einem Laminat von 7,1mil und einem Er von 4,6.

HDMI-FPGA und EEPROM Anschluss
HDMI-FPGA
Impedanz 100 Ohm
Impedanz 100 Ohm

Das elektronische Datenblatt EDID

Ken Shirriff hat auf gist ein edid.py erstellt. Ich habe dieses für Python 3 modifiziert und dann ein Script gen-edid.py erstellt, um selbst ein EDID erstellen zu können.

00 FF FF FF FF FF FF 00 30 22 2F 03 01 00 00 00 
2D 1F 01 03 A1 2F 1A A0 04 CA FF A3 57 47 99 23 
11 4C 4C 21 08 00 71 40 01 01 01 01 01 01 01 01 
01 01 01 01 01 01 66 21 00 40 41 00 19 30 2C 58 
36 00 DC 0C 11 00 00 1E 00 00 00 FD 00 3C 3C 1E 
53 09 00 0A 20 20 20 20 20 20 00 00 00 FF 00 30 
38 31 35 0A 0A 0A 0A 0A 0A 0A 0A 0A 00 00 00 FC 
00 4D 79 20 53 63 72 65 65 6E 0A 0A 0A 0A 00 E0 

Jedenfalls kommt das Datenblatt (EDID) in einen seriellen EEPROM (24AA02) mit Adresse 0x50 an die I2C Schnittstelle des HDMI.

DER ARTIKEL WIRD NOCH WEITERGEFÜHRT. EINFACH SPÄTER NOCHMAL VORBEI KOMMEN.

Stromverbrauch

Bei voller Helligkeit benötigt die LED-Matrix 280W das sind bei 12V 23,4A.

2 Kommentare

  1. Super Idee, dies mit einem FPGA zu machen, welcher geeignet für das dekodieren solcher schnellen TMDS-Signale ist. Gibt es Open Source Code für den FPGA? Kann es Sinn machen, bei einer größeren Matrix das Ausgangssignal auf mehrere Linien aufzuteilen, oder gibt es in der Realität keine Probleme die WS2812-LEDs mit hoher (wie hoher?) Taktrate zu bespielen?

    1. Angelehnt an das Xilinx xapp495 hatte ich schon mal angefangen, eine Software in Verilog zu schreiben. Da unsere Matrix seit einiger Zeit mit WLED läuft, habe ich keinen Antrieb das Projekt weiter zu machen. Für das Aufteilen sind auf dem Board schon 4 Ausgänge für 4 Segmente vorgesehen. Die LEDs können mit ca. 900kBit beschrieben werden. Da kommt man bei 2000 LEDs auf ca 14 FPS.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert




Enter Captcha Here :