Aaron Fischer Ingenieur, Vater, Heimwerker, Problemlöser

15 März, 2016

3D-Printing mit Clojure

TL;DR:

3D-Modelle für den 3D-Druck zu erstellen ist gar nicht so schwer. Auch ohne teure Modelling-Tools lässt sich entspannt arbeiten -- besonders dann wenn Clojure im Spiel ist. Welche Schritte von der Idee zum gedruckten Objekt notwendig sind, will ich hier einmal aufzeigen.

Zu Beginn mache ich ein paar Abmaße und Skizzen vom fertigen Objekt (oder auch Teile davon). Überhänge will man generell beim 3D-Druck vermeiden, da hierfür Support-Material benötigt wird und sie generell schlechter werden. Deshalb macht es Sinn, das Objekt in mehrere Teile zu zerlegen, die dann am Ende zusammengeklebt werden können. So auch in meinem Fall. Ich möchte das Gehäuse eines alten Computersystems nachbauen (Der Hintergrund dazu in einem anderen Post).

Clojure 3d Print

Die Bibliothek scad-clj ist eine einfache DSL für OpenSCAD. OpenSCAD ist wiederum ein CAD-Modeller, der per Software angesteuert werden kann. Es gibt also Befehle um Formen (Würfel, Zylinder, ...) zu erzeugen und Operationen (verschieben, skalieren, ...) die auf diese angewendet werden können. Die Formen können dann aufeinander angewendet werden (verbinden, Schnittmenge, ...), um komplexere Strukturen zu erzeugen.

Mit scad-clj kann diese Funktionalität in Clojure genutzt werden. Die Bibliothek kann dann den erforderlichen OpenSCAD-Code mit write-scad erstellen.

(defn print-scad [filename shape]
  (spit (str filename ".scad")
        (write-scad
        (color [0.6 0.6 0.6] shape))))

Hat man parallel OpenSCAD mit der generierten Datei offen und einen Haken bei Automatic Reload and Preview gemacht, aktualisiert sich das 3D-Modell direkt nach dem Evaluieren der Funktion.

Hier ist nun der entsprechende Code für die Vorderseite des Objekts. Wie man sieht, sind es im Grunde nicht viele Befehle die gebraucht werden. Die Vorderseite besteht also nur aus ein paar Würfeln (cube), die an die entsprechende Position verschoben/gedreht werden (translate, scale, rotate) und dann aufeinander angewendet werden (union, difference). Es ist erstaunlich, wie weit man mit diesen einfachen Befehlen kommt!

Auch sehr angenehm ist, dass man den vollen Funktionsumfang von Clojure zur Verfügung hat. So beispielsweise bei den Lüftungsschlitzen.

(print-scad
 "front"
 (binding [*center* false]
   (union
    (translate [6 25 4] (cube 50 10 2))
    (difference
     ; Base
     (cube 65 37 5)

     ; Input hole
     (translate [40 7 -1] (cube 14 16 10 )) 
     (translate [32 7 5] (rotate (/ pi 7) [0 1 0] (cube 17 16 10 )))

     ; Venting holes
     (apply union
            (map #(translate [7 (* % 4) 3] (cube 20 2 5 ))
                 (range 1 6)))

     ; Bevels
     (translate [-21 -2 -20] (rotate (/ pi 4) [0 -1 0] (cube 40 40 10 )))
     (translate [43 -2 20] (rotate (/ pi 4) [0 1 0] (cube 40 40 10 )))))))

Das so erstellte 3D-Modell sieht dann in OpenSCAD wie folgt aus. Praktisch ist hier, dass man das Objekt drehen, zoomen und von allen Seiten/Blickwinkeln betrachten kann. Dadurch dass sich das Objekt automatisch ändert (und der Kamerawinkel gleich bleibt) wenn der Clojure-Code evaluiert wird, hat man einen sehr entspannten Workflow und muss nur selten den Editor verlassen.

Clojure 3d Print

Ist das Objekt wie man es gerne hätte, kann es in OpenSCAD als STL-Datei exportiert werden. Diese lässt sich dann mit Slic3r für die Weiterverarbeitung öffnen. Slic3r ist ein G-Code Generator, mit dem aus einem 3D-Modell Instruktionen für den 3D-Drucker erstellt. So werden aus Flächen und Formen Bewegungen berechnet.

Clojure 3d Print

In Slic3r kann nun allerhand eingestellt werden. Zuerst wird die Position des Objekts auf der Druck-Unterlage positioniert. Danach können Einstellungen zum Drucker, dem Filament (dem verwendeten Plastik-Rohstoff) und dem Druck selbst vorgenommen werden. Hier ist viel Experimentieren und Erfahrung angesagt. Diese Einstellungen bestimmen maßgeblich die Qualität und die Dauer des Drucks. So kann beispielsweise festgelegt werden, mit welchem Muster die Flächen gefüllt werden.

Sind alle Einstellungen gemacht, kann der G-Code generiert werden. Dies sind einfache Befehle wie G92 (fahre an eine bestimmte Position) oder M109 (Extruder-Temperatur setzen). Das schöne daran ist, dass sehr viele 3D-Drucker und auch andere Maschinen wie Lasercutter oder CNC-Fräsen mit G-Code umgehen können. So kann die Toolchain nicht nur zum 3D-Druck verwendet werden, sondern auch zum Fräsen oder Schneiden. Welche G-Codes die Maschine unterstützt hängt dann von der Firmware ab. Ich verwende bei mir die Marlin Firmware.

Um den 3D-Drucker anzusteuern verwende ich meistens Pronterface aus dem Printrun Paket. Die Software baut über USB eine serielle Verbindung zum 3D-Drucker auf. Hierüber können dann einzelne G-Code Befehle manuell gesendet werden oder aber ein ganze Datei (sequenziell). Hier lädt man also den zuvor generierten G-Code und startet den Druckvorgang. Bei meinem Drucker habe ich noch ein SD-Karten Interface angebaut, so dass ich den G-Code direkt auf dem Drucker ausführen kann, ohne dass ich einen PC dafür brauche.

Clojure 3d Print

Unter den 3D-Druckern gibt es mittlerweile sehr viele verschiedene Modelle. Ich habe meinen Prusa Mendel vor ein paar Jahren selbst zusammengebaut. Heute kann man fertige 3D-Drucker im Baumarkt kaufen. Das Prinzip ist aber (zumindest bei den mit Extruder) gleich: Das Filament wird in Form einer langen Plastikschnur durch eine heiße Metallröhre gepresst. Am Ende ist eine Düse (Nozzle), die das heiße Plastik als Wurst auf einen Untergrund legt/drückt. Über Stepper-Motoren wird die Plastik-Wurst auf dem Untergrund (Bed) verteilt. Bei manchen bewegt sich der Untergrund, bei manchen der Extruder, bei manchen beides. So wird Bahn für Bahn (Ebene für Ebene) aufeinandergelegt bis so die 3D-Form entsteht.

Der Vorgang ist recht simpel, doch spielen sehr viele Faktoren wie aktuelle Raumtemperatur, Genauigkeit der Stepper-Motoren, Filament-Sorte, Bed beheizt oder nicht, Untergrund mit Haarspray vorbehandelt, usw. usw. mit ein. Hier muss man ein paar Stunden für die Kalibrierung aufwenden, bis alle Parameter gut aufeinander abgestimmt sind.

Clojure 3d Print

Die Dauer des Druckvorgangs kommt auf die Einstellungen in Slic3r und die Größe des Modells an. Eine kleine Figur braucht ca. 1 Stunde, größere Objekte können schon mal 3-4 Stunden dauern. Nachdem der Druck fertig ist, kann er vom Bed gekratzt werden (wenn es sich nicht lösen lässt, alles ein paar Minuten in den Gefrierschrank).

Das so gedruckte Objekt hat meist noch ein paar Schönheitsfehler, die man mit einem Skalpell gut abtrennen kann. ABS lässt sich zudem gut mit dem Dremel oder Schleifpapier nachbearbeiten, bei PLA hat man hier eher mäßigen Erfolg. ABS lässt sich auch gut mit Aceton glätten. PLA hingegen ist komplett ungiftig und es stinkt nicht während des Drucks. So hat jede Plastiksorte unterschiedliche Eigenschaften bzw. Vor- und Nachteile. Hier kommt es darauf an was man möchte und was man in Kauf nehmen will/kann.

Wer keinen 3D-Drucker besitzt, kann entweder sein nächstgelegenes FabLab/Hackerspace aufsuchen oder eine der Online-Dienste nutzen, die 3D-Printing als Dienstleistung anbieten. Selbst drucken ist natürlich viel billiger (eine Rolle ABS Filament kostet ~14 EUR und hält eine gefühlte Ewigkeit) und macht auch mehr Spaß. Zudem lernt man eine ganze Menge über Mechanik, Elektronik, Mikrocontroller und man wird sich auf jeden Fall eine digitale Schieblehre zulegen :) Selbstbau-Kits fangen mittlerweile schon bei ~400 EUR an.