AdSense

Samstag, 10. November 2018

Halbautomatischer Mehrfarbendruck mit dem Ultimaker 2+

(English version) Sehr lange, ziemlich genau 2 Jahre ist hier nichts mehr passiert - das will ich nun ändern. Ich arbeite momentan an einem Projekt, welches ich auf jeden Fall teilen will: Ich rüste meinen Ultimaker 2+ um, sodass ich mehrere Farben drucken kann, bis zu 15 ist da der aktuelle Plan. Dazu werde ich in Zukunft, vor allem wenn ich den Umbau überhaupt ersteinmal vorgenommen habe, mehr schreiben. Heute möchte ich aber schonmal die Vorstufe davon präsentieren: Halbautomatischer Mehrfarbendruck mit dem Ultimaker 2+. Die Grundidee ist dabei sowohl beim vollautomatischen als auch beim halbautomatischen Mehrfarbendruck, dass nur eine Nozzle benutzt wird und der Drucker immer das alte Filament herauszieht und dann das neue durchdrückt, vergleichbar mit dem Prusa i3 Multi-Material Upgrade, hier wird auch nur eine Nozzle verwendet.

Zuerst einmal: Was meine ich mit halbautomatisch? Ganz einfach: Der Drucker druckt eine Farbe, irgendwann wirft er das Material aus und wartet, bis ich das andere Material hineingetan habe. Damit kann man einfache Sachen drucken, welche z.B. aus einer Grundfarbe bestehen und ab einer gewissen Höhe eine andere Farbe haben - Beispiele wären hierfür z.B. Schrift auf einem Objekt, ein Leitkegel (https://www.thingiverse.com/thing:3207478) oder z.B. aus dem Bereich des Geländebaus dieses "Gemüsebeet" (https://www.thingiverse.com/thing:3207486).

Was musste ich dafür anpassen? Am Drucker? Gar nichts! Das ist das Tolle. Als Slicer habe ich nun "Slic3r" genommen, da ich hier benutzerdefinierten G-Code einfügen kann und die Software theoretisch beliebig viele Extruder unterstützt. Ich werde hier jetzt Schritt für Schritt erklären, wie meine Druckprofile in Slic3r aussehen. Zuerst die Printer Settings in Slic3r:

Hier habe ich jetzt für jeden Extruder das Folgende eingestellt:

Im Bereich Custom G-code habe ich die folgenden Sachen stehen:
Start G-code
M109 S[first_layer_temperature] ; heat nozzle to first layer temperature and wait until reached
G21 ; metric values
G90 ; absolute positioning
M82 ; Extruder to Absolute
G28 ; home all axes
G1 X7 Y7 F6000 ; bring extruder to the front
G1 Z25 F2000 ; Raise Bed to Head
G92 E0 ; zero the extruded length
T0 ; Select Extruder 1
G92 E0 ; Zero Extrude L
G1 F200 E8 ; Extrude 16 @ 200mm/s
G92 E0 ; Zero Extrude L
G1 F50 E4 ; Extrude 16 @ 50mm/s
G92 E0 ; Zero Extrude L
G1 F20 E2 ; Extrude 2 @ 20mm/s
G1 X100 Y7 F6000 ; bring extruder to the front
G92 E0 ; Zero Extrude L
G92 E0 ; zero the extruded length again
End G-code
; Add Change Tool To Extruder 0 here

G92 E0 ; zero the extruded length
G1 E-2 F200 ; Extrude(Retract) -2mm @ 50mm/s
G28 ; home all
M104 S0 ; turn off heaters
M140 S0 ; turn off bed
M84 ; disable motors
Before layer change G-code
;XXX Before Layer Change
After layer change G-code
;LayerChange
G90 ; absolute positioning
G1 X190 Y190 F6000;

G92 E0 ; zero the extruded length
;G1 E7 F2100 ; Retraction compensation


;Prime Tower

;Prime Tower Routine
G91; Relative mode
G1 Z-1 F2100; Lower Head 1mm
G90 ; absolute positioning
G1 X180 Y190 F6000;
G91; Relative mode

;Rectangle around
G1 Y16 E7.1 F600
G1 X-128 E1 F1200
G1 Y-16 E0.1
G1 X128 E1
G1 Y-16 E0.1
G1 X-128 E1
G1 Y16 E0.1

;Prime Nozzle
;G1 X-128 F3600;No extrusion because part of border


G1 X16 Y-16 F6000
G1 Y32 E0.1 F1200
G1 X16  F6000
G1 Y-32 E0.1 F1200
G1 X16 F6000
G1 Y32 E0.1 F1200
G1 X16 F6000
G1 Y-32 E0.1 F1200
G1 X16 F6000
G1 Y32 E0.1 F1200
G1 X16 F6000
G1 Y-32 E0.1 F1200
G1 X16 F6000
G1 Y32 E0.1 F1200
G1 X16 F6000
;G1 E-7 F2100 ; Retract
G1 Y-32 E-6.9 F1200;No extrusion because part of border

G1 Z1 F2100; Raise Head 1mm

G90 ; absolute positioning
G92 E0 ; zero the extruded length


;Retract
;G92 E0
;LayerEnd
Tool change G-code
;XXX Tool Change
;M104 S100
G90 ; absolute positioning
G1 X190 Y190 F6000;

G92 E0 ; zero the extruded length
G1 E-399 F10000 ; Extrude(Retract) -500mm @ 50mm/s
G1 E-40[next_extruder] F30 ; Extrude(Retract) -1mm @ 1mm/s
G1 E-715 F10000 ; Extrude(Retract) -500mm @ 50mm/s

G92 E0 ; zero the extruded length
G1 F50 E-40 ; Extrude 8 @ 50mm/s

M0;

;M104 S[temperature_0]
G90 ; absolute positioning
G92 E0 ; zero the extruded length
G1 F50 E20 ; Extrude 8 @ 50mm/s

G92 E0 ; zero the extruded length
G1 E700 F10000 ; Extrude(Insert)500mm @ 50mm/s

G92 E0 ; zero the extruded length
G1 F50 E20 ; Extrude 16 @ 50mm/s


;Prime Tower

;Prime Tower Routine
G91; Relative mode
G1 Z-1 F2100; Lower Head 1mm
G90 ; absolute positioning
G1 X180 Y190 F6000;
G91; Relative mode

;Prime Nozzle
G1 Y1 F6000
G1 Y[next_extruder] F6000
G1 X-128 E2 F700
G1 Y-16 F6000
G1 X128 E2 F700
G1 Y-1 F6000
G1 Y-[next_extruder] F6000
G1 X-128 F6000

G1 X1 F6000
G1 X[next_extruder] F6000
G1 Y32 E0.2 F700
G1 X16 F6000
G1 Y-32 E0.2 F700
G1 X16 F6000
G1 Y32 E0.2 F700
G1 X16 F6000
G1 Y-32 E0.2 F700
G1 X16 F6000
G1 Y32 E0.2 F700
G1 X16 F6000
G1 Y-32 E0.2 F700
G1 X16 F6000
G1 Y32 E0.2 F700
G1 X16 F6000
G1 Y-32 E-6.8 F700

G1 Z1 F2100; Raise Head 1mm

G90 ; absolute positioning
G92 E0 ; zero the extruded length


;Retract
;G92 E0
;ToolEnd
Als nächstes kommen die Filament Settings für Filament und Cooling:







 
Als nächstes kommt nun der größte Block, nämlich die Print Settings mit allen Unterkategorien:














Hier sollte natürlich der richtige Pfad zu dem entsprechenden Skript eingetragen werden. Ich musste nämlich ein Post-Script schreiben, welches meinen G-Code bearbeitet, da Slic3r T0, T1, ... für die verschiedenen Extruder verwendet - ich aber nur einen benutze. Füttert man den Ultimaker mit T1, so bewegt sich der erste (und einzige) Extruder nicht mehr, was in diesem Fall ja der falsche Ansatz wäre. Das Post-Script tut 2 Dinge:
  • Alle T1, T2, ... zu T0 ändern
  • Ein Problem mit der Retraction beheben - Slic3r macht eine Retraction bei Tools die ich nicht benutze bzw. schiebt das Material nach dem Custom G-Code wieder in die Nozzle. Das macht er aber nicht, wenn ich ein Tool zum ersten Mal verwende, da Slic3r ja in diesem Tool auch kein Material herausgezogen hat. Daher checkt mein Post-Script, ob in der entsprechenden Zeile nach einem Tool Change ein E7-Befehl ist, also ob das Material 7mm wieder in die Nozzle gedrückt wird, falls nicht fügt das Post-Script dies hinzu
Das Post-Script ist in Octave (Matlab-ähnlich) geschrieben, das sollte man sich also ebenfalls installieren. Mein PostScript "StartOctave.bat" sieht so aus:
C:\Octave\Octave-4.2.1\octave.bat C:\Slic3rSkripte\OctavePostScript.m %1
Es ruft also die Datei "OctavePostScript.m" auf, welche so aussieht:
s = argv(){1};

myfile = fopen("testOctave.txt", "w");
fprintf(myfile, "%s\r\n", s);
fclose(myfile);

%s = "I:\Traffic_Cone_Rings_Orange.gcode";
myfile = fopen (s, "r");
outText = [];
tline = fgetl(myfile);
i = 1;
outText{i} = tline;
while ischar(tline)
  i = i+1;
  outText{i} = tline;
 
 
  tline = fgetl(myfile);
end
imax = i;
fclose(myfile);

myfile = fopen(s, "w");
%fprintf(myfile, ";EDITED!\r\n");
insertLine = 0;
for i=1:imax
  tempLine = outText{i};
 
  if (size(tempLine,2) > 1)
    if (tempLine(1) == "T")
      outText{i} = "T0";
    end
  end
 
 
  if (strcmp(tempLine,";ToolEnd"))
    insertLine = 7;
  end
  
  if (insertLine > 0)
    insertLine = insertLine -1;
  end
 
  if (insertLine == 1)
    if (tempLine(4) == "E")
    else
      fprintf(myfile, "G1 E7.00000 F2100.00000\r\n");
      fprintf(myfile, "G92 E0 \r\n");
    end
  end

  fprintf(myfile, "%s\r\n", outText{i});
end
fclose(myfile);
Nun muss also nur noch ein Objekt in Slic3r geladen werden, über Rechtsklick-Settings kann man dann mit "Load Part" die weiteren Farb-Objekte dazu laden und dann den jeweiligen Extruder bzw. die jeweilige Farbe einstellen. Für Tests könnte man also die Thingiverse-Links oben von mir nutzen.

Der Quellcode ist definitiv noch ausbaufähig, wer Verbesserungsvorschläge hat kann diese mir gerne mitteilen, man sollte das alles auch unter dem Hintergrund betrachten, dass ich bereits versuche, alle auf einen automatischen Materialwechsel auszulegen, sodass einige Sachen vielleicht teilweise etwas zu kompliziert aussehen könnten.