Plotter bauen – die Software
Die Software ist ein essentieller Teil dieses Projektes. Auch hier zieht sich der kollaborative Charakter der Installation durch: Unterschiedliche Open-Source Programme wurden kombiniert.
Firmware
Die Firmware des Plotters ist GRBL. Diese open-source Software ist für den Betrieb von CNC-Maschinen, 3D-Druckern und ähnlichem konzipiert und für die Nutzung auf Microcontrollern wie etwa dem Arduino Uno programmiert. Damit eignet sich GRBL optimal für Maker-Projekte wie CO-lab.
Wei ich eine Servomotor für die Stifthalterung – die Z-Achse des Plotters – verwende, nutze ich eine abgewandelte Version von GRBL. Hier wird der Stift binär gesteuert: Werte über 0 bewegen den Stift nach oben, Werte gleich oder unter 0 bewegen ihn nach unten. Bevor ich die Software nutzen konnte, musste ich den Bewegungsspielraum im Setup-File spindle_control.c richtig setzen. Dafür habe ich die Standardwerte Schritt für Schritt angepasst. Diese Kalibrierung hat einige Probleme bereitet, weil der Servomotor leicht beschädigt werden kann, wenn er zu stark belastet wird – darauf wird auch in der Dokumentation von GRBL hingewiesen. Das ist aber leider häufiger passiert, weil die Stifthalterung nicht genügend Distanz zwischen Motor und Kugellage hat. Dadurch ist der Motor oft daran hängen geblieben und hat blockiert. Um dieses Problem zu umgehen, habe ich den Plastik-Stift am Servomotor ein klein wenig gekürzt. Außerdem gibt es immer eine kleine Verzögerung, bevor sich der Servo bewegt. Dadurch hatte ich anfangs Anfangs Schwierigkeiten Linien vollständig zu zeichnen – der Stift wurde nämlich erst abgesetzt, als er schon in Bewegung war. Meine (etwas unelegante) Lösung war es, vor und nach jeder Z-Achsen-Veränderung eine Pause von einer Hundertstel Sekunde einzufügen. Das reicht, um die Bewegung des Servomotors zu überbrücken.

Es gibt noch zahlreiche andere Forks von GRBL, die für die Nutzung eines Servomotors optimiert sind. Die Version von vankesteren etwa wäre nicht auf ein binäres An oder Aus des Stiftes beschränkt. Da ich aber die Version von bdring bereits erfolgreich installiert hatte, und die Ausstellung näher rückte, wollte ich kein Risiko mehr eingehen.
In Zukunft würde ich gerne eine richtige Z-Achse für den Plotter bauen, um eine präzise Positionierung des Stiftes zu ermöglichen. Außerdem wäre es interessant mit Parametern wie etwa Druck zu spielen. Dafür ist allerdings eine andere Stifthalterung notwendig. Deshalb bleibt das bis auf weiteres Zukunftsmusik.
RaspberryPi – der Kopf des ganzen
Der Plotter arbeitet natürlich nicht von ganz alleine. Die Daten müssen immer noch von einem Computer kommen. Diese Aufgabe übernimmt in diesem Fall ein Raspberry Pi 4. Der kleine Computer ist perfekt für diese Art von Projekt geeignet – kompakter Formfaktor und gut zugängliche Schnittstellen & Pins machen die Kombination mit anderen Elektronikteilen leicht. Als Betriebssystem verwendete ich Raspberry Pi OS (das offizielle Betriebssystem vom Raspberry Pi) in Verbindung mit Sway als Window-Manager. Sway übernahm in diesem Fall die rahmenlose Anordnung der Fenster, wodurch ein simples Interfacedesign möglich wurde. Alexander Kremser half mir dabei, den Computer richtig aufzusetzen alle nötigen Software-Komponenten miteinander zu verbinden.
Für eine möglichst leichte Bedienung der Installation in der Ausstellung, war es mir wichtig, möglichst viel zu automatisieren. Alex hat den Raspberry Pi so eingerichtet, dass sich die nötigen Programme automatisch starten, sobald er eingeschaltet wird. Es öffnet sich also automatisch das Terminal mit einem Shell-Script plotti.sh, das alle weiteren Schritte einleitet:
- Ordner für die Foto- und GCODE-Dateien erstellen
- eine Pipe für den Datenaustausch öffnen (ein Kommunikationskanal, damit der Raspberry Daten an den Plotter schicken, und Fehlercodes erhalten kann)
- Kamera starten
- Deamon starten, der den G-code Zeile für Zeile an GRBL schickt.
- Plotter homen. (An eine vordefinierte Startposition bewegen)
- Timer für die Fotos starten
- Foto aufnehmen und im richtigen Format speichern
- vpype-Befehle ausführen, um Foto in Vektoren umzuwandeln, zu formatieren und in G-code zu konvertieren
- G-code senden
- Skript von neuem starten, sobald dad Plotten des Bildes fertig ist.
ffmpeg – Alleskönner für Bild, Video und Ton
ffmpeg ist ein Open-Source-Framework zur Verarbeitung von Medien. In diesem Projekt wurde es verwendet, um einen Videostream von der Webcam live am Bildschirm anzuzeigen, alle 5 Minuten ein Bild aufzunehmen und im richtigen Format zu speichern. Mit V4L (Video4Linux) wird die Kamera als USB-Device angesprochen und dann gestreamt. Damit die Betrachter sich intuitiv verhalten, haben wir den Stream horizontal gespiegelt. So wirkt es wie ein tatsächlicher Spiegel.
Terminal – umfunktioniert zum "GUI"
Der Terminal ist elementarer Bestandteil der Installation. Alles wird in mit einem Shellskript zusammengehalten, welches natürlich in der Commandline ausgeführt wird. Um den Besuchern aber auch Einblicke in die Abläufe zu geben, die im Hintergrund passieren, wollten wir etwas Visuelles Feedback geben. Vor allem für das Timing des Fotos war das relevant: Woher sollte man wissen, wann das nächste Bild gemacht wird? Diese Problematik ist uns vor allem in der ersten Testphase aufgefallen, in der die Installation noch keinen Bildschirm hatte. Um dieses Problem zu beheben, wollten wir die Ausgabefunktion des Terminals in ein minimalistisches Interface umbauen. Die wichtigsten Funktionen waren das Anzeigen des Timers bis zum nächsten Bild und Stichwortartige Erklärung, was im Hintergrund passiert (Umwandlung, Platzierung und Codierung des Bildes). Das gibt einerseits einen besseren Eindruck davon was passiert und gibt den Betrachtern die Möglichkeit für das Foto zu posieren. Dieser Aspekt war mir besonders wichtig, um den Menschen die Möglichkeit zu geben, bewusst mit dem Plotter zu interagieren. Uns ist aufgefallen, dass es selbst mit Timer noch schwierig war, den genauen Zeitpunkt des Fotos nachzuvollziehen. Deshalb hatte Alex die Idee einen Blitz-Effekt einzubauen. Der wurde mit Hilfe von Box-Drawing-Charakters realisiert. Zum Zeitpunkt der Aufnahme wird der gesamte Bildschirm mit '█' gefüllt. Dieser Visuelle Trick reichte, um besser zu kommunizieren, wann das Foto entsteht.

linedraw – from pixels to lines
linedraw from Lingdong Huang ist ein python Skript, das Pixelbilder in Vektorgrafiken umwandelt. Ursprünglich wollte ich einen eigenen Algorithmus schreiben, aber wegen Zeitmangel habe ich mich nach bereits bestehenden Modellen umgesehen. Linedraw war für mich interessant, weil es einen natürlichen Schraffurstil sehr gut imitiert. Mittels Noise werden Unregelmäßigkeiten generiert, die den Eindruck von handgezeichnteten Linien geben. Diese augenscheinliche Natürlichkeit wollte ich mir zu nutzen machen und habe den Noise-Parameter möglichst weit raufgedreht. Ein weiterer Vorteil von Linedraw war, dass die Bilder sehr abstrakt werden. Dadurch werden Gesichter weniger eindeutig erkennbar, wodurch ich die Privatsphäre von den Besuchern besser respektieren kann. Die Bilder wurden auch nie dauerhaft gespeichert, sondern immer am nächsten Tag überschrieben. Die entstandenen SVGs bestanden aber immer noch aus vielen einzelnen kurzen Linien. Weil für jedes Heben und Senken des Stiftes relativ viel Zeit gebraucht wurde, dauerte das Plotten allerdings zu lange. Das selbstgesetzte Limit von 5 Minuten wurde fast immer überschritten, vor allem bei dunklen Bildern. Um aus den vielen kurzen Linien wenige lange zu machen, beschloss ich sie an den Enden zu mittels vpype verbinden. Daraus ergab sich ein weniger eleganter Stil, der aber immer noch ein guten Kompromiss zur Plottzeit war.

Vpype – ein praktisches Tool für Plotter-ready Vektorgrafiken
vpype ist ein Tool, welches die Bearbeitung von Vektorgrafiken für Penplotter ermöglicht. Weil es speziell für diesen Anwendungsbereich konzipiert ist, umfasst es zahlreiche nützliche Funktionen. Ich habe vpype primär für das Optimieren von Grafiken für möglichst schnelle Plot-Zeiten und das Layouten der einzelnen Bilder verwendet. Das Tool bietet aber noch viele weitere Funktionen und kann sogar mittels Plug-Ins weiter ausgebaut werden. Weil es ein Command-Line-Interface hat, kann es auch leicht über ein Skript gesteuert werden – das war essentiell für die Verwendung in der Installation.
Die umfassende Dokumentation macht es leicht, die nötigen Befehle zu finden und dann richtig anzuwenden. Für mich am relevantesten war der Teil Optimizing a SVG for plotting. Die Befehle splitall, linemerge und linesimplify ermöglichen die Reduktion der Linien- oder Punkteanzahl, wodurch ich die Zeit zum Zeichnen eines Bildes um ca. 25% reduzieren konnte.
Außerdem habe ich die Layoutfunktionen dazu verwendet, die Einzelnen Bilder auf dem großen Papierbogen zu platzieren und richtig zu drehen.
Mit dem GCODE-Plugin für vpype wandle ich die Vektorgrafiken dann in Maschinencode um. Das Einrichten war hier leider nicht so leicht: Weil GCODE auf allen möglichen unterschiedlichen Maschinen funktionieren muss, muss man mit Hilfe eines Config-Files erst festlegen, wie die SVG-Bausteine in Maschinen-Befehl umgewandelt werden sollen. Dieses Config-File habe ich also speziell auf meinen Plotter zugeschnitten. Dafür musste sowohl SVGs verstehen als auch die richtigen Codes lernen.