Will man Druckdaten von einem Parallelport mit einem PC auffangen,
benötigt man dazu auf jeden Fall extra Hardware.
Will man USB-Druckdaten auffangen,
genügt ein zusätzlicher USB-Paralleldrucker-Konverter,
den man preiswert nahezu überall kaufen kann,
etwa bei Reichelt.
Eine Ein-Box-Lösung
ist auch nichts anderes als so ein Ensemble,
nämlich zwei Mikrocontroller Rücken an Rücken, nur ungleich teurer.
Aufbau
Mit einem FT245R
von FTDI
gestaltet sich die Lösung überraschend einfach.
Dieser Schaltkreis beinhaltet eine bidirektionale USB-Parallel-FIFO
und kann sich unter Windows als serielle COM-Schnittstelle abbilden.
Und das Schöne an USB ist, dass man keine extra Stromversorgung braucht.
Der Einsatz des FT245R (das R ist wichtig!)
liefert quasi gratis eine COM-Schnittstelle, auch unter Windows 64 bit und Linux
(FTDI ist da recht fleißig bei der Treiberentwicklung)
erspart den Quarz sowie viele andere Peripheriebauelemente vergleichbarer Lösungen
erspart das Programmieren eines Mikrocontrollers
ermöglicht mittels FT-Tool das Anpassen von Deskriptoren für eine individuelle Lösung
erlaubt hohe Datendurchsatzraten am USB-Limit (Full-Speed)
ermöglicht echte 5-V-TTL-Pegel auf der Peripherieseite
Die Druckdaten ausstoßende Schnittstelle erwartet eigentlich nur:
BUSY (beschäftigt) ist HIGH wenn der Druckerpuffer voll ist, sonst LOW
ERR (Error = Fehler) permanent HIGH (kein Fehler)
PE (Paper End = Papierende) permanent LOW (kein Papierende)
ACK (Acknowledge = Bestätigung) „zappelt“ mit jedem übertragenen Byte
Die Druckdaten werden schließlich mit einem LOW-Impuls an
STROBE (Einblendung) ausgegeben, das ist alles.
Die Leitungen INIT,
SELIN,
AUTOFD
sowie SEL sind ohne Belang.
Siehe auch Parallelport-Artikel
bei Wikipedia.
Obwohl der Ruhepegel für WR eigentlich LOW ist, funktioniert es auch mit HIGH,
direkt von STROBE, ohne Inverter.
Die andere FIFO-Datenrichtung des FT245R ist totgelegt.
Der Pull-Up-Widerstand R1 an
WR
sorgt nur dafür, dass beim An- und Abstecken
des Druckerkabels nicht willkürliche Bytes in die FIFO eingeschrieben werden.
Die Widerstandsnetzwerke RN1, RN2 und RN3
schützen die Anschlüsse des FT245 vor übermäßigen Spannungsspitzen durch
Signalreflexionen
auf dem Druckerkabel.
Der einseitig angeschlossene Widerstand RN1B ist übrig,
und der Anschluss dient zur Vereinfachung der Entflechtung (siehe Board unten).
Widerstandsnetzwerke sind bei Reichelt billiger als Einzelwiderstände.
Im Versuchsaufbau wurde ein fertig bestücktes
FT245R-Modul von Siphec
benutzt, um den Aufbau auf dem
Steckbrett
zu ermöglichen.
Die Serienwiderstände wurden der Einfachheit halber weggelassen;
die Schaltung sollte direkt am Druckerport angeschlossen werden,
um Signalreflexionen auszuschließen.
Wer den Aufwand der unten gezeigten Leiterplatte scheut,
ist mit diesem Modul gut bedient.
Denn beinlose Schaltkreise mit Padabstand 0,5 mm zu verlöten
ist nicht jedermanns Sache.
Leiterplatten-Entwurf (Eagle-Quelle)
und Stückliste
Das bisschen Kram passt locker in ein SubD-Steckergehäuse.
Für die Konstruktion stand USB2LPT Pate;
es ist recht gleichartig aufgebaut,
mit der Mini-USB-B-Buchse in leiterplattenmittiger Kantenmontage.
Siehe YouTube-Video
zur Verarbeitung der Buchse.
Die dargestellte Leiterplatte ist mit amateurmäßigen Mitteln herstellbar
und ist auf minimale Anzahl von Durchkontaktierungen optimiert.
Notfalls kann man diese auch einseitig entwickeln und Drahtbrücken einsetzen.
Sogar auf das Bohren von Löchern kann man verzichten.
Alle Bauelemente befinden sich auf der Oberseite.
Hinweis: Der Gehäusetyp Q (QFN, 32-polig, Padabstand 0,5 mm) ist bei
Reichelt nicht mehr lieferbar (2011),
für den Gehäusetyp
L
(SSOP, 28-polig, Beinabstand 0,65 mm) wären die Pin-Nummern im Schaltplan falsch
und die Leiterplatte neu zu routen.
Verwandtes
Dinge mit USB und Parallelport gibt es einige:
h#s USB2LPT, stellt ein Parallelport zur Verfügung,
für Programmiergeräte und Bastelsachen, nicht für Drucker
h#s LPTzUSB,
ermöglicht das Drucken auf USB-Drucker vom Parallelport aus,
alternative Produkte sind am Ende der dortigen Webseite gelistet
Weiterhin gibt es Lösungen rund ums Parallelport, die über Ethernet laufen,
etwa diese.
LptCap ist nicht dazu gedacht, lokale Druckdaten aufzufangen.
Auch wenn das tatsächlich funktioniert,
dafür gibt es software-basierende Lösungen, bspw. die Shareware
DosPrn,
neben den vom jeweiligen Betriebssystem gebotenen Lösungen.
Außer mit dem FT245R kann man's auch umständlicher mit Mikrocontroller und Firmware lösen.
Möglicherweise ist's billiger. Beispielsweise:
Bisweilen möchte man Druckdaten parallel zum Drucker mitprotokollieren.
Als Y-Kabel sozusagen.
Dann ist in die BUSY-Leitung ein ODER-Gatter einzufügen.
Dieses blockiert das Ausgabeport solange, bis sowohl Drucker als auch FT245R
bereit sind zum Datenempfang — dann geht niemandem ein Byte durch die Lappen.
Im Prinzip kann man das auch in Software erledigen, d.h. das Programm SPE
(siehe unten) ist so zu modifizieren,
dass es sowohl druckt als auch protokolliert.
Beim hardwaremäßigen Ansatz als Y-Kabel ist zu klären, was passieren soll,
wenn der Protokoll-PC ⓐ ausgeschaltet oder ⓑ nicht empfangsbereit ist.
Davon hängt die Beschaltung des ODER-Gatters ab.
Komplizierter werden die Dinge von ganz allein
Es ist denkbar, dass bestimmte Geräte ein irrsinnig kompatibles Signalspiel
auf BUSY und ACK erwarten.
Anders ausgedrückt, der Drucker muss hinreichend lahm sein.
Zwei Grundgatter-Schaltkreise machen das Ganze deutlich komplexer.
Die Eagle-Quelle ist diesmal ohne gültiges Board.
Tatsächlich gibt es Geräte, die nur so funktionieren.
Alternative Arduino
Die Bastelboards der 8-bit-Arduino-Reihe sind hierfür auch gut geeignet:
preiswert, aus China billig sowie verbreitet
USB-Anschluss und Quarz bereits vorhanden
Programmieradapter on-board
Freie, quelloffene Programmiersoftware
Am naheliegendsten ist hierfür der Einsatz eines
Pro Micro,
mein derzeitiger Liebling mit dem modernen ATmega32U4.
Beispielhaft diesen
von Ebay für weniger als 4 Euro.
Dessen Firmware besteht im Wesentlichen aus der folgenden
ISR:
;ISR bei Hi-Lo-Übergang an Strobe (hier: Input Capture an PD4)
;UENUM sei bereits mit der Endpoint-Nummer für USB-CDC-IN geladen,
;die Register R16, R17 und Flags verfügbar zwecks schneller Interruptreaktion auf die Hi-Lo-Flanke an Strobe
sbi PORTD,1 ;BUSY high
in r16,PINB ;(herausgeführte) D1..D6
in r17,PIND ;restliche D0 und D7
andi r16,0x7E
andi r17,0x81
or r16,r17 ;zusammensetzen
sts UEDATX,r16 ;Byte zum USB-CDC ausgeben
in r16,UEINTX
sbrc r16,5 ;RWAL-Bit: FIFO voll?
rjmp 1f ;nein, zum ACK-Zyklus
ldi r16,0x7F
sts UEINTX,r16 ;Puffer abschicken (FIFOCON löschen)
in r16,UEINTX
sbrs r16,5 ;RWAL-Bit: Neue Bank (des Doppelpuffers) vorhanden?
rjmp 2f ;nein, BUSY HIGH lassen (Hauptschleife muss sich kümmern)
1: cbi PORTD,1 ;BUSY low
cbi PORTC,6 ;!ACK low
ldi r16,16
1: dec r16 ;3 µs warten
brne 1b
sbi PORTC,6 ;!ACK high
2: reti ;fertig
Beispiel-Implementierung mache ich erst auf Anfrage!
Deshalb gibt's hier zurzeit keine Firmware zum Runterladen.
Anwendung
Zum Einlesen von gelegentlichen oder auch kontinuierlichen Druckdaten
kann man HyperTerminal
benutzen und die Mitschnitt-Funktion aktivieren.
Die einzustellende Baudrate ist schnuppe.
Außer bei Verwendung eines Arduino Uno.
Hingegen zum Ausdruck auf einen anderen Windows-Drucker
(bspw. einen PDF-Generator), ggf. unter Beachtung eingebetteter
ESC/P-Druckersteuerkodes,
gibt es das Programm
SPE = Serial Printer Emulator.
Der Name kommt daher, weil jenes Programm den Computer in (mindestens)
einen Drucker mit serieller Schnittstelle umwandelt,
zusammen mit dem hier vorgestellten Adapter mit paralleler Schnittstelle.
Selbstverständlich kann man auch jede andere Art von Programm selber schreiben,
das die Daten von der COM-Schnittstelle einliest und auswertet,
etwa in VisualBasic, VBA, C++, Python oder LabVIEW.
Die Leiterplatte oder das Fertiggerät gibt es nicht bei mir zu kaufen,
Nachfrage zwecklos! Wer so etwas ganz schnell braucht, geht am besten zu
Ebay, ersteigert sich dort ein FT245R-Modul,
und lötet einen SubD-Stecker mit kurzen Drähten an.
Sieht nicht so schick aus, aber funktioniert und geht schnell.