Inhaltsverzeichnis:

Eine Sammlung von ANSI-Terminals - Gunook
Eine Sammlung von ANSI-Terminals - Gunook

Video: Eine Sammlung von ANSI-Terminals - Gunook

Video: Eine Sammlung von ANSI-Terminals - Gunook
Video: I will teach you how to make games in your terminal 👾 2024, Juli
Anonim
Eine Sammlung von ANSI-Terminals
Eine Sammlung von ANSI-Terminals

Dieses Projekt begann als eine Möglichkeit, 80-spaltigen Text auf einem LCD-Display anzuzeigen, das für den Betrieb eines altmodischen Textverarbeitungsprogramms wie Wordstar geeignet ist. Verschiedene andere Displays wurden in Größen von 0,96 bis 6 Zoll hinzugefügt. Die Displays verwenden eine einzelne Platine sowie eine Arduino-Skizze / ein Programm.

Es gibt einen seriellen RS232-Anschluss zum Anschluss an einen Computer und eine PS/2-Buchse für eine Tastatur. Die Displays wurden so ausgewählt, dass sie die handelsüblichen zu vernünftigen Preisen darstellen. Je nach benötigtem Speicher verwenden die Displays einen Arduino Nano, Uno oder Mega.

Schritt 1: Zusammenfassung der Anzeigen

Zusammenfassung der Anzeigen
Zusammenfassung der Anzeigen

Es gibt verschiedene Displays mit 480x320 Auflösung. Dies ermöglicht eine 9x5-Schriftart und 80-Spalten-Text. Es gibt verschiedene Boards mit 320x240 Auflösung, mit 9x5 Schriftarten und auch einer sehr kleinen 7x3 Schriftart, um 80-spaltigen Text zu ermöglichen. Es gibt auch kleinere Boards mit 160x120 und 128x64 Pixeln. Auch 20x4 und 16x2 Textdisplays und schließlich eine 12x2 14-Segment-Starburst-Anzeigetafel.

Einige Displays verwenden I2C, einige sind SPI und für die größeren Displays einen 16-Bit-Datenbus für schnellere Aktualisierungsgeschwindigkeiten.

Kleinere Displays verwenden das Arduino Uno. Größere Boards benötigen mehr Speicher und verwenden daher einen Mega. Die Starburst-Anzeigetafel verwendet einen Nano.

An dieser Stelle möchte ich erwähnen, dass die Fotos vielen Displays nicht gerecht werden. Das winzige weiße Oled-Display ist sehr scharf und hell, was es der Kamera erschwert, zu fokussieren, und das Starburst-LED-Display sieht im wirklichen Leben viel schärfer aus.

Schritt 2: Hardware

Hardware
Hardware

Die Platine wurde entwickelt, um mit so vielen Displays wie möglich zu arbeiten. Der Wechsel zwischen Mega und Uno ist mit vier Jumpern einfach. Es gibt Spannungsteilerwiderstände für Displays, die mit 3V betrieben werden. I2C-Pins werden in einer Gruppe herausgeführt, sodass Displays direkt eingesteckt werden können. Das Terminal läuft mit 9600 Baud, und obwohl dies erhöht werden kann, werden viele der größeren Displays nicht viel schneller neu gezeichnet. Die PS2-Tastatur wird an eine DIN6-Buchse angeschlossen. USB-Tastaturen funktionieren auch mit einem billigen Adapterstecker. Sie können einen einfachen Loopback-Test durchführen, indem Sie Pin 2 und 3 am D9 verbinden, und dann erscheinen die auf der Tastatur eingegebenen Zeichen auf dem Display.

In einigen Fällen wird keine Platine benötigt und es ist möglich, Dinge mit vorgefertigten Modulen, die bei ebay erhältlich sind, zum Laufen zu bringen, z. B. PS2-Adapter, RS232-Adapterplatinen und Displays, die direkt an Arduino-Platinen angeschlossen werden.

Es gibt auch eine separate Platine für die Starburst-LED-Anzeige - siehe später in diesem Instructable.

Schritt 3: Software

Unten ist eine Datei namens Package.txt Dies ist eigentlich eine ZIP-Datei, also laden Sie sie herunter und benennen Sie sie um (Instructables erlaubt keine ZIP-Dateien). Enthalten ist die Arduino-Skizze / das Programm und dies ist ein einzelnes Programm, das von allen Displays verwendet wird. Es gibt auch alle.zip-Dateien für jedes der Displays.

Am Anfang des Programms stehen eine Reihe von #define-Anweisungen. Entkommentieren Sie diejenige, die der Anzeige entspricht. Verwenden Sie Tools/Board, um Uno, Mega oder Nano auszuwählen. Das Ändern von Boards ist so einfach wie das Ändern einer Zeile im Code.

Eine der Herausforderungen bei der Arbeit mit vielen Displays besteht darin, dass sie anscheinend alle ihre eigenen Softwaretreiber benötigen. Diese sind alle im Paket enthalten. Zu den Tests gehörten, das Paket zu nehmen und es auf einem neuen Computer komplett von Grund auf neu zu installieren. Sie können auch Quellcode von Github und Adafruit und LCDWiki beziehen. Es gibt einige Fälle, in denen neuere Versionen nicht funktionieren, sodass alle funktionierenden Versionen in der ZIP-Datei enthalten sind. Gelegentlich gab es Fälle, in denen ein Treiber einen anderen an der Arbeit stoppte, da sie denselben Dateinamen, aber unterschiedliche Versionen verwendeten. In den Kommentaren oben im Programm finden Sie eine Beschreibung, wie die einzelnen Treiber installiert werden. Die meisten werden von der Arduino IDE mit Sketch/Include Library/Add ZIP library installiert und dies nimmt die Zip-Datei und legt sie in c:\users\computername\mydocuments\arduino\libraries ab.

Wenn Sie nur ein Display verwenden, müssen einige dieser Bibliotheken nicht installiert werden. Sie benötigen mindestens die beiden Tastaturdateien und die für das jeweilige Display. Einige zeigen den Freigabecode an. In den Kommentaren oben im Programm finden Sie detailliertere Anweisungen, einschließlich des Abrufens der gfx-Bibliothek von Adafruit.

Da alle Displays dieselbe Arduino-Skizze verwenden, müssen Sie nur eine der folgenden Zeilen auskommentieren, um die Displays zu ändern:

// Verschiedene Displays, lassen Sie eines der folgenden unkommentiert#define DISPLAY_480X320_LCDWIKI_ILI9486 // 3.5", 480x320, Text 80x32, Mega, 16 Bit, Stecker in Mega 36 Pin (und 2 Power Pins).https://www.lcdwiki.com /3.5inch_Arduino_Display-Mega2560. Langsamer als einige der folgenden Optionen, aber eine besser lesbare Schriftart und ein größerer Bildschirm, 5 Sekunden Bootvorgang //#define DISPLAY_480X320_MCUFRIEND_ILI9486 // 3.5", 480x320, Text 80x32, Mega, 5x9 Schriftart, nur für Mega, aber verwendet nur die Uno-Pins, Power, D0-D14, A0-A5, schönere Schriftart als das SSD1289 40-Pin-Modul, aber viel langsamer https://www.arduinolibraries.info/libraries/mcufriend_kbv https://github.com/adafruit/Adafruit -GFX-Library //#define DISPLAY_320X240_MCUFRIEND_ILI9341 // 2.4", 320x240, Text 53x24, Mega //#define DISPLAY_320X240_SSD1289_40COL // 3.5", 320x240, Text 40x20, Mega, UTFT-Bibliothek (keine Schriften kleiner als 8x12). Schnell //#define DISPLAY_320X240_SSD1289_53COL // 3.5", 320x240, Text 53x24, Mega, 9x5 Schriftart, kann Schriftart bearbeiten. Schnell //#define DISPLAY_320X240_SSD1289_80COL // 3.5", 320x240, Text 80x30, Mega, winzige 7x3 Schriftart, kann Schriftart bearbeiten, schnellerer Treiber als die beiden oben, am schnellsten als 16-Bit-Direktantrieb zum Display statt spi/i2c //#define DISPLAY_160X128_ST7735 // 1.8", 160x128, text 26x12, uno (ILI9341) SPI 128x160 //#define DISPLAY_128X64_OLED_WHITE // 0,96", 128x64, Text 21x6, Mega, I2C, oled white on black (die TFT-Bibliothek für dieses Board plus der gesamte Code plus die Tastatur hat keinen Programmspeicher mehr, obwohl der RAM-Bedarf sehr gering ist, also nur läuft auf einem Mega) //#define DISPLAY_20X4 // Text 20x4, uno, LCD mit I2C, Text LCD https://www.arduino.cc/en/Reference/LiquidCrystal //#define DISPLAY_16X2 // Text 16x2, uno, Steckt in Uno, verwendet Pins 4 bis 10 //#define DISPLAY_STARBURST // Text 12x2, Nano, Starburst-Display mit Nano-Controller //#define DISPLAY_320X240_QVGA_SPI_ILI9341 / / 2.2", 320x240, Text 11x8, uno, große Schrift, uno, 3V-Signale, 9-poliges SPI-Display siehe Bodmers Instructables - uno https://www.instructables.com/id/Arduino-TFT-display-and-font- Bibliothek / Holen Sie sich die Zip-Datei unten und legen Sie die gfx und 9341 manuell in den arduino-Bibliotheksordner

Schritt 4: Der ANSI-Standard

Der ANSI-Standard
Der ANSI-Standard

ANSI ermöglicht einfache Befehle zum Löschen des Bildschirms, zum Bewegen des Cursors und zum Ändern der Farben. Auf einigen Fotos gibt es eine Demo, die alle Vorder- und Hintergrundfarben zeigt. Dies sind Rot, Gelb, Grün, Blau, Cyan, Magenta, Schwarz, Weiß, Dunkelgrau, Hellgrau, und die Farben können hell oder dunkel sein, sodass es 16 Vordergrund- und 16 Hintergrundfarben gibt.

Es ist durchaus möglich, darüber nachzudenken, einen "Grafik"-Modus hinzuzufügen, in dem Sie Bilder mit viel höherer Auflösung auf Pixelebene und mit 256 oder mehr Farben zeichnen können. Die Haupteinschränkungen sind der interne Speicher des Arduino und die Zeit, die benötigt wird, um ein Bild mit 9600 Baud über eine serielle Verbindung zu senden.

Der Code benötigt ein Byte zum Speichern des Zeichens und ein Byte zum Speichern der Farben (3 Bits für Vordergrund, 3 für Hintergrund, eines für hell/dunkel und eines für fett). Ein 80x30-Display benötigt also 2400x2=4800 Bytes, was in einen Mega, aber nicht in einen Uno passt.

Schritt 5: Anzeigen

Anzeigen
Anzeigen
Anzeigen
Anzeigen
Anzeigen
Anzeigen

Oben sind Fotos von jedem einzelnen Display. Es gibt Fotos von der Vorder- und Rückseite jedes Displays und sie repräsentieren viele der Marken, die bei ebay oder ähnlich erhältlich sind. Einige sind I2C, einige sind parallel, einige haben größere Schriftarten, einige können volle 80 Spalten anzeigen, die für Wordstar und andere alte Textverarbeitungsprogramme geeignet sind. Es gibt mehr Details im Text des Arduino-Codes.

Schritt 6: Schaltplan

Unten sind zwei Dateien. Sie werden als.txt benannt, da Instructables keine.zip-Dateien verarbeitet. Laden Sie sie herunter und benennen Sie sie in.zip um.

Den Schaltplan und das Platinenlayout gibt es als pdf-Dateien. Es gibt auch ein Paket für Seeed PCB. Dies sind die Gerber und wenn Sie zu Seeed gehen und dies hochladen, sollten die Gerber angezeigt werden und Sie können dann PCBs herstellen lassen. Das 14-Segment-Board ist groß und kostet einiges mehr, aber das kleinere passt in das von Seeed bevorzugte 10x10cm-Format und ist daher für 5 oder 10 Boards durchaus angemessen - tatsächlich kostet der Versand mehr als die Boards.

Es ist durchaus möglich, viele der Displays zu verwenden, ohne eine Platine zu benötigen. Es gibt PS2-Sockelmodule, RS232-Abschirmungen/Module, die alle bei ebay oder ähnlichem erhältlich sind. Einige Displays wie die I2C-Displays können nur ein paar Anschlussdrähte verwenden. Einige wie die SSD1289-Displays werden mit Adapterplatinen geliefert und können direkt an einen Mega angeschlossen werden.

Schritt 7: Starburst-Anzeige

Starburst-Anzeige
Starburst-Anzeige

Das Starburst-Display ist ein größeres Board und verwendet einen Nano und eine Reihe von 74xx-Chips, um das Multiplexen durchzuführen. Es gab viele Experimente, um herauszufinden, wie viele Displays man multiplexen kann, bevor sie zu dunkel werden oder das Flimmern zu auffällig wird. Die Anzeigen kamen von Futurlec https://www.futurlec.com/LEDDisp.shtml Die 14-Segment-Anzeigen können auch Kleinbuchstaben darstellen und diese können bei Bedarf im Code geändert werden. Benennen Sie diese Dateien von.txt in.zip um

Schritt 8: Code für andere Displays hinzufügen

Es ist möglich, Code für andere Anzeigen hinzuzufügen. Der erste Schritt besteht darin, etwas, alles anzuzeigen. Es kann ein Pixel oder ein Buchstabe sein. Dies beinhaltet hauptsächlich die Suche nach Treibern, das Herunterladen eines Treibers, das Testen, das Finden, dass er nicht kompiliert werden kann, das Deinstallieren dieses Treibers, damit er später keine Verwirrung stiftet, und das Ausprobieren eines neuen Treibers. Der nächste Schritt besteht darin, einen Buchstaben in der richtigen Farbe anzuzeigen, da einige Displays, die identisch aussehen, die Farben tatsächlich invertieren. Glücklicherweise kann dies normalerweise nur eine Zahl im Startcode beheben. Der nächste Schritt besteht darin, ein paar Zeilen zu schreiben, um zu definieren, ob ein Uno oder Mega verwendet werden soll, die Anzeigebreite, -höhe, -schriftgröße, Tastaturpins und welche Treiberdateien verwendet werden sollen. Diese beginnen bei Zeile 39 im Code und Sie können das Format der vorhandenen Anzeigen kopieren.

Als nächstes gehen Sie zu Zeile 451 und fügen den Startcode hinzu. Hier stellen Sie die Hintergrundfarbe und die Rotation ein und starten die Anzeige.

Als nächstes gehen Sie zu Zeile 544 und fügen den Code hinzu, um ein Zeichen anzuzeigen. In manchen Fällen ist dies nur eine Zeile, zB

my_lcd. Draw_Char(xPixel, yPixel, c, tftForecolor, tftBackcolor, 1, 0); // x, y, char, fore, back, size, mode

Als nächstes gehen Sie zu Zeile 664 und fügen den Code hinzu, um ein Pixel zu zeichnen. Auch hier ist dies manchmal nur eine Zeile, zB:

tft.drawPixel(xPixel, yPixel, tftForecolor);

Gehen Sie schließlich zu Zeile 727 und fügen Sie den Code hinzu, um beispielsweise eine vertikale Linie für den Cursor zu zeichnen

tft.drawFastVLine(xPixel, yPixel, fontHeight, tftForecolor);

Das Programm sortiert anhand der Bildschirmbreite und der Schriftgröße beispielsweise aus, wie viel Speicher für den Bildschirmpuffer zuzuweisen ist.

Schritt 9: Wordstar-Demonstration

Dies wurde mit einem CP/M-Computer durchgeführt, und hier stehen viele Optionen zur Verfügung. Ich brauchte etwas schnell einzurichten, also habe ich eine Emulation auf einem ESP32 (Google ESP32 CP/M) verwendet. Es gibt viele andere Retro-Computer, zum Beispiel die FPGA-Emulation von Grant Searle und den RC2014 für diejenigen, die einen echten Z80 bevorzugen. Viele Retrocomputer neigen dazu, als Anzeige ein Terminalprogramm auf einem PC zu verwenden, zB Teraterm. Ein Großteil der Fehlersuche in diesem ANSI-Projekt beinhaltete das parallele Ausführen eines Terminalprogramms und des ANSI-Programms und das Sicherstellen, dass die Bildschirme identisch aussahen.

Schritt 10: Weitere Gedanken

Mit zunehmender Größe der Displays werden sie langsamer und langsamer. Beim Neuzeichnen eines Charakters wird jedes Pixel in diesem Charakter neu gezeichnet, da auch die Hintergrundfarbe gezeichnet werden muss. Es kommt also darauf an, wie schnell Sie ein Pixel zeichnen können. Es gibt einige Optimierungen, zum Beispiel, wenn ein Display nicht mit den eingehenden Daten Schritt halten kann, speichern Sie den Text einfach im Bildschirmpuffer und führen Sie dann eine Neuzeichnung des gesamten Bildschirms durch, wenn kein Text mehr eingeht. Viele Displays, die Sie sehen für Sale zeigt ein hübsches Bild auf dem Bildschirm an, aber was sie möglicherweise nicht anzeigen, ist, wie lange es dauerte, dieses Bild anzuzeigen, und in einigen Fällen kann es 5 Sekunden oder länger dauern. I2C und SPI eignen sich hervorragend für kleinere Displays, aber alles über 50 Spalten benötigt einen 8- oder 16-Bit-Datenbus.

Wordstar ist bei 9600 Baud etwas unhandlich und 19200 für Lauftexte viel brauchbarer, aber die Displays können da wirklich nicht mithalten.

Das schnellste Display, das ich verwendet habe, war auf dem Propeller-Chip mit zwei 8-Bit-externen 512k-RAM-Chips, um einen parallelen 16-Bit-Datenbus zu erstellen. Jede Schriftart wurde in den RAM vorgeladen. Eine Kaskade von 74xx-Zählerchips wurde verwendet, um die Daten in das Display auszutakten. Dies bedeutete, dass es keine interne Verarbeitung innerhalb der CPU gab, die Daten abholte und ausgab, und die Aktualisierungsrate war so schnell, wie der Propeller-Chip einen Pin umschalten könnte. Überraschenderweise konnten die Displays damit sogar bei 20Mhz mithalten und so war ein Vollbild-Update in nur 30 Millisekunden möglich. Diese Art von Geschwindigkeit ist schnell genug, um reibungsloses Scrollen zu ermöglichen, wie Sie es auf Mobiltelefonen sehen.

Der Propeller-Chip war vor über zehn Jahren auf dem neuesten Stand, und es gibt jetzt mehr Optionen, darunter ESP8266 und ESP32, die über große Mengen an internem RAM verfügen. Diese Chips haben jedoch immer noch keine große Anzahl von Pins, daher könnte es immer noch von Vorteil sein, die altmodische Art eines externen RAM-Chips zu verwenden, der zum Display ausgetaktet wird.

Für größere Displays kann es billiger sein, einen LCD-TV-Bildschirm oder einen VGA-Bildschirm zu verwenden und sich einige der codierten ANSI-Emulatoren anzusehen, z. B. den ESP32, die VGA direkt ansteuern.

Ich hoffe, Sie finden dieses Projekt nützlich.

James Moxham

Adelaide, Australien

Empfohlen: