Mehrfarbdruck - Poor man's solution
Ein Farbwechsel während des Druckens ist möglich, allerdings müssen gewisse Einschränkungen in Kauf genommen werden
Die Geschichte
Schon längere Zeit wollte ich ausprobieren wie ich mit meinem Drucker und lediglich einem Extruder Objekte in mehreren Farben drucken kann. Hierzu gibt es diverse Ansätze, teilweise wurden sie auch schon von der RepRap-Community umgesetzt:- Ein Filament auf passende Länge abschneiden und ein zweites ankleben
- Eine Vorrichtung zum Mischen der Farben entwickeln (inklusive Software)
- Einen Filamentwechsel bei einem spezifischen Layer durchführen
Der Zweite Ansatz ist schon besser, erfodert allerdings einiges an Entwicklungsarbeit. Ein Farbmischer muss entwickelt und gebaut werden, dadurch entstehen Kosten und zudem wird eine passende Software gebraucht. Erste Ansätze davon gibt es bereits, es ist trotzdem fraglich inwiefern diese Lösung tatsächlich für jeden nutzbar und umsetzbar ist.
Ich habe mich für die 3. Lösung entschieden. Hierbei wird bei einem bestimmten Layer das Filament über ein paar Zeilen G-Code gewechselt, der Aufwand ist dementsprechend gering, eine Unterstützung durch den Slicer oder die Druckeransteuerung ist nicht erforderlich. Optimal ist diese Lösung trotzdem nicht.
Einschränkungen
Ein paar offensichtliche Probleme und Einschränkungen lassen sich leider nicht vermeiden:- Das Filament kann nur zwischen 2 Layern gewechselt werden, also nicht während gerade ein Layer gedruckt wird (theoretisch würde es gehen, der Aufwand wäre für das Ergebnis trotzdem zu hoch)
- Man muss beim Druckvorgang anwesend sein, da der Drucker nicht pausiert
- Der G-Code muss aktuell noch per Hand in die G-Code-Datei eingefügt werden (Code injection, yippie)
- Der G-Code funktioniert nur für absoulte E-Distanzen. Wer den Extruder über relative Distanzen ansteuert, was normalerweise niemand macht, kann diese Methode nicht verwenden, zumindest nicht in der hier vorgestellten Form
Unterstützung durch die Firmware
Es gibt bereits vorgefertigte G-Code-Befehle, welche den Drucker pausieren lassen könnten oder einen Filamentwechsel initiieren. Darunter fallen die Befehle M25, M226 und M600.M25 funktioniert nur bei Druckvorgängen von der SD-Karte (und braucht vermutlich ein LCD Display sowie Steuerbuttons), M226 ist in der Marlin-Firmware nach letztem mir bekanntem Stand nicht implementiert und M600 funktioniert ausschließlich wenn ein LCD Display an den Drucker angeschlossen ist (und auch hier braucht man vermutlich noch Steuerbuttons am Drucker).
Also habe ich mich auf die Befehle gestürzt die der Drucker versteht, herausgekommen ist folgendes Codeschnipsel:
; Filament change
; Move nozzle a few mm upwards
G1 Z10 F7800
; Move heatbed out of the way
G1 Y5
; Retract 40cm old filament
G92 E200
G1 E0 F500
G92 E200
G1 E0 F500
; Extrude 60cm new filament
G92 E0
G1 E200 F500
G92 E0
G1 E200 F500
G92 E0
G1 E200 F500
; Move the bed to its new approximate position
G1 X30
G1 Y82
; Filament change end
; Move nozzle a few mm upwards
G1 Z10 F7800
; Move heatbed out of the way
G1 Y5
; Retract 40cm old filament
G92 E200
G1 E0 F500
G92 E200
G1 E0 F500
; Extrude 60cm new filament
G92 E0
G1 E200 F500
G92 E0
G1 E200 F500
G92 E0
G1 E200 F500
; Move the bed to its new approximate position
G1 X30
G1 Y82
; Filament change end
Wer sich den Code jetzt ansieht und denkt „hey, das kenn ich doch“: Ja, G-Code wird eigentlich für CNC-Maschinen verwendet, läuft aber auch wunderbar auf 3D-Druckern. Eine Erklärung der Codezeilen:
- Zuerst wird die Düse leicht angehoben (muss je nach Objekt welches man drucken will angepasst werden)
- Anschließend fährt man das Heizbett aus dem Weg
- Der Abstand zwischen Düse und Extruder beträgt bei mir etwa 34cm, da der Drucker aus Sicherheitsgründen in einem Zug nicht mehr als 20cm extrudieren (bzw. rückführen) kann, muss das Ganze 2 mal gemacht werden, insgesamt werden also 40cm Filament rückgeführt. Die entsprechende Variable welche das begrenzt findet man in der Marlinfirmware in der Datei Configuration.h, die Zeile sieht in etwa so aus:
#define EXTRUDE_MAXLENGTH (200) //prevent extrusion of very large distances.
Die Angabe ist, wie normalerweise üblich, in Millimeter - Danach werden 60cm des Filaments extrudiert, davon fällt der Abstand zwischen Extruder und Düse weg. Da ich nicht will, dass sich die Farben vermischen (durch Reste oder ähnliches) werden hier gute 26cm Filament verbraten. Das ist übrigens die kritische Phase in der das Filament gewechselt werden muss.
- Danach fährt man sowohl die X-Achse als auch die Y-Achse auf ihre neue, ungefähre Position. Beide Werte müssen demnach für jedes Objekt angepasst werden. Danach ist der Filamentwechsel zu Ende
Praktische Anwendung
Die praktische Anwendung gestaltet sich bei mir wie folgt:Zuerst drucke ich das Objekt einfarbig. Hierzu verwende ich für gewöhnlich weißes Filament von dem Unmengen vorhanden sind. Wenn ich mit dem Druckergebnis zufrieden bin geht es darum den Code an die richtige Stelle zu kopieren.
Dafür lade ich die vom Slicer generierte G-Code-Datei in Pronterface und nutze das Visualisierungstool zur Darstellung der einzelnen Layer. In meinem Beispiel Möchte ich die Farbe zwischen dem 11. und 12. Layer ändern. Das entspricht einer Höhe Z von 3.7mm bzw. 3.9mm.
Im folgenden sieht man den Teil meiner G-Code-Datei, zur Übersichtlichkeit sind ein paar Zeilen kommentiert:
[…]
G1 X52.217 Y67.749 F7800.000
G1 X52.251 Y67.783 F3000.000 E20.96337
M106 S255 ; Einschalten des Lüfters
G1 F1800.000 E19.96337 ; Retraction damit das Filament nicht tropft
G92 E0 ; Reset des Extruders
G1 Z3.900 F7800.000 ; Änderung der Layerhöhe auf 3.9mm (Layer 12)
G1 X59.681 Y81.800 ; Beginn des Druckvorgangs auf dem neuen Layer
G1 F1800.000 E1.00000
G1 X59.965 Y81.693 F919.808 E1.02040
[…]
G1 X52.217 Y67.749 F7800.000
G1 X52.251 Y67.783 F3000.000 E20.96337
M106 S255 ; Einschalten des Lüfters
G1 F1800.000 E19.96337 ; Retraction damit das Filament nicht tropft
G92 E0 ; Reset des Extruders
G1 Z3.900 F7800.000 ; Änderung der Layerhöhe auf 3.9mm (Layer 12)
G1 X59.681 Y81.800 ; Beginn des Druckvorgangs auf dem neuen Layer
G1 F1800.000 E1.00000
G1 X59.965 Y81.693 F919.808 E1.02040
[…]
Der G-Code muss zwischen der Retraction des Filament und dem Zurücksetzen des Extruders eingefügt werden. In meinem Beispiel sieht das Endergebnis so aus:
[…]
G1 X52.217 Y67.749 F7800.000
G1 X52.251 Y67.783 F3000.000 E20.96337
M106 S255 ; Einschalten des Lüfters
G1 F1800.000 E19.96337 ; Retraction damit das Filament nicht tropft
; Filament change
; Move nozzle a few mm upwards
G1 Z10 F7800
; Move heatbed out of the way
G1 Y5
; Retract 40cm old filament
G92 E200
G1 E0 F500
G92 E200
G1 E0 F500
; Extrude 60cm new filament
G92 E0
G1 E200 F500
G92 E0
G1 E200 F500
G92 E0
G1 E200 F500
; Move the bed to its new approximate position
G1 X30
G1 Y82
; Filament change end
G92 E0 ; Reset des Extruders
G1 Z3.900 F7800.000 ; Änderung der Layerhöhe auf 3.9mm (Layer 12)
G1 X59.681 Y81.800 ; Beginn des Druckvorgangs auf dem neuen Layer
G1 F1800.000 E1.00000
G1 X59.965 Y81.693 F919.808 E1.02040
[…]
G1 X52.217 Y67.749 F7800.000
G1 X52.251 Y67.783 F3000.000 E20.96337
M106 S255 ; Einschalten des Lüfters
G1 F1800.000 E19.96337 ; Retraction damit das Filament nicht tropft
; Filament change
; Move nozzle a few mm upwards
G1 Z10 F7800
; Move heatbed out of the way
G1 Y5
; Retract 40cm old filament
G92 E200
G1 E0 F500
G92 E200
G1 E0 F500
; Extrude 60cm new filament
G92 E0
G1 E200 F500
G92 E0
G1 E200 F500
G92 E0
G1 E200 F500
; Move the bed to its new approximate position
G1 X30
G1 Y82
; Filament change end
G92 E0 ; Reset des Extruders
G1 Z3.900 F7800.000 ; Änderung der Layerhöhe auf 3.9mm (Layer 12)
G1 X59.681 Y81.800 ; Beginn des Druckvorgangs auf dem neuen Layer
G1 F1800.000 E1.00000
G1 X59.965 Y81.693 F919.808 E1.02040
[…]
Das war's im Prinzip auch schon. Mittlerweile habe ich mehrere Objekte mittels dieser Technik in 2 Farben gedruckt, allen voran Logos meiner Website:
Revision 3 | 2014-03-20 19:36:09