25pol. SubD-Buchse Parallel-zu-USB-Konverter „LPTzUSB“ USB-Logo

Foto
Foto vom Fertiggerät. Die grüne LED zeigt den Verbindungsstatus an; die rote LED den Stromversorgungsstatus

Dieses (nicht mehr einzigartige) Gerät ermöglicht den Anschluss eines USB-Druckers an ein Parallelport. LPTzUSB (Namensänderung wegen Androhung einer Markenrechtsklage) kann direkt oder mit einem Verlängerungskabel am Druckerport des Rechners verwendet werden (hat einen 25pol. SubD-Stecker). Auf der anderen Seite wird das zugehörige USB-Kabel mit dem flachen USB-A-Stecker eingesteckt. Am Drucker sollte die quadratische USB-B-Buchse vorhanden sein.

Der eingesetzte Host-Controller unterstützt USB Full-Speed (12 Mbit/s) und Low-Speed (1,5 Mbit/s), nicht jedoch High-Speed (480 Mbit/s).

Je nach Situation kann der Einsatz eines Steckernetzteils notwendig werden! Ob die Firmware auch USB-Hubs unterstützt ist mangels Test nicht aussagbar. Es wird nicht empfohlen und erscheint auch unsinnig.

Vorteilhaft anwendbar bei Anschluss von USB-Druckern an:

Gegenanzeigen

Nachfolgemodell

Wegen des sehr geringen Datendurchsatzes (ca. 30 kByte/s) des unten aufgeführten Modells ist eine Nachfolgeversion mit PIC32MX420, AT32UC3B0128 oder LM3S5632 in Vorbereitung. Diese Lösungen sind obendrein billiger.

Verwendung als Entwicklungssystem

Weil dieser Konverter den beim Bastler sehr gebräuchlichen Mikrocontroller-Chip ATmega16 sowie einen „bidirektionalen“ USB-Host/Device-Controller enthält, lässt sich damit alles mögliche programmieren.

Vielleicht braucht ja jemand auch einen Konverter von GPIB (IEEE488) auf USB. Also dass sich der USB-Drucker als ein GPIB-Drucker ausgibt.
Kein USB-GPIB-Konverter der herkömmlichen Art. Diese sind USB-Devices und können nicht direkt einen Drucker ansteuern, sondern brauchen dazu einen PC und ein geeignetes Capture-Programm. Solche USB-GPIB-Konverter bilden GPIB als TMC ab.

Aufbau

Dieser Aufbau geht von einer professionell hergestellten Leiterplatte aus und erfordert feinfühligen Umgang mit dem Lötkolben. Die Produktionsdaten liegen im Eagle-Format vor. Zur Minimierung des (automatisierten) Bestückungsaufwandes wird einseitig bestückt.

Die Schaltung ist so ausgelegt, dass man nur einen SubD-Programmieradapter braucht, um die Firmware einzuspielen. Es wird kein gesonderter ISP- oder gar JTAG-Anschluss benötigt.

Der Programmieradapter ist nicht kompatibel mit dem für USB2LPT Low-Speed, erfüllt aber den gleichen Zweck.

Stückliste

Stück Bauteil Bestell-Bezeichnung EVP [€]Lieferant
1 USB-Host/Device-Controller SL811HST-AC 428-1464-ND 6,74+ DigiKey
1 Spannungsregler TPS76133 296-11010-1-ND 0,89+
1 Längsregler 5 V µA78L05 0,12 Reichelt
1 Mikrocontroller ATmega16 TQFP-Gehäuse ATMEGA 16-16 TQ 2,55
1 Quarz 12000 kHz 12,0000-HC49U-S 0,23
1 SubD-Stecker 25pol. D-SUB ST 25 0,10
1 LED rot + LED grün LED 3mm rt 0,05
1 LED 3mm gn 0,05
1 USB-Buchse Typ A USB AW 0,20
1 Hohlbuchse HEBW 21 0,26
2 „Fußvolk“ PCC2233CT-ND 0,156+ DigiKey
2 X7R-G0603 100n 0,05 Reichelt
2 NPO-G0603 22p 0,05
2 rad 47/16 0,04
1 BAT 54C 0,07
1 1N4148SMD 0,04
1 PFRA 010 0,46
2 SMD-0805 2k2 0,08
1 BCN16 22k 0,02
1 BCN16 22 0,02
1 Selbstbaugehäuse COM 938 0,30
1 USB-Kabel AK 672/2-2,0 0,60
1 Leiterplatte ul-11.brd 5,00 h#s

Bestückung

Zunächst werden die SMD-Bauelemente und der Quarz bestückt. Der USB-Host/Device-Controller mit seinem 0,5-mm-Beinabstand erfordert besonders große Sorgfalt.

Wie schon vom USB2LPT bekannt besteht das Problem, dass es keine USB-Buchsen für Leiterplatten-Kantenbestückung zu kaufen gibt. Deshalb erfolgt die Bestückung gewöhnlicher Durchsteck-Typen in einem Leiterplatten-Ausschnitt.

Nachtrag: Vor dem Verlöten der USB-Buchse müssen die seitlichen Kontaktfedern ganz ausgebogen werden! Ansonsten geht der Stecker zu schwer hinein bzw. verformt sich. Alternativ: Bestückung der USB-Buchse mit einem gesteckten Stecker.

Der SubD-Stecker wird in der gewohnten Kantenbestückung angesetzt.

Das Loch für die LEDs sowie Beschriftungs-Etiketten nicht vergessen!

Foto
Fotos vom Innenleben (Rev. 1). (Ver. 1.0 hier klicken!) Alle SMDs sind reflowfreundlich auf nur einer Seite

Programmierung

Die Programmierung des ATmega16 erfolgt mit einem speziellen Parallelport-Adapter direkt an der parallelen Schnittstelle, bspw. mit PonyProg. Der RESET-Anschluss erfolgt über die interne Lötbrücke SJ2. Diese ist vor dem Programmieren zu schließen und kann auch im Betriebsfall geschlossen bleiben. Alle JTAG-Signale sind ebenfalls am SubD-Stecker herausgeführt, habe ich aber noch nie benutzt.

Die Konfigurationsbits sind wie im folgenden Bild zu setzen:

Screenshot
Konfigurationsbits: Genau so setzen!

Software

Inbetriebnahme

Original
Es wird fast immer ein Steckernetzteil mit geregelter Ausgangsspannung 5 V benötigt! Anschluss via Hohlstecker, Außendurchmesser 5,5 mm, Innendurchmesser 2,1 mm. Pluspol innen. Beispielsweise Reichelt SNT1000 für 11,80 € oder SNT3129 für 8,65 € („4,5 V“ benutzen). Die Schaltung ist verpolungsgeschützt, jedoch nicht vor Überspannung!

Revision 1 (ab 2007)
Es wird (irgend)ein Steckernetzteil mit mindestens 8 V (ungeregelter) Gleichspannung benötigt! Hohlstecker-Anschluss dito.

Wer mit einer geregelten 5-V-Quelle speisen will (bspw. via Tastaturbuchse vom PC-Netzteil), muss mit der internen Lötbrücke SJ1 den Längsregler totlegen. Dazu Flächen 2-3 verbinden.

Alle Arten
Ohne sichtbare Extra-Kabel erfolgt die Speisung von 5 V über Pin25 des SubD-Steckers. Dazu muss im Rechner die Masseverbindung zum Pin25 getrennt – und über eine selbstrückstellende Sicherung (bspw. PFRA 050) an 5 V gelegt werden. Im Hobby-Bereich war diese Modifikation recht verbreitet.

Der Zweck der selbstrückstellenden Sicherung ist, dass man ein normales Parallelport-Gerät anschließen kann, welches die Pins 18-25 kurzschließt, ohne das Netzteil abzuschießen.
Allerdings ist diese Maßnahme ziemlich sinnfrei für Batteriebetrieb; der dann permanent heiße Sicherungskörper würde den Energiespeicher leersaugen.

Für den Betrieb von LPTzUSB wird wärmstens ein RS232-TTL-Konverter empfohlen, mit dem über die serielle Schnittstelle und bspw. HyperTerminal bei 38400 Baud Statusinformationen angezeigt werden:

HyperTerminal-Screenshot
LPTzUSB-Statusanzeige via serielles „Debug-Terminal“

Übrigens, die Farben werden vom ATmega-Programm generiert! Kein Windows-Programm wurde hier geschrieben.

Die Bytes der angezeigten Deskriptoren haben folgende Bedeutung:

  1. USB-Adresse (weil ohne HUB-Unterstützung immer 01)
  2. USB-Geräteklasse (Drucker: 07)
  3. USB-Geräteunterklasse
  4. USB-Protokollnummer
  5. Nummer der Konfiguration (fast immmer 01)
  6. Nummer des Interfaces (häufig 00)
  7. Nummer der alternativen Einstellung (häufig 00)
  8. Anzahl der Endpoints (außer EP0)
  9. EP0: Bits:
  10. EP0: FIFO-Größe
  11. EPx: Bits für nächsten Endpoint usw.
  12. EPx: FIFO-Größe für nächsten Endpoint usw.

Lieferumfang

Das Fertiggerät gibt's je nach Bedarf ohne Netzteil, mit normalem Steckernetzteil oder Schaltnetzteil. Hier abgebildet ist's mit Reichelt-Schaltnetzteil.

Foto
Paket-Inhalt. Ein USB-Kabel (1,5 m, mit „großem“ USB-B-Stecker) wird standardmäßig mitgeliefert

Häufig gestellte Fragen

Wieso gibt es so etwas nicht im normalen Geschäft zu kaufen?
Es besteht kaum Bedarf:-)

Ansonsten besteht die Möglichkeit, Druckausgaben in einer Datei aufzufangen und mit dieser Datei an einem USB-fähigen Rechner das Drucken zu vollenden.

Es gibt Ethernet-zu-USB-Konverter günstig zu kaufen (in Routern und DSL-Routern eingebaut), die, falls Ethernet vorhanden, ein solches Gerät überflüssig machen.

Ein solches Gerät zu bauen ist erst seit 1-2 Jahren, mit dem Erscheinen von USB-Hostcontrollern und USB-OTG-Geräten möglich.

Ein vergleichbares, deutlich komfortableres Gerät gibt es bei ipcas GmbH, jenes unterstützt auch Ethernet sowie Speichern (also papierlos) auf USB-Stick, für rund 400 € (2010).

Könnte es nicht „USB-zu-Parallel-Konverter“ heißen?
Aus Drucker-Sicht: Ja. USB ist jedoch komplett „host-zentriert“. Ich habe diese Ansichtsweise übernommen, und betrachte alles aus Sicht des Rechners. Und da macht der Konverter aus einem Parallelport einen USB-Anschluss: LPTzUSB.
Was, wenn ein Seriell-zu-USB-Konverter benötigt wird?
Einige Computersysteme verlangen einen „seriellen“ Drucker, gemeint ist für einen COM-Port.
Hier bietet es sich an, die Firmware des LPTzUSB anzupassen und das „Debug-Terminal“ als seriellen Anschluss zu verwenden. Bei Bedarf bitte melden! Email siehe unten!
Als Handshake muss Xon/Xoff einstellbar sein, Hardware-Protokoll kann nicht (so einfach) via Debug-Terminal realisiert werden. Die heutigen Drucker sollten jedoch so riesige Eingangspuffer haben, dass man auch ganz gut ohne Handshake drucken kann. Denn wer seriell druckt, druckt sicher nur Text, kaum Vollgrafik!
Gibt es auch eine High-Speed-Version?
Nein. Es erscheint unnütz, weil die Daten am Parallelport nicht sonderlich schnell erscheinen und vom Mikrocontroller „durchgeschaufelt“ werden müssen. Außerdem ist mir kein brauchbarer High-Speed USB-Hostcontroller (mit Mikrocontroller-Interface) bekannt. Der Philips/NXP ISP1760 (als einzige Alternative) ist wohl 'ne Nummer zu groß und braucht einen 16-bit-Datenbus.
Für Low-Speed gibt es doch auch noch billigere Lösungen ohne speziellen Host-Controller! Wozu dann der Aufwand?
Es gibt keine Low-Speed-Drucker. Allenfalls Mäuse und Tastaturen. Für Full-Speed-Simulation sind alle bekannten Mikrocontroller zu langsam.
Wie sieht es mit der USB-ID (damals US$1500 – jetzt US$2500) aus?
Sie ist für Host-Controller nicht nötig.
Ein USB-Gerät, das Strom braucht – ist da nicht etwas verkehrt?
Achtung: Dies ist ein USB-Host, der Strom an andere Geräte liefern können muss!
Eine Versorgung in umgekehrte Richtung ist beim host-zentrierten USB nie vorgesehen.
Brauche ich ein Steckernetzteil?
Das kommt auf die Ergiebigkeit Ihres Parallelports an, von dem sich LPTzUSB zu versorgen versucht. In der Regel ja.

Noch nicht implementiert: Bei zu geringer Spannung blinkt die rote LED, und Sie sollten ein Netzteil (5 V Gleichspannung, geregelt!, ca. 50 mA) anstecken.

Falls Sie ein bus-powered Gerät anschließen (bspw. einen USB-Stick), müssen Sie ein Netzteil verwenden, welches den Strombedarf des angeschlossenen Gerätes deckt. Für die meisten Geräte genügt 100 mA, USB-spezifiziert sind bis zu 500 mA.

Sie können die aktuelle Betriebsspannung im HyperTerminal-Fenster sehen.

Wichtig! Ungeregelte oder zu hoch eingestellte Netzteile zerstören die Schaltung!
Problem ist in aktueller Revision 1 korrigiert.

Sie können das lästige Steckernetzteil vermeiden mit einer der folgenden Maßnahmen:

Darf ich nachbauen, kopieren und vermarkten?
Nurzu! Nur Seriennummern würde ich gern selbst festlegen.

Gibt's schon!

Modernere Lösungsansätze

Auch alle diese Ansätze benötigen Strom, wobei die erstere noch einigermaßen klein ausfällt.

Entwicklungsboard mit USB-Hostcontroller

Heutzutage würde ich das Problem mit einem Raspberry Pi erschlagen. Alles was man noch braucht ist ein Adapter von seinem GPIO zu einem 25-poligen SubD-Stecker — oder was auch immer der Steinzeitcomputer für eine Schnittstelle hat. Um nichts kaputt zu machen mit Pegelkonvertern (74LVC04) und mit einer Fangschaltung (Latch) für die 8-Bit-Paralleldaten bei Strobe (74LVC574). Ungefähr so wie in jenem Schaltplan. Serienwiderstände im unteren kΩ-Bereich dürften genügen, um die GPIO-Anschlüsse zu schützen. Will man Pins sparen, nimmt man ein Parallel-Seriell-Schieberegister (74LVC299), welches sich mit SPI rasend schnell auslesen lässt.

Auf dem Raspberry muss dann nur noch eine Software laufen, die die Parallelport-Daten entgegennimmt, filtert und auf den USB-Drucker ausgibt. Dafür bietet sich die „native“ Programmiersprache Python an.

Auch jedes andere Entwicklungssystem mit USB-Host und genügend GPIOs eignet sich dafür. Allerdings ist das Angebot derweil unüberschaubar geworden, sodass Raspberry Pi oder Banana Pi als verbreitetste Einplatinencomputer am besten geeignet erscheinen.

LptCap und PC

Steht ein PC zur Verfügung, kann man die Paralleldaten auch über USB einspeisen, über diese einfache Schaltung, die ohne Pegelkonverter auskommt. Filtern und Ausgeben macht dann der PC. Dafür sind auf der o.a. Webseite bereits Lösungen für Windows angegeben.

Die Fangschaltung, die für den FT245R bei manchen Parallelports erforderlich ist, erspart man sich bei Verwendung eines dedizierten Mikrocontrollers, etwa einem ATmega32U4 auf Breakout-Board (alternativ Arduino Leonardo/Micro) oder einem PIC16F1459 auf einem Steckbrett (dieser braucht keinen Quarz!).