Parallel-Druckdaten auffangen

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!)

Die Druckdaten ausstoßende Schnittstelle erwartet eigentlich nur: 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.
Schaltplan (Eagle-Quelle)
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.
Probeaufbau
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.
 
StückBeschreibungBauformReichelt-BestellkodePreis in € (2011)
1USB-FIFO-SchaltkreisQFN-32FT245RQ4,99
1Keramikkondensator 100 nF0603X7R-G0603 100n0,05
1Keramikkondensator 4,7 µF0603X5R-G0603 4,7/60,05
3Widerstandsnetzwerk 4 × 100 Ω1206BCN16 1000,02
1Widerstand 4,7 kΩ0603SMD-0603 4,7k0,10
1SubD-Stecker 25-poligLötkelchD-Sub St 250,19
1USB-Buchse MiniBDurchsteckUSB BWM0,98
1SubD-GehäusePlastKAPPE CG25G0,16
1USB-Kabel1 mAK 673-A1,00
1Ein- oder zweiseitige Leiterplatte, ggf. ohne Löcher (siehe Text)
Durchkontaktierungen oder Brücken können von Hand bestückt werden
LptCap.brdDIY
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: 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.
Schaltplan mit zwei 4-µs-Monoflops, generiert BUSY- und ACK-Pulse
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: 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.
Verdrahtung zum Pro Micro:
SubD25PortBoard
1PD44
2PD03
3PB115
4PB216
5PB314
6PB48
7PB59
8PB610
9PD76
10PD12
11PC65
12
18..24
GND
15-16
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.