Projekt: Drucker-Adapter für Messgeräte

Virtueller Drucker für meinen HP8595E


zurück zu HF , zurück zur Elektronik , Homepage


Einleitung
Überlegungen zum Bau
Hardware
Software
Bedienung
Downloads

zurück zu Projekte
zurück zu HF

HpPrint-Software
Foto



Einleitung

Ältere hochwertige Messgeräte hatten oft einen Parallelport-Anschluss für einen Drucker. Das trifft z.B. für meinen Spektrumanalysator HP8595 (mit Option 041) zu.

Wer sich noch an die Zeiten vor Windows erinnert, der weiß noch, dass man damals in jedem Programm den Druckertyp einzeln einstellen musste. Erst mit Windows wanderte die Druckerverwaltung im PC zentral an das Betriebssystem und nur dort wurde der Druckertyp dann noch eingestellt. Dazu gehörten dann auch Druckertreiber, die für das Betriebssystem (und nicht für das individuelle Programm) geschrieben sind.

Mein HP8595 stammt aus der vor-Windows-Zeit. Man wählt in einem Menü des Gerätes den konkreten Druckertyp aus, den man dann an der parallelen Schnittstelle (mit DB25-Steckverbinder an der Geräterückseite) anschließen muss. Zur Auswahl stehen eine Reihe typischer Nadel-, Laser- und Tintenstrahldrucker aus den 90er Jahren des vorigen Jahrhunderts (HP 2225C ThinkJet, HP 310* Portable DeskJet, HP 3630A PaintJet, HP 500 Series* DeskJets, HP LaserJet, HP QuietJet or QuietJet Plus, LQ-570 Epson, MX-80 Epson), die natürlich alle unterschiedliche Druckersprachen sprechen.

Will ich die Druck-Funktion nutzen, brauche ich also entweder einen antiken Drucker oder ich baue einen virtuellen Drucker. Die zweite Variante ist natürlich deutlich interessanter.

Ich bearbeite hier das konkrete Beispiel eines HP8595 mit Option 041. Prinzipiell sollte sich das aber auf viele antike Geräte mit parallelem Druckeranschluss übertragen lassen.



Überlegungen zum Bau

Ich brauche einen Adapter, der die parallele Druckerschnittstelle des HP8595 (DB25) mit dem USB-Port eines PC verbindet. Dieser Adapter muss sich gegenüber den HP8595 wie ein normaler Drucker verhalten, und die Druckdaten von diesem an den PC weiterleiten.

Im PC brauche ich dann eine Software, die die Daten entgegennimmt und in ein Bild wandelt.



Hardware

Es gibt am Markt viele USB-Parallel-Adapter. Allerdings dienen die dazu einen alten Drucker an einen modernen PC anzuschließen. Dabei werden also Daten von USB zum Parallelport transportiert. Ich brauche genau die Gegenrichtung. Da ich über die innere Hardware dieser Adapter nichts weiß, gehe ich erst mal davon aus, dass sie für meine Zwecke nicht brauchbar sind.

Meine erste Idee war es, auf Basis eines PICs ein Interface zu bauen, aber ich stieß auf eine deutlich einfachere Idee von Hendrik H. (https://www-user.tu-chemnitz.de/~heha/basteln/PC/LptCap/) Diese basiert auf einem FTDI-Chip FT245R. Dessen Nachfolger FT245ML habe ich seit Jahren im "Lager" liegen habe. Man kann aber auch Platinen mit diesem Chip (bzw. der bleifreien Version FT245BM) bei Ebay ab etwa 10€ kaufen. Der Chip hat auf einer Seite ein USB-Interface, welches sich am PC als virtueller serieller Port anmeldet. Auf der anderen Seite hat er eine bidirektionale parallele Schnittstelle mit einem FIFO. Was man parallel in diesen FIFO hineinschreibt, kann man dann über die virtuelle serielle Schnittstelle im PC auslesen.

Der Druckerport des HP8595 liefert die Daten immer byteweise. Liegt ein gültiges Byte am Portausgang an, dann gibt der HP8595 einen kurzen negativen Puls an der /STROBE-Leitung aus. Dann wartet er solange, bis er vom (virtuellen) Drucker ein negativen /ACK-Puls bekommt. Damit bestätigt der Drucker, dass er die Daten empfangen hat. Dann kann der HP8595 das nächste Byte liefern.

Die Schaltung legt die Datenbits an den Eingang des FIFO und verbindet einfach /STROBE, /ACK und den /WRITE-Puls-Eingang des FIFO miteinander. Gibt der HP85956 einen /STROBE-Puls aus, dann wird damit das Datenbyte in den FIFO geschrieben, und gleichzeitig auch der /ACK-Puls erzeugt. Mit dieser Schaltung, wird der HP8595 immer  mit voller Geschwindigkeit die Daten abliefern, da er sich ja seinen /ACK selbst erzeugt und er auf niemanden warten wird. Mit einem eher behäbigen mechanischen Drucker würde sowas nicht funktionieren. Der Drucker würde das /ACK erst erzeugen, wenn er endlich für das nächste Byte bereit ist. Dann würde der HP8595 die Daten nur mit der Geschwindigkeit ausliefern, mit der der Drucker drucken kann. Aber ein moderner PC mit einem einigermaßen aktuellen FT245R-Chip sollte problemlos in der Lage sein, den maximalen Druckdatenstrom eines fast 30 Jahre alten HP8595 zu verarbeiten.

Test

Versuch macht klug. Das direkte Verbinden von /STROBE und /ACK ist aus Sicht eines Druckers nicht wirklich normgerecht. Eigentlich soll /ACK mit einer Verzögerung kommen. Deshalb testete ich, ob der HP8595 mit dieser Beschaltung zurecht kommt. Am DB25-Anschluss habe ich Die Pins 15 (/ERROR) und 16 (/INIT) miteinander verbunden, dadurch kann der HP8595 den virtuellen Drucker scheinbar initialisieren. Verbunden wurden auch die Pins 1 (/STROBE) und 10 (/ACK). Die Pins 11 (BUSY) und 12 (PAPER_END) habe ich über 100 Ohm mit GND verbunden um einen arbeitsbereiten Drucker zu simulieren.
Danach "druckte der HP8595 problemlos in's Leere. Die einfache Schaltung ist also ausreichend. Der Abstand zwischen zwei Bytes betrug 200 us, das entspricht einer Datenrate von grob 5 kByte/s. Da das die maximale Datenrate ist, macht USB das im Schlaf.

Erst mal habe ich mir bei einem Ebay-Händler eine FT245-Platine beschafft. Diese hat natürlich USB-Anschluss, aber der Parallelport ist an einer zweireihigen Stiftleiste herausgeführt. Diese muss noch per Kabel mit einem DB25-Stecker verbunden werden.

Den Schaltplan für einen Adapter von der zweireihigen Anschlussleiste an den DB25-Stecker findet man ganz rechts. Ein Foto des Testaufbaus gibt es hier auch.


Foto des Adapters Adapterstecker

Es stellte sich heraus, dass bei direkter Verbindung von /STB und /ACK an der high-Flanke des /STB -Pulses ein kleiner Spike auftauchte, den der FT245 als zweiten WR-Pulse deutete. Dadurch wurde jedes Byte des Druckerportes zwei mal in den FT245 geladen.

Das nebenstehende Oszillogramm zeigt das. Blau ist das /STB=/ACK=WR-Signal und Grün das /TXE=BUSY-Signal. (Letzteres sieht etwas verschliffen aus, da ich den Masseanschluss der Messleitung sehr lang gelassen habe.) Der FT245 reagiert auf die fallende Flanke des /STB mit einem TXE-Puls. Daran erkennt man, das er das Datenbyte eingelesen hat. In der steigenden Flanke des /STR-Signals gibt es einen kurzen Zappler, (roter Pfeil) dessen abfallende Flanke vom FT245 als weiterer /STR interpretiert wird. Deshalb liest er das Datenbyte ein zweites Mal. Das sieht man gut am zweiten TXE-Puls.

Das konnte ich unterdrücken, indem ich /STR über einen 220 Ohm Widerstand mit /ACK (und WR) verbinde. Der kleine Spike verschwindet, und das Byte wird nicht mehr doppelt eingelesen.(rechtes Oszillogramm)

(Ein testweise eingesetzter  4,7-Kiloohm pull-up-Widerstand von /ACK nach VCC verbesserte weder die steigende Flanke, noch tat er was gegen den Spike. Einen deutlich kleineren Widerstandswert wollte ich nicht verwenden.)
Spike kein Spike


Aufbau

Nach dem Test habe ich eine Platine entworfen, die die gesamte Schaltung enthält.

Diese enthält einen Platz für einen Kondensator (C8) von /ACK nach GND. Normalerweise ist dieser Kondensator nicht erforderlich. Sollte aber im Einzelfall doch jedes Byte 2 mal gelesen werden, kann hier ein kleiner Kondensator (z. B. 68pF) eingesetzt werden, um den oben erwähnten Spike besser zu unterdrücken.


Platine
Stromlaufplan

Das Layout ist einseitig, und deshalb mit Haushaltsmitteln noch zu fertigen. Auf der anderen Platinenseite befinden sich nur drei Drahtbrücken, der DB-25-Steckverbinder und ein Elko.
Die SMD-Widerstände und -Kondensatoren sind in Größe 0804, nur R15 ist 1206.

Das Foto zeigt einen Prototypen, bei dem der 220-Ohm Widerstand R12 noch als bedrahteter Typ auf der Oberseite plaziert ist.
Platine im Einsatz



Software

Die Hardware gibt einen Bytestrom an den PC, den ein Drucker verstehen würde. Von einer grafischen Darstellung ist dieser Datenstrom aber noch weit entfernt. Es bedarf einer Software, die die Druckersprache spricht. Diese Software muss gestartet werden, bevor man mit dem HP8595 druckt. Sie muss dann während des Druckens die Daten vom Interface entgegennehmen und schließlich in ein Bild wandeln.

Der HP8595 unterstützt Drucker von HP und Epson. Diese benutzen unterschiedliche Sprachen. Für die HP-Drucker wird es eine Version von PCL sein, bei Epson Druckern erwarte ich ESC/P. Eine Interpretation einer kompletten Druckersprache in Software zu gießen ist echte Arbeit. Aber der HP8595 wird nur einen kleinen Teil der Sprache überhaupt benutzen - überwiegend wohl grafische Ausgaben. Es ist also sinnvoll, erst mal ein paar Druckjobs aufzuzeichnen, und dann nur die dort verwendeten Druckerbefehle in die Software aufzunehmen.

Wahrscheinlich ist der Epson Code einfacher, also zeichnete ich Druckjobs mit den Einstellungen EP_MX80_SML und EP_MX80_LRG auf (beides steht für den Nadeldrucker Epson MX80). Das auch Farbtintenstrahldrucker unterstützt werden, reizt mich sehr. Der eigentliche Bildschirm ist ja monochrom. Also zeichnete ich auch in der Einstellung HP_DESKJET_COLOR (steht für den Drucker HP500C) auf.

Im vom HP8595 erzeugten Epson-Nadeldrucker-Code gibt es nur 5 unterschiedliche Befehle:
Davon braucht man nur die beiden letzten wirklich abzuarbeiten. Die anderen kann man ignorieren. Die Rasterdruck-Befehle funktionieren so, wie man sich das von einem Nadeldrucker vorstellt, der mit 8 untereinander liegenden Nadel Grafik druckt, während sich der Druckkopf von links nach rechts über das Papier bewegt. Es wird ein Strom von Bytes übertragen. Die Bits eines Bytes steuern dabei gleichzeitig die 8 untereinander liegenden Nadeln an. Das höchstwertige Bit (MSB) steuert die oberste Nadel und das niederwertigste Bit (LSB) die unterste Nadel. Ist so ein Bit "1", dann druckt die Nadel einen Punkt. Danach geht es einen Schritt nach rechts, und das nächste Byte wird gedruckt. Ist der Rasterdruckbefehl abgearbeitet, geht es wieder an den linken Anschlag und 8 Schritte nach unten. Bereit für den nächsten Rasterdruck-Streifen.

Beim HP_DESKJET_COLOR -Druck habe ich 8 unterschiedliche Befehle aus dem PCL-Befehlssatz gefunden. Verwendet wird der "simple color mode: CMY und (zum Glück) keine Kompression des Druckdatenstromes. Da sich das nie ändert, reicht es, sich auf die "send raster data"-Befehle zu konzentrieren. Während Epson immer einen 8 Pixel hohen Streifen druckt, geht die PCL-Sprache von nur 1 Pixel hohen Streifen aus. Ein Byte beschreibt also 8 nebeneinander liegende Pixel (MSB ist links und LSB ist rechts). Mit 64 Byte lassen sich 512 horizontal angeordnete Pixel beschreiben, und genauso breit ist hier der Ausdruck des HP8595. Das würde allerdings nur für Schwarz-Weiß reichen. Im verwendeten "simple color mode:CMY" werden für jedes Pixel 3 Bit benutzt, um die möglichen 8 Farben zu kodieren.
Deshalb wird jede Druckzeile drei Mal ausgegeben. Zwei mal mit dem Befehl ESC*b#V und ein mal mit dem Befehl ESC*b#W. Beim ersten ESC*b#V-Datenstrom werden die niederwertigsten Bits (Bit0) der drei Bit ausgegeben, dann die mittleren Bits. Mit dem ESC*b#W kommt dann jeweils das dritte Bit. Nun wird die Zeile mit den richtigen Farben ausgegeben und danach an den Beginn der nächsten Zeile gegangen.
Der HP8595 verwendet drei Farben für seinen Druck. Der Hintergrund ist Weiß, die Messkurve ist Grün und alles andere ist Schwarz.

Die verwendeten Grafikformate (in Pixel) sind übrigens:
Die Seitenverhältnisse sind also jedesmal anders. Beim echten Druck sorgen genaue Einstellungen der horizontalen und vertikalen Druckauflösung dafür, dass das Seitenverhältnis auf dem Papier schließlich immer stimmt. Bei der Wandlung in ein Pixelbild verzichte auf eine solche Feinjustierung. Ein skalieren um einige 10% würde zu einer Bildunschärfe führen. Aber eine vertikale Streckung auf 200% bei EP_MX80_SML und HP_DESKJET_COLOR ist ohne Unschärfe möglich und sinnvoll. Also mache ich es.

EP_MX80_SML EP_MX80_LRG HP_DESKJET_COLOR




Der HP8595 unterstützt noch diverse andere Drucker, aber es bringt eigentlich keinen Mehrwert, diese auch noch in Software zu unterstützen. Ich habe mich nur darum gekümmert, das beim Empfang falscher Daten die Software nicht gleich abstürzt :)



Bedienung

Am HP8595 wird als Druckerport der Parallelport ausgewählt. Als Drucker wird der Farbdrucker HP_DESKJET_COLOR ausgewählt.

Der Parallel-USB-Adapter wird mit dem Druckerport des HP8595 sowie einem USB-Port des PC verbunden.

Die Software wird gestartet. Mit dem Zahnrad-Icon wird der Dialog für die Einstellung des Serialports geöffnet. Hier wählt man den richtigen Port aus, z.B. ttyUSB0. Die anderen Parameter übernimmt man. Im Hauptfenster klickt man nun auf CONNECT.

Um das aktuelle Bildschirmbild des HP8595 auf den PC zu bringen, drückt man am HP8595 die COPY-Taste. Das Bild wird übertragen und dargestellt. Um Das Bild als PNG-Grafik zu speichern klickt man auf SAVE PICTURE. Das Bild wird im Home-Verzeichnis des Nutzers mit dem Namen HP8595_<datum><zeit>.PNG abgelegt.



Während der Datenübertragung zum PC zählt die Software die empfangenen Bytes. Ist der Transfer beendet, erfolgt die Bilddarstellung. Je nach verwendetem Druckertyp ist ein Datensatz 52kByte (HP-COLOR), 22kByte (EP_MX80_SML) oder 32kByte (EP_MX80_LRG) groß.
Sollte am Ende der Übertragung in etwa der doppelte Wert angezeigt werden, kein Bild erzeugt werden und als Druckertyp ein "?" angezeigt werden, dann hat man es mit dem oben erwähnten Effekt des doppelten Einlesens der Bytes zu tun. In diesem Fall sollte der Kondensator C8 eingesetzt werden.




Downloads




zurück zu HF , zurück zur Elektronik , Homepage

Autor: sprut
erstellt: 24.04.2021
letzte Änderung: 30.05.2021