Plotten geht jetzt auch mit Computer
Seit geraumer Zeit habe ich einen Plotter, ein HP 7045A, ein schweres, großes Gerät (plottet auf bis zu DIN A3), das zudem etwas anders arbeitet als die meisten anderen alten Plotter, die man ab und an im Internet zu sehen bekommt. Denn eigentlich ist der HP 7045A ein Rekorder, gebaut um Messungen aufzuzeichnen, und hat daher zwei analoge Eingänge, für X und Y. Auf dieser Seite ist er vor ein paar Jahren mal aufgetaucht, in genau dieser angedachten Funktion. Intern findet sich nichts anderes als analoge Servo-Regelschleifen, die den Stift auf eine den Eingangsspannungen entsprechende Position bewegen.
Nun, rein hypothetisch: Wie könnte man den HP 7045A für Plotter Art, also irgendwas zwischen stilisierten Bildern und generativen Vektor-Zeichnungen, verwenden? Der direkte Ansatz wäre es, bei dem zu bleiben, was das Gerät am besten kann und alles analog zu generieren. Also Lissajous-Figuren, einen Lorentz-Attraktor, etc. wären mit je einer eigens dafür gebauten Schaltung möglich.1
Alternativ mag man das Problem natürlich auch auf die bewährte Weise vergrößern: Indem man einen Computer dran anschließt.
Der einfachste Weg, das zu erreichen, wäre vermutlich eine Soundkarte, mit zwei Kanälen für X und Y und einem dritten für den Zustand des Stifts, jeweils ohne die Kondensatoren an den Ausgängen, um DC-Betrieb zu ermöglichen. Dann könnte man einfach mit einer Sounddatei etwas plotten.
Aber irgendwie wäre das auch langweilig.
Eine Art Adapter
Interessanterweise konnte ich kein fertiges Projekt finden, das Vektorpgraphikinterpreter mit analogen Achsenausgängen verband, das ich für den Plotter zurechtbiegen hätte können. Auf der anderen Seite gab es glücklicherweise genug Abkürzungen, die eine Entwicklung aus dem Stand erträglich machen.
Erstens gibt es nicht viele Anforderungen an die X-/Y-Steuerspannungen. Der 7045A ist ein Messgerät und hat entsprechend zwei isolierte, hochohmige Eingänge mit freier Spannungsbereichswahl – es spricht also nichts dagegen, DAC-Ausgänge direkt mit den Bananenbuchsen auf der Vorderseite zu verbinden. Noch besser: Es gibt eine Sub-D-Buchse (im Bild oben nahe der oberen Kante zu sehen) auf der Rückseite, die alle wichtigen Signale (X, Y, TTL-Eingang zum Absetzen des Stifts) herausführt. Das heißt, ein perspektivischer Adapter kann sich dort über einen einzelnen Stecker andocken.
Der offensichtliche Kandidat für die Eingangsdaten ist HP-GL, die Hewlett-Packard Graphics Language. HPGL wurde von HP für deren Plotter (die Sorte, die mit Computern verbunden werden sollte) eingeführt und wird nach wie vor von einer Vielzahl von (Schneid-)Plottern genutzt. HPGL zu verwenden heißt, von existierendem Tooling zu profitieren (z. B. dem eingebauten Export in Inkscape) und gleichzeitig weniger Arbeit in die Verarbeitung zu stecken als bei einem komplexeren Format (z. B. SVG).
Damit könnte der Adapter sich als serielle Schnittstelle melden, wodurch man sowohl manuell Kommandos eingeben als auch Dateien Plotten kann:2
$ # Quadrat zeichnen
$ echo PU0,0;PD0,1000,1000,1000,1000,0,0,0;PU > /dev/ttyACM1
$ # Datei plotten
$ cat 25120.hpgl > /dev/ttyACM1
Nachdem es HPGL seit 1977 gibt, handelt es sich um eine eher einfache Sprache. Es gibt ein paar Zweibuchstabenkommandos, denen einfache ASCII-Dezimalzahlen für die Koordinaten folgen. Dafür ist es nicht besonders schwer, einen Interpreter zu bauen. Nachdem HPGL für frühe Rechner gebaut wurde und es durchaus angedacht war, die Kommandos per Hand zu schreiben, gibt es auch eine Vielzahl eingebauter Funktionen z. B. zum Setzen von Text, Zeichnen von Kreisbögen oder zum Definieren eines Teilbereichs für die nächsten Kommandos. Solche Funktionen sind heutzutage aber viel besser im Computer, der den Plotter ansteuert, aufgehoben – ich habe mich deshalb auf den Teil der Kommandos, die Inkscape in seinem HPGL-Export verwendet (im Wesentlichen gerade Linien), beschränkt. Auch die Skalierung von Koordinaten habe ich weggelassen, man kann sich ja schließlich ein Quadrat plotten lassen und dann die Auflösung manuell kalibrieren.
Ein konkreter Adapter
Ein STM32F103 ist mehr als kräftig genug, sich über USB als virtuelle serielle Schnittstelle zu geben, HPGL zu interpretieren, die resultierenden Bewegungen in einen Ringpuffer zu schieben und gleichmäßig zwischen den Koordinaten zu interpolieren, um dem Plotter seine langsam veränderlichen Spannungen bereitzustellen. USB ist hierfür aus mehr als einem Grund praktisch: Wenn der Ringpuffer voll ist, was schnell passiert, da Plotten eher langsam gegenüber den restlichen Aufgaben ist, kann der Controller einfach aufhören, Daten anzunehmen. Auf der PC-Seite bildet sich dann zwar ein Rückstau, aber effektiv habe ich so Übertragungsflusskontrolle umsonst und ohne Einrichtung.
Für den DAC ist hauptsächlich die Auflösung relevant, die Bandbreite ist eher egal. Die einfachste Lösung dafür sind zwei PWM-Ausgänge plus Tiefpassfilter.
Ich habe hier einen Präzisions-OPV GS8334 verwendet, weil er da war. Nachdem die Genauigkeit aber viel eher von der Mikrocontroller-Versorgungsspannung und den OPVs im 7045A (aus den 1970ern) abhängt, würde ein LM324 den Job ebenso gut machen.
Die Schaltung ist einfach genug, um auf einem Steckbrett mit einem „Blue/Black Pill“-Board erste Plots zu machen. Der Plotter wird so eingestellt, dass der Spannungsbereich die gesamte Seite abdeckt. Danach kann man die Skalierung vor dem HPGL-Export kalibrieren (nachdem ich nichts dergleichen in der Firmware implementiert habe).
Die Kontrolle über Absetzen und Aufheben des Stifts ist nicht gerade feinfühlig, wie das Geräusch im Video deutlich macht. Für den „normalen“ Einsatz des 7045A ist das kein Problem: Man setzt den Stift auf, fährt die Kurve ab, hebt ihn an. Für den ferngesteuerten Plotterbetrieb habe ich es mit PWM etwas sanfter als im Video bekommen, aber besonders grazil wird der verbaute Hubmagnet ohne mechanische Anpassungen, die ich nicht vorhatte zu machen, nie werden.
Ärgerlicherweise erzeugte der neue Stift-PWM-Ausgang eine Differenz zwischen Firmware und Schaltplan, die mir erst auffiel, als die Platine fertig war, die dann eben zwei Pins mit Fädeldraht getauscht bekommen hat.3 Bei dem Thema: Ein Steckergehäuse für den 37-poligen Sub-D-Stecker, passend zur Buchse auf der Plotterrückseite, ist ein souveränes Gehäuse für die Adapterplatine. Ein Molex 1731110011 passt ohne weitere Anpassungen: Wenn man die Teile für die Zugentlastung weglässt, passt ein USB-Stecker problemlos und die Status-LEDs sind auch noch zu sehen.
Sonst sind nur zwei Reed-Relais hervorhebenswert. Nachdem der Adapter hinten am Plotter steckt, besteht die Gefahr, dass er dort vergessen wird und man an die vorderen Eingänge etwas anderes anschließt. Nachdem der Plotter durchaus mit hohen Spannungen umgehen kann, kann das auch ein Sicherheitsproblem sein. Damit nichts in Flammen aufgehen kann, werden X und Y nur mit der Mikrocontroller-Schaltung verbunden, wenn über USB Strom ankommt.
Stifte
Ein Problem an alten Plottern ist, dass es keine neuen Stifte mehr gibt und die alten alle längst ausgetrocknet sind. Manche der Spezialfilzstifte lassen sich öffnen und nachfüllen, die für den 7045A4 leider nicht. Beim Stift im Video oben hatte ich das dennoch versucht, weswegen der auch mit Klebeband abgedichtet ist. Dort sieht man auch, dass meine Nachfülltinte nicht optimal geeignet ist, weil sich bei jedem Absetzen eine kleine Pfütze bildet.
Die Gelstifte, die man bei MUJI bekommt, funktionieren erstaunlich gut, sie sind billig, trocknen nicht ein und auch als Nachfüllminen in vielen Farben und Dicken erhältlich. Mit einem kleinen 3D-gedruckten Adapter passen sie auch in den Plotter.
Der einzige Nachteil ist, dass die originalen Stifte bereits bei sehr sanftem Auflegen schreiben, während die Gelschreiber etwas mehr Aufdruckkraft brauchen. Eine Zeit lang war die Lösung dafür eine mit Klebeband am Stiftarm befestigte schwere Schraube, aber als hübschere, endgültige Lösung dient nun eine dafür gebogene Feder, die seitlich eingeführt genau den richtigen zusätzlichen Druck liefert.
Nächste Schritte
Während das meiste, was einen Blogpost auf dieser Seite bekommt, weitgehend abgeschlossen ist, bekommt die Firmware des Plotter-Adapters ab und an noch neue Funktionalität. Üblicherweise mache ich Anpassungen, wenn ich Grußkarten brauchen kann, weshalb es nur langsam weiter geht auf dem Weg zu z. B. dynamischer Zeichengeschwindigkeit. So oder so wird dieser Adapter immer ein Nischenprojekt sein und während es möglich wäre, etwa die PWM-Parameter für den Hubmagneten laufzeiteinstellbar zu machen, ergibt irgendwas außer Compilezeitkonstanten erst Sinn, wenn ein zweiter Plotter außer meinem am Adapter hängen sollte.
Die Linien, die der Plotter produziert, sind nicht unbedingt schnurgerade (auch im Video oben zu sehen). Das ließe sich mit Sicherheit lösen, wenn ich die Lager reinigen und die Spannung auf den Seilen im Inneren korrekt einstellen würde – was auch im Bereich des Möglichen liegt, seit CuriousMarc das Wartungshandbuch gescannt und hochgeladen hat. Aktuell bin ich mit den Unvollkommenheiten auch sehr zufrieden, schließlich ist der Plotter auch auf diese Weise mehr als nur ein langsamer Drucker.
Die verbleibenden 80 %
Alles bis hier zeigt nur die eine Hälfte der Geschichte: die von HPGL bis zum Papier. Das ist die Hälfte mit den Ingenieursherausforderungen. Mit Lösungen, Mechanik und Elektronik und Software. Der viel offenere Teil des Gesamtproblems ist der vor der virtuellen seriellen Schnittstelle.
Nachdem der HPGL-Parser genau alles abdeckt, was Inkscape erzeugt, sind natürlich sämtliche Vektorgraphiken sofort plotbar. Was mich längerfristig aber deutlich mehr interessiert sind generative Zeichnungen, die nicht als Einzeldesign auf dem Bildschirm entstehen und die weiter gehen als stilisierte Photos. Für diesen Teil muss ich meinen Prozess erst noch finden.
Ein Gedanke, der mir im Kopf geblieben ist, stammt, wenn ich mich recht entsinne, von cohost-User atomicthumbs: Die existierende Software für Stiftplotter ist meistens für „programmer-type beings“ konzipiert. Auch wenn ich persönlich in diese Kategorie falle, ist das dennoch eine Beschränkung, die ich spüre: Wenn ich bereits ein klares Bild im Kopf habe, wie das Ergebnis aussehen soll, wird es für mich schnell klar, wie die Puzzlestücke zusammenpassen, wie Rohdaten verarbeitet, wie Systeme simuliert werden, wie geometrische Formen interagieren und wie daraus Linien und Koordinaten werden können. Nun ist das aber ein tragendes „wenn“: Geht es eher um eine Exploration ohne klares Ziel, ist dieser Ansatz nur mäßig gut geeignet.
Dennoch ist es ein Ansatz für meine ersten Schritte – auch wenn es unwahrscheinlich ist, dass ich so etwas komplett Neues zufällig entdecke. Für meine bisherigen Plots setze ich auf Jupyter-Notebooks, die es mir erlauben, bequem Prototypen zu bauen und schnell mir Parameterwerten zu spielen. Ein eingebaute Vorschau der Plots zu haben vereinfacht schnelles iterieren und experimentieren deutlich, auch wenn es nach wie vor zwischen Bausteinen von Python-Code passiert.
Möglicherweise liegt meine Antwort in einer Weiterentwicklung dieses Ansatzes: Mit einer wachsenden Bibliothek an Funktionen kann ich auch höhere Abstraktionsebenen erklimmen. Dennoch denke ich von Zeit zu Zeit nach, wie ein Prozess aussähe, der nicht mit der Einschränkung beginnt, dass am Ende eine Liste mit Zahlen produziert werden muss. Aber wie funktioniert eine Abstraktion darüber, die die volle Breite an Möglichkeiten bewahrt? Hier habe ich noch keine gute Antwort.
Eine Möglichkeit, mit der ich experimentieren möchte, sind Node-basierte Ansätze (also, ein Graph aus miteinander verbundenen Blöcken, nicht die JavaScript-Umgebung). Was für modulare Synthesizer (sogar für Video-Signale) und Shader gut funktioniert, klingt auch vielversprechend, wenn die Kanten Koordinaten oder Formen statt Signalen oder Bilddaten transportieren. Blenders „Geometry Nodes“ könnten ein Kandidat sein und wurden auch schon für den G-Code-Export für Stiftplotter und generative 2D-Linienzeichnungen eingesetzt. Auch wenn letztere doch wieder sehr technisch in ihrer Umsetzung wirken, frage ich mich, ob allein schon die andere Darstellung oder die anders arbeitende Komposition der einzelnen Operationen den entscheidenden Perspektivwechsel anstoßen kann.
Projektdetails
Hardware und Firmware des Adapters und OpenSCAD-Modelle der Stiftminenhalter sind im Projekt-Repository zu finden. Meine Experimente mit Jupyter-Notebooks sind in einem eigenen Repository zu finden.
-
Ein analoger modularer Plot-Synthesizer klingt allerdings wieder ganz interessant? ↩︎
-
Na ja, beinahe. Nachdem das Plotten eine Weile braucht, gibt es meistens vorher einen Timeout der Shell beim Schreiben in die „Datei“. Mit einem Terminal-Programm,
$ picocom -q /dev/ttyACM1 < 25120.hpglwird der Plot auch fertig. ↩︎
-
Revision B des Platinenlayouts hat einen Fix für das Problem, allerdings habe ich diese Variante nie fertigen lassen (ich hab schließlich nur einen Plotter und brauche nur einen Adapter). ↩︎
-
Die nebenbei auch nicht kompatibel mit den Stiften für die computergesteuerten Plotter von HP sind. ↩︎