Hier mal ein wenig Retro:
Das Zeichnen von Graphiken auf mit einem Arduino und einem Terminal
Programm, welches das VT100 Protokoll versteht ( z.B. Teraterm ).
Ob wohl ein "Space-Invader" damit ginge?
Hier mal noch ein kleiner Test, wie eine analoges Signal dargestellt
werden könnte. Aufgenommen ist das ADC0 Signal vom Signalgenerator.
Die Auflösung ist wie man sieht ziemlich grob. Um sie zu verdoppeln
verwende ich für die Y-Höhe zwei Zeichen, nämlich ein Minus und ein
Underline.
Beispiel:
-_ _-
-_-
Schau Dir mal MCURSES an. mcurses läuft auf ATmegas, STM32F4xx,
STM32F10x und sogar Z80 (SDCC-Compiler) und auch unter Linux.
Es sollte nicht schwierig sein, das auf Arduino zu portieren.
Hier noch ein kleines Filmchen dazu:
http://www.mikrocontroller.net/wikifiles/e/ed/Mcurses.avi
Danke für den Link. Gut finde ich, dass es nicht so aufgebläht ist wie
"ncurses".
Probiert, ob die Sonderzeichen wie "Ecken" oder Farben auf meinem
"Teraterm" VT100 funktionieren. Aber scheinbar gehen weder Farben noch
Ecken.
ch schrieb:> "Teraterm" VT100
Teraterm kenne ich nicht, daher kann ich nichts dazu sagen.
Nimm PuTTY, das funktioniert sowohl mit COMx als auch mit
Netzwerkprotokollen. Die Terminalemulation ist eine sehr solide
VT220-Emulation mit allen Raffinessen.
> Aber scheinbar gehen weder Farben noch Ecken.
Zeig mal Deinen MCURSES-Source. Das Terminal wird abstrahiert, d.h. Du
darfst da keine Escape-Sequenzen ausgeben, sondern Du nutzt zum
Beispiel:
>Zeig mal Deinen MCURSES-Source.
Äh, ja, ich bin noch bei meinem Arduino-Script.
Jetzt geht das auch mit den Farben in Teraterm. Leider verzeiht das
Terminal kleine Syntaxfehler nicht ....
XTerm unterstützt auch ReGIS- und Sixel-Sequenzen, wie auch modernere
Terminals (VT240, VT340). Damit bekommst du sogar "echte" (Vektor- oder
Pixel-)Grafik, nicht nur Pseudografik mit Textzeichen.
S. R. schrieb:> XTerm unterstützt auch ReGIS- und Sixel-Sequenzen, wie auch modernere> Terminals (VT240, VT340). Damit bekommst du sogar "echte" (Vektor- oder> Pixel-)Grafik, nicht nur Pseudografik mit Textzeichen.
mmmhhh... Tek4014 Vektorgrafik... Lekker!
Sozusagen ein "serially controlled xy-scope" ;-)
>XTerm unterstützt auch ReGIS- und Sixel-Sequenzen, wie auch modernere>Terminals (VT240, VT340). Damit bekommst du sogar "echte" (Vektor- oder>Pixel-)Grafik, nicht nur Pseudografik mit Textzeichen.
Wie kann man denn XTerm mit der seriellen Schnittstelle verbinden?
Vielleicht könntest Du ja auch ein kleines Graphik Beispiel zeigen. Z.B.
wie man ein Dreieck zeichnet.
Jetzt habe ich mal das "screen_demo" zur Arduino Library hinzugefügt.
Im Anhang ist auch der Screen-Shot. Das Demo wirkt am besten, wenn man
es auf einem Arduino laufen lässt, weil es sich dynamisch verändert.
Unter Arduino-Gesichtspunkten sollte man wahrscheinlich den Syntax etwas
vereinfachen:
https://github.com/ChrisMicro/mcurses/blob/master/examples/screen_demo/screen_demo.ino
Menschen mit Rot-Grün-Blindheit könnten beim "temperature_demo" ein
Problem haben.
Aus mir unbekannten Gründen läuft der Farbbalken auch aus dem Bild
heraus.
ChrisMicro schrieb:> hier die erste Version vom "mcurses" als Arduino-Library:>> https://github.com/ChrisMicro/mcurses
Sehr schön, werde ich im MCURSES-Artikel verlinken.
ChrisMicro schrieb:> Jetzt habe ich mal das "screen_demo" zur Arduino Library hinzugefügt.>> Im Anhang ist auch der Screen-Shot. Das Demo wirkt am besten, wenn man> es auf einem Arduino laufen lässt, weil es sich dynamisch verändert.
Sehr nett.
> Unter Arduino-Gesichtspunkten sollte man wahrscheinlich den Syntax etwas> vereinfachen:>> https://github.com/ChrisMicro/mcurses/blob/master/examples/screen_demo/screen_demo.ino
Wie meinst Du das? Ich habe mich von der API möglichst nahe am
Curses-Original von AT&T bzw. an der ncurses-Lib gehalten.
ChrisMicro schrieb:> Aus mir unbekannten Gründen läuft der Farbbalken auch aus dem Bild> heraus.
Manche Terminalemulationen löschen bei clrtoeol() (Kommando: "Lösche bis
zum Ende der Zeile") mit der aktuell eingestellten Farbe. Aus meiner
Sicht ist das allerdings ein Bug in der Teminal-Emulation. PuTTY,
welches in meinen Augen eine exzellente Implementation von
VT220-Terminals ist, zeigt dieses Phänomen zum Beipiel nicht. Ist aber
reine Spekulation. Dazu müsste ich mir nochmal den Source der
mcurses-Demo genauer ansehen. Fixen könnte man dies, indem man in der
clrtoeol()-Funktion die Farben sichert, auf normal zurückschaltet, den
eigentlichen clear-Befehl durchführt und dann die aktuellen Farben
wieder restauriert. Dasselbe müsste man vermutlich auch bei clrtobot()
machen.
Aber wie gesagt: Der Bug ist in der Terminal-Emulation, nicht im mcurses
:-)
>ChrisMicro schrieb:>> Aus mir unbekannten Gründen läuft der Farbbalken auch aus dem Bild>> heraus.>Manche Terminalemulationen löschen bei clrtoeol() (Kommando: "Lösche bis>zum Ende der Zeile") mit der aktuell eingestellten Farbe.
Hmmm ... gerade habe ich das Ganze für den Arduino DUE compiliert ( ARM
Cortex M3 ) und dort sieht es gut aus ( Bild ).
Ursprünglich konnte ich nicht auf dem DUE compilieren, weil dort die
AVR-PROGMEM Funktionen fehlten. Ich habe sie als MACRO eingefügt und
jetzt sollte "mcurses" für alle Prozessoren funktionieren.
In Deinem ursprünglichen Code waren die Hardware-Treiber für die
Prozessoren integriert. Das gehört meiner Meinung nach dort nicht hin
sondern in eine getrennte HAL.
Deshalb habe ich das Interface durch CAll-Backs ersetzt und damit wird
die Library universell einsetzbar:
1
voidArduino_putchar(uint8_tc)
2
{
3
Serial.write(c);
4
}
5
6
voidsetup()
7
{
8
Serial.begin(115200);
9
10
setFunction_putchar(Arduino_putchar);// tell the library which output channel shall be used
11
12
initscr();// initialize mcurses
13
14
}
Aus irgendwelchen Gründen sieht das Bild auf dem Uno aber anders aus,
deshalb vermute ich, dass es doch etwas mit PROGMEM zu tun hat.
ChrisMicro schrieb:>>XTerm unterstützt auch ReGIS- und Sixel-Sequenzen, wie auch modernere>>Terminals (VT240, VT340). Damit bekommst du sogar "echte" (Vektor- oder>>Pixel-)Grafik, nicht nur Pseudografik mit Textzeichen.>> Wie kann man denn XTerm mit der seriellen Schnittstelle verbinden?
Indem du im XTerm ein "minicom", "picocom" oder ein beliebiges anderes
Programm startest, welches mit der seriellen Schnittstelle sprechen kann
und die Zeichen nicht interpretiert. ;-)
> Vielleicht könntest Du ja auch ein kleines Graphik Beispiel zeigen. Z.B.> wie man ein Dreieck zeichnet.
Du musst folgendes an das XTerm schicken, um im Tek4014-Modus ein
Dreieck zu zeichnen:
- 0x1B 0x5B 0x3F 0x33 0x38 0x68 (setze XTerm in Tek-Modus)
- 0x1B 0x0C 0x1B 0x1D (leere Bildschirm und wechsle zu Grafik)
- die eigentliche Grafik in ASCII, z.B. ",p,P,p/T.b.B,p,P"
- 0x1F 0x1B 0x03 (wechsle zu Text und setze XTerm in VT100-Modus)
Als Shell-Befehl tut bei mir folgendes:
wobei die ^ für Steuerzeichen stehen (also ^[ ist ESC usw.)
Steuerzeichen kann man unter Unix mit STRG+V gefolgt vom Wunschzeichen
eingeben, z.B. "STRG+V ESC" oder "STRG+V STRG+L".
Für ReGIS und Sixel bastle ich dir das jetzt aber nicht zusammen. Da ein
VT220 (xterm-default) die nicht anzeigen kann, musst du xterm dafür mit
einem Parameter starten. Infos gibt's im Netz. :-)
S. R. schrieb:> Du musst folgendes an das XTerm schicken, um im Tek4014-Modus ein> Dreieck zu zeichnen:> - 0x1B 0x5B 0x3F 0x33 0x38 0x68 (setze XTerm in Tek-Modus)> - 0x1B 0x0C 0x1B 0x1D (leere Bildschirm und wechsle zu Grafik)> - die eigentliche Grafik in ASCII, z.B. ",p,P,p/T.b.B,p,P"> - 0x1F 0x1B 0x03 (wechsle zu Text und setze XTerm in VT100-Modus)
So funkts auch mit copypaste. ;)
Ich habe das gerade mal im Ubuntu-Terminal ausprobiert
( GNOME Terminal 3.18.3 )
Da funktioniert es aber leider nicht.
>Indem du im XTerm ein "minicom", "picocom" oder ein beliebiges anderes>Programm startest, welches mit der seriellen Schnittstelle sprechen kann>und die Zeichen nicht interpretiert. ;-)
Das ging jetzt bei mir auch nicht. "minicom" konnte nicht mal Farben
darstellen. Ob das wohl mit den Eigenschaften des Ubuntu-Terminals
zusammenhängt?
ChrisMicro schrieb:> Ich habe das gerade mal im Ubuntu-Terminal ausprobiert> ( GNOME Terminal 3.18.3 )> Da funktioniert es aber leider nicht.
Wenns't im Ubuntu-Terminal xterm eingibst (xterm musst ws. installieren)
und dort dann die echos aufrufst....
W. M. (thematsche)
>Wenns't im Ubuntu-Terminal xterm eingibst (xterm musst ws. installieren)>und dort dann die echos aufrufst....
Danke, das funktioniert tatsächlich. Wieso haben die ein extra Terminal?
Jetzt wäre vielleicht noch die Frage interessant, wie man das Terminal
mit der seriellen Schnittstelle verknüpft.
Kann eigentlich "telnet" das VT100 Protokoll?
Vielleicht könnte man dann MCURSES auf eine ESP8266 verwenden und mit
"telenet" eine graphische Ausgabe machen.
ChrisMicro schrieb:> Kann eigentlich "telnet" das VT100 Protokoll?
Kommt drauf an, welches telnet Du meinst. Unter Unix bzw. Linux schreibt
es einfach die empfangenen Zeichen auf stdout und sendet die
eingetippten Zeichen (stdin) übers Netzwerk. Das ursprüngliche Telnet
kennt also keine Terminal-Emulation. Warum sollte es auch? Es wird ja in
einer Terminal-Emulation gestartet!
Wie das beim telnet.exe unter Windows ist, weiß ich nicht. Ich vermute
mal, da wird auch einfach alles an die Eingabeaufforderung
weitergeleitet. Und die kann - meines Wissens nach - allenfalls
rudmimentäres VT52. Also Computersteinzeit. Aber: telnet.exe braucht man
nicht, siehe unten.
> Vielleicht könnte man dann MCURSES auf eine ESP8266 verwenden und mit> "telenet" eine graphische Ausgabe machen.
Wenn Du PuTTY nimmst, geht das selbstverständlich. PuTTY kann auch
telnet und liefert seine eingebaute VT220-Emulation direkt mit. Unter
Linux nimmst Du telnet, welches Du aus einer geeigneten
Terminal-Emulation startest.
Also: Es geht. Man braucht nur die richtigen Werkzeuge.
ChrisMicro schrieb:> Ich habe das gerade mal im Ubuntu-Terminal ausprobiert> ( GNOME Terminal 3.18.3 )
Wenn ich explizit "xterm" schreibe, dann meine ich auch "xterm". Die
ganzen anderen Terminalemulatoren unterstützen alle keine Grafik.
ChrisMicro schrieb:> "minicom" konnte nicht mal Farben darstellen.> Ob das wohl mit den Eigenschaften des Ubuntu-Terminals zusammenhängt?
Minicom soll Bytes von der seriellen Schnittstelle empfangen und auf
seiner Standardausgabe ausgeben, und es soll Bytes von seiner
Standardeingabe lesen und auf die serielle Schnittstelle ausgeben.
Telnet macht übrigens exakt das gleiche, nur statt mit der seriellen
Schnittstelle mit einem TCP-Datenstrom.
Wie die Daten interpretiert werden, ist ausschließlich Aufgabe des
Terminalemulators. Aktuelle Software unterstützt meist einen Teil von
VT220 (d.h. VT100 mit Farbe), die Windows-Eingabeaufforderung dagegen
nur VT52 (aber mit Erweiterungen für Farbe).
Grafikfähige Terminals (Tek40xx, VT240, VT340) werden leider fast nie
emuliert, obwohl die für Mikrocontroller durchaus nützlich sein könnten.
S. R. (svenska)
>Wie die Daten interpretiert werden, ist ausschließlich Aufgabe des>Terminalemulators. Aktuelle Software unterstützt meist einen Teil von>VT220 (d.h. VT100 mit Farbe), die Windows-Eingabeaufforderung dagegen>nur VT52 (aber mit Erweiterungen für Farbe).
Danke für die Antwort.
Gerade eben habe ich das Temperaturdemo von hier
https://github.com/ChrisMicro/mcurses
und minicom im
LXterminal 0.1.11
und
xterm
ausprobiert.
Die Positionierung funktioniert dort, aber es gibt wohl keine Farben.
Gibt es ein Terminalprogramm für Ubuntu, was das grundsätzlich kann?
>Grafikfähige Terminals (Tek40xx, VT240, VT340) werden leider fast nie>emuliert, obwohl die für Mikrocontroller durchaus nützlich sein könnten.
Der Code für das wandernde Dreieck oben funktioniert mit minicom im
xterm.
ChrisMicro schrieb:> Die Positionierung funktioniert dort, aber es gibt wohl keine Farben.> Gibt es ein Terminalprogramm für Ubuntu, was das grundsätzlich kann?
So ziemlich alle Terminalemulatoren können das. Wenn du "^[[33m" an dein
Terminal schickst, siehst du das auch.
Bist du dir sicher, dass
(a) minicom alle Zeichen durchreicht und selbst nichts filtert?
(b) mcurses auch tatsächlich die Farbsequenzen verschickt?
Ich vermute, dass minicom schuld ist. Probiere mal picocom aus.
Nachtrag: Probiere mal "minicom -c on".
>Bist du dir sicher, dass>(a) minicom alle Zeichen durchreicht und selbst nichts filtert?>(b) mcurses auch tatsächlich die Farbsequenzen verschickt?
Unter Windows wird mit PuTTY und TERATERM alles richtig angezeigt. Aus
diesem Grunde bin ich mir sicher, dass das MCURSES-Temperatur-Demo
korrekt implementiert ist und funktioniert.
Unter Ubuntu mit MINICOM es so wie oben angezeigt.
>Ich vermute, dass minicom schuld ist. Probiere mal picocom aus.
PICOCOM macht im Gegensatz zu MINICOM nicht mal die Positionierung.
>Nachtrag: Probiere mal "minicom -c on".
Danke, damit werden die Farben jetzt korrekt angezeigt.
Allerdings: Wie man im Bild oben sieht, werden beim Temperatur-Bar-Graph
die Striche durch andere Zeichen ersetzt.
Ich vermute, dass VT100 normalerweise den IBM-Zeichensatz CP347 benutzt
https://de.wikipedia.org/wiki/Codepage_437
Diese beinhaltet die Striche. Aber scheinbar verwendet MINICOM nur einen
ASCII Zeichensatz.
ChrisMicro schrieb:>>Ich vermute, dass minicom schuld ist. Probiere mal picocom aus.> PICOCOM macht im Gegensatz zu MINICOM nicht mal die Positionierung.
Dann frisst irgendwas in deinem System die Escapesequenzen, statt sie
direkt ans Terminal zu senden. Das gesamte Terminalsystem besteht aus zu
vielen Programmen, die zu intelligent sein wollen.
ChrisMicro schrieb:> Ich vermute, dass VT100 normalerweise den IBM-Zeichensatz CP347 benutzt
Als das DEC VT100 rauskam, gab es den IBM-PC und dessen CP437 noch
nicht. Die DEC-Terminals verwendeten ihren eigenen Zeichensatz, der aber
zur Laufzeit umgeschaltet werden muss zwischen ASCII und Grafikzeichen.
Wenn das nicht funktioniert, kriegst du Kleinbuchstaben.