Vorstellung TTGO ESP32 VGA32 Board mit PS/2 Mouse/Keyboard und mehr
Zuerst ein bisschen Theorie
Neulich bin ich beim Videoschauen auf Youtube über ein Video von bitluni gestolpert, in dem er ein VGA-Signal am Oszilloskop ausliest und analysiert und mit einem ESP32 und ein paar Widerständen nachstellt. Ihm gelingt es so, ein Bild auf einem VGA-Monitor darzustellen.Auf bitlunis Homepage, übrigens auch ein Deutscher, der seine Videos allerdings auf englisch macht findet man den Schaltplan dazu. Auch kann man da eine fertige Platine bestellen. Diese und seine Library (für Arduino IDE) stellt er in einem weiteren Video vor.
Übertragungsprotokolle finde ich eigentlich immer ziemlich interessant und so schrieb ich mir auf eine "Will ich irgendwann mal machen"-Liste, auch einmal ein VGA-Signal auf dem Oszilloskop anzuschauen und bitlunis Projekt nachzustellen. Und dann geriet das Vorhaben wie so viele andere wieder in Vergesenheit.
In meinem Gedächtnis ist für das VGA-Signal gespeichert (sprich: ohne Gewähr), dass es drei Farbkanäle für rot, grün und blau (kurz RGB) gibt, aus denen eine farbiges Pixel durch Farbmischung erzeugt wird. Die Pixel / Signale werden in einer bestimmten Geschwindigkeit nacheinander übertragen, und zwar so wie man liest: man fängt oben links an, geht nach rechts bis ans Zeilenende und dann geht es mit der nächsten Zeile links weiter.
So wird auch das Bild auf einem Röhrenmonitor dargestellt. Die Technik kommt noch von den alten Fernsehgeräten. Ein Monitor ist im Prinzip nichts anders: es wird ein Elektronenstrahl durch Hochspannung erzeugt und dieser in einer Vakuum-Röhre auf das andere Ende, die Mattscheibe gefeuert. Das malt ein Bild auf die nachleuchtende Schild auf der gläsernen Front des Monitors. Da der Elektronenstrahl negativ geladen ist, kann man ihn mit Elektromagnet-Spulen ablenken, so dass er auf einem bestimmten Punkt der Mattscheibe auftrifft.
Das tut man jetzt oben links beginnend, nach rechts laufend, Zeile für Zeile. Ist man ganz unten rechts angekommen, geht es oben links wieder los. Das nächste Bild wird übertragen. In Deutschland war PAL Standard und der hatte 50 Hertz (praktischerweise wie die Netzfrequenz aus der Steckdose), heißt in einer Sekunde werden 50 (Halb)-Bilder gezeichnet. Man konnte sich also an der recht genauen Netzfrequenz mit der Elektronik orientieren.
Da die Elektronik und der Elektronenstrahl ein klein wenig Zeit braucht, um vom rechten Bildschirmrand für die nächste Zeile wieder nach links zu "hüpfen", gibt es dort eine kleine Pause im Signalfluss, die horizontale Pause. Die Zeit, die es für eine Zeile braucht bestimmt auch die Horizontalfrequenz und das H-Sync-Signal (horizontal syncronisation).
Für das "Hüpfen" von ganz rechts unten wieder nach ganz links oben für das nächste Bild braucht noch länger und erzeugt eine noch längere Pause im Signal-Strom. Und daraus ergibt sich die Vertikalfrequenz und das V-Sync-Signal.
Ist das Timing festgelegt (bei uns nach der Fernsehnorm PAL), dann hat man mit einem Elektronnenstrahl einen fertigen Fernseher, der 625 Zeilen und 25 Vollbilder pro Sekunde in schwarz/weiß darstellt. Das flimmert zwar ein bisschen, aber durch das Nachleuten der Mattscheibe wird es erträglich, weil jedes Bild ein wenig "nachglüht" und damit das schwarz zwischendrin eliminiert wird.
Für einen Farbröhrenfernseher braucht man eine Lochmaske auf der Mattscheibe, die bei dem Auftreffen des Elektronenstrahl rot, grün oder blau leuchtet. Diese Farbpixel sind so nah aneinander, dass sie sich in der Wahrnehmung der Person, die ein paar Meter davon entfernt sitzt, zu einer Farbe vermischen; je nachdem wie hell das Pixel leuchtet bzw. wie stark der Elektronenstrahl ist.
Die Computer-Monitore folgten eigentlich immer der Technik der Fernseher, legten das Design aber mehr auf ein scharfes Bild, weil auf Computern viel Text gelesen werden muss. Die früheren Monitore waren einfarbig, meist grün oder "bernstein", auch "amber" genannt, das geht in Richtung orange. Die Technik der Farbmonitore lehnten sich auch an die Technik der Farbfernseher an.
Die genaue Technik ist komplex und da könnte man stundenlange Vorträge zu halten, aber das soll uns als grober ÜBerblick erst einmal reichen.
Der VGA-Standard
Nach anfänglichen Standards wie Herkules, CGA und EGA eroberte VGA die Computerwelt mit 640x480 Pixeln und dem typischen 15-poligen D-Sub-Anschluss am VGA-Kabel.
Hier werden die Farbanteile rot, grün und blau an jeweils zwei Pins (jeder mit eigenen Masseanschluss) übertragen. Das schließt die Helligkeit der Farbe mit ein. Der Pegel liegt dabei zwischen 0 und 0.7 V. Null für schwarz, 0.7 für maximalen Farbanteil / Helligkeit - im 24 bit Farbschema zu je 8 Bit pro Farbe würde dass den Anteil 255 bedeuten.
Die Sync-Signale sind normalerweise auf Low (0 V). Das H-Sync-Signal soll solange auf high gezogen werden, wie das Schreiben einer Zeile von links nach rechts dauert. Das V-Sync-Signal soll solange auf high gezogen werden, wie das Schreiben eines ganzen Bildes andauert. Man könnte es auch anders herum formulieren: H-Sync ist normalerweise high und nur bei den Zeilensprüngen low und V-Sync ist normalerweise high und nur in der kurzen Zeit beim Sprung von rechts unten nach links oben auf low.
"Normlerweise", weil es durchaus Ausnahmen und Verfeinerungen für die Sync-Signale gibt. Was für welche Auflösung gilt, kann man entsprechenden Tabellen entnehmen.
In der VGA-Buchse bzw. dem Kabel finden sich folgende Pins:
Pin | Bedeutung |
---|---|
1 | Rot (0,7 V bei 75 Ohm) |
2 | Grün (bzw. Monochromsignal) |
3 | Blau |
4 | ID2 (Monitor-IDentifizierung #2) oder Reserve |
5 | digitale Masse für DDC |
6 | analoge Masse für Rot |
7 | analoge Masse für Grün |
8 | analoge Masse für Blau |
9 | nicht belegt |
10 | analoge Masse für Synchronsignale |
11 | ID0 |
12 | ID1 oder digit. Datenaustausch (DDC – SDA, Serial Data = Datenleitung) |
13 | H-Sync: Horizontale Synchronisation oder gemeinsame Sync. (H + V) |
14 | V-Sync: Vertikale Synchronisation |
15 | Digit. Datenaustausch (DDC – SCL, Serial Clock = Taktleitung) |
Hier finden sich die Signale für die Farbanteile rot, grün und blau (jeweils Signal plus je Farbe getrennte Masse), die bis zu 0.7 Volt stark werden dürfen. Je höher die Spannung, desto stärker der Farbanteil. Diese Signal finden sich auf Pin 1 bis 3 und 6 bis 8.
Ansonsten sind noch die Sync-Signale auf Pin 13 und 14 wichtig. Da die Bildschirmdimensionen nicht nur mehr 640x480 sein können, sondern auch 800x600, 1024x768, 1280x800, 1280x960, 1600x1200, 1920x1080, 1920x1200, um nur die gebräuchlichsten zu nennen, sind diese nötig.
Mehr braucht es auch nicht, um ein Bild auf einen VGA-Monitor zu bringen: 5 analoge Signale.
Das TTGO ESP32 VGA32 Board
Wie gesagt, war das VGA-Experimentier-Thema ein wenig in Vergessenheit geraten bei mir. Das sollte sich aber ändern, als ich über das TTGO ESP32 VGA32 Board stolperte.
Mit diesem Board sah die Sache schon ganz anders aus. Das sollte das Experimentieren wesentlich vereinfachen, denn:
- die VGA-Buchse ist schon auf die Platine aufgelötet und mit einem ESP32 verdrahtet
- außerdem gab es noch zwei PS/2 Buchsen für Maus und Tastatur
- ein Audio Ausgang und ein Mikro-SD-Karten-Slot machten neugierig auf mehr.
Und in rekordverdächtigen 8 Tagen war das Board auch schon bei mir. Seht hier mein Mailbag-Video auf Youtube, wie ich es auspacke und meine erste Einschätzung abgeben:
Das Pinout
Einen ersten Überblick über das, was das Board kann, zeigt die Produktseite auf AliExpress und dort besonders das Pinout des Boards:Hier wird übersichtlich gezeigt, welche Anschlüsse mit welchen ESP32-Pins verbunden sind, um diese ansprechen zu können.
Wie von Lilygo gewohnt ist das Board picke-packe-voll gemacht und trotzdem sehr kompakt. Darauf sind zu finden:
- Der VGA-Anschluss (8 Pins)
- Ein PS/2 Tastatur Anschluss (2 Pins)
- Ein PS/2 Maus Anschluss (2 Pins)
- Ein Micro-SD-Karten-Slot (SPI, 4 Pins)
- Ein Audio Ausgang 3.5 mm Klinke (2 Pins: 10 und 25?). Wohl mono, da ein NS4150 Mono Audioverstärker verbaut ist.
- Sechs herausgeführte Pins zur eigenen Verwendung (Pin 2 (auch MISO SD), 13 (auch CS SD), 14 (auch CLK SD), 12 (auch MOSI SD), 34, 39) und GND und 3.3V. Vorsicht! Bei mir ist auf der Buchsenseite bei den Pinbeschriftungen die obere und untere Reihe vertauscht. GND und 3.3V sind in Wirklichkeit am äußeren Rand wie auf der Chipseite angegeben.
- Eine Power In / USB Serial Micro-USB Buchse
- Ein Akku-Anschluss? (weiße JST-Buchse)
- Bei mir ein CH9102F Serial Controller
- Buchse für externe Antenne
- Taster für Reset und Pin 36
Von der ESP32-Seite gelten die üblichen Werte, die man in meinem Artikel ESP32 - ESPDUINO-32 Ersteinrichtung nachschauen kann. Da ist auch eine Installationsanleitung, wie man das Board in die Arduino IDE einbindet dabei, für die, die noch ganz neu dabei sind. Wer selbst noch nicht die Arduino IDE eingerichtet hat, findet hier eine Anleitung dazu.
Hier ein kleines Video mit der Beschreibung der Karte auf AliExpress inklusive dem kurzen Demo-Video von LilyGo:
Ein erster Test - Anschluss und Sound-Demo
Um in den voller Genuss zu kommen oder anders gesagt, die Platine auszureizen, benötigt man zusätzlich:- Einen Monitor mit VGA-Eingang (kann 4:3 oder 16:9 sein) und ein VGA-Kabel mit zwei Steckern wie zum Anschluss eines alten PCs an einen Monitor
- Alternativ einen modernen Monitor und einen VGA zu HDMI Adapter, wenn nur ein moderner Monitor vorhanden ist. Zu beachten dabei ist, den richtigen Adapter zu kaufen. Das meiste sind HDMI zu VGA Adapter, wir brauchen aber VGA (out) auf HDMI (in).
- Eine Tastatur mit PS/2 Anschluss
- Eine Maus (oder Trackball, Touchpad etc.) mit PS/2 Anschluss
- Alternativ USB-Maus und USB-Tastatur und einen USB zu PS/2-Adapter, wobei man hier noch vorsichtiger sein muss, das richtige zu kaufen. Die allermeisten sind PS/2 zu USB Adapter mit zwei PS/2 Eingängen zum Anschluss von alter PS/2-Peripherie.
- Ein USB Ladegerät für die Stromzufuhr, 1 A sollte genügen
- Eine kleine Soundbox mit Klinkenanschluss für Audio-In für den Sound
- Ein Audiokabel, zweimal 3.5mm Klinke Stecker
Wenn man die Geräte zusammen hat (ich hatte noch alles von alten Computern übrig) ist es dann im Prinzip ganz einfach: Alles einstöpseln, Monitor, Soundbox und VGA32-Board anschalten und schon sollte alles funktionieren.
Die alten VGA-Monitore hatten eigentlich immer das 4:3 Format. Heute ist ja eher 16:9 üblich. 4:3 ist authentischer und mehr Retro-Feeling, aber Prinzip geht alles mit einem VGA-Eingang: ob alter Röhrenmonitor oder moderner TFT.
Ist alles richtig angeschlossen, sollte sich der Monitor, so er denn dazu fähig ist, selbstständig auf die richtige Frequenz einstellen und ein Bild mit 5 Fenstern erscheinen: Channel 1 ... Channel 4 und Main Controls.
Klickt man in einem Channel-Fenster auf "enable", dann wird auf dem Kanal ein Ton wiedergegeben. Hier zeigt sich, ob die Maus funktioniert und auch ob der Sound geht, denn jetzt sollte ein entsprechender Ton in eingestellter Frequenz zu hören sein.
Man kann dann noch die anderen Channel zuschalten, die alle parallel gespielt werden. Ich hatte aber das Gefühl, dass darunter die Lautstärke leidet. Das wird wohl am Sound-Mixer liegen.
Außerdem kann man die Wellenform (Wave Form) ändern und zwischen Sinus (Sine), Rechteck (Square), Dreieck (Triangle), Sägezahn (Sawtooth) und Rauschen (Noise) wählen. Das hat mich gleich an meinen alten Commodore C64 erinnert, bei dem man mit Pokes auch diese Wellenformen (bis auf Sinus) einstellen konnte.
Ein Sound-Loop mit einem gesampelten Mini-Song und eine aufgenommene Stimme (Voice Test) komplettieren die abspielbaren Sounds.
Außerdem kann man die Frequenz einstellen, das geht auch mit den Cursor-Tasten auf der Tastatur - womit wir auch getestet haben, dass diese funktioniert.
Hier ein Video über den Anschluss, den Aufbau und die Sound-Demo-Firmware:
Quellen, Literaturverweise und weiterführende Links
PAL (Fernsehnorm) bei WikipediaVGA-Anschluss bei Wikipedia
VGA-Timings bei TinyCGA.com