Pause in Bambuslicer und Fremddrucker

Hallo,
leider stehe ich momentan noch vor Herausforderungen mit meinem 6 Jahre alten Ender 3, da der Bambu A1 erst wieder im Mai verfügbar sein wird. Der Bambuslicer ist wirklich beeindruckend, allerdings bereitet mir die Pause bzw. der Filamentwechsel Probleme. Wenn ich eine Pause einlege, um das Filament zu wechseln, bleibt die Nozzle im Druck stecken, und der Drucker reagiert nicht mehr, sodass ich gezwungen bin, ihn auszuschalten.

Ich habe verschiedene G-Codes in Foren gefunden, die ich testweise unter Maschinen G-Code/Filamentwechsel eingegeben habe, aber nichts hat funktioniert. Hat vielleicht jemand einen passenden G-Code für mich oder einen Tipp? Ich wäre sehr dankbar dafür!

LG, Roland

Moin RoLendo,

Das Problem kenne ich noch aus vergangenen Zeiten. Zum Filamentwechsel kannst Du spezifischen G-Code einfügen und damit zum Beispiel die Nozzle zu einer Parkposition bringen. Der richtige Ort für den GCode findest Du hier.

Auf einen Ender 3 wird der X1C Filamentwechselcode nicht so ohne weiteres übertragbar sein, aber er sollte alles Wesentliche (und viel mehr) enthalten. Du brauchst wahrscheinlich “nur”

  1. aus dem Druck herausheben,
  2. Parkposition,
  3. Flush (beim X1C je nach Volumen mehrmals [die ganzen “if”] mit Wipes) oder Warten (M400) und
  4. Zurückfahren.

Außerdem fand ich generell zum Gcode die Reprap Wiki hilfreich. Bambu’s Implementierung ist nicht so gut dokumentiert, aber diesen bambu-lab-x1-specific-g-code Thread fand ich hilfreich.

Hoffe das ist hilfreich und VLG,
Eno

Mein X1C Vanilla Filamentwechselcode 1 zu 1 herauskopiert:
M620 S[next_extruder]A
M204 S9000
{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}
G17
G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift
{endif}
G1 Z{max_layer_z + 3.0} F1200

G1 X70 F21000
G1 Y245
G1 Y265 F3000
M400
M106 P1 S0
M106 P2 S0
{if old_filament_temp > 142 && next_extruder < 255}
M104 S[old_filament_temp]
{endif}
G1 X90 F3000
G1 Y255 F4000
G1 X100 F5000
G1 X120 F15000

G1 X20 Y50 F21000
G1 Y-3
{if toolchange_count == 2}
; get travel path for change filament
M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0
M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1
M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2
{endif}
M620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}
T[next_extruder]
M620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}

{if next_extruder < 255}
M400

G92 E0
{if flush_length_1 > 1}
; FLUSH_START
; always use highest temperature to flush
M400
{if filament_type[next_extruder] == “PETG”}
M109 S220
{else}
M109 S[nozzle_temperature_range_high]
{endif}
{if flush_length_1 > 23.7}
G1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part
G1 E{(flush_length_1 - 23.7) * 0.02} F50
G1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}
G1 E{(flush_length_1 - 23.7) * 0.02} F50
G1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}
G1 E{(flush_length_1 - 23.7) * 0.02} F50
G1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}
G1 E{(flush_length_1 - 23.7) * 0.02} F50
G1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}
{else}
G1 E{flush_length_1} F{old_filament_e_feedrate}
{endif}
; FLUSH_END
G1 E-[old_retract_length_toolchange] F1800
{if (flush_length_2 > 1) && (filament_type[next_extruder]==“PLA-CF” || filament_type[next_extruder]==“PETG”)}
M106 P1 S255
M400 S3
M106 P1 S0
G1 X80 F15000
G1 X60 F15000
G1 X80 F15000
G1 X60 F15000; shake to put down garbage

G1 X70 F5000
G1 X90 F3000
G1 Y255 F4000
G1 X100 F5000
G1 Y265 F5000
G1 X70 F10000
G1 X100 F5000
G1 X70 F10000
G1 X100 F5000
G1 X165 F15000; wipe and shake
G1 Y245 F21000
G1 X65
G1 Y265 F3000
{endif}
G1 E[old_retract_length_toolchange] F300
{endif}

{if flush_length_2 > 1}
; FLUSH_START
G1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_2 * 0.02} F50
G1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_2 * 0.02} F50
G1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_2 * 0.02} F50
G1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_2 * 0.02} F50
G1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_2 * 0.02} F50
; FLUSH_END
G1 E-[new_retract_length_toolchange] F1800
{if (flush_length_3 > 1) && (filament_type[next_extruder]==“PLA-CF” || filament_type[next_extruder]==“PETG”)}
M106 P1 S255
M400 S3
M106 P1 S0
G1 X80 F15000
G1 X60 F15000
G1 X80 F15000
G1 X60 F15000; shake to put down garbage

G1 X70 F5000
G1 X90 F3000
G1 Y255 F4000
G1 X100 F5000
G1 Y265 F5000
G1 X70 F10000
G1 X100 F5000
G1 X70 F10000
G1 X100 F5000
G1 X165 F15000; wipe and shake
G1 Y245 F21000
G1 X65
G1 Y265 F3000
{endif}
G1 E[new_retract_length_toolchange] F300
{endif}

{if flush_length_3 > 1}
; FLUSH_START
G1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_3 * 0.02} F50
G1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_3 * 0.02} F50
G1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_3 * 0.02} F50
G1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_3 * 0.02} F50
G1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_3 * 0.02} F50
; FLUSH_END
G1 E-[new_retract_length_toolchange] F1800
{if (flush_length_4 > 1) && (filament_type[next_extruder]==“PLA-CF” || filament_type[next_extruder]==“PETG”)}
M106 P1 S255
M400 S3
M106 P1 S0
G1 X80 F15000
G1 X60 F15000
G1 X80 F15000
G1 X60 F15000; shake to put down garbage

G1 X70 F5000
G1 X90 F3000
G1 Y255 F4000
G1 X100 F5000
G1 Y265 F5000
G1 X70 F10000
G1 X100 F5000
G1 X70 F10000
G1 X100 F5000
G1 X165 F15000; wipe and shake
G1 Y245 F21000
G1 X65
G1 Y265 F3000
{endif}
G1 E[new_retract_length_toolchange] F300
{endif}

{if flush_length_4 > 1}
; FLUSH_START
G1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_4 * 0.02} F50
G1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_4 * 0.02} F50
G1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_4 * 0.02} F50
G1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_4 * 0.02} F50
G1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}
G1 E{flush_length_4 * 0.02} F50
; FLUSH_END
{endif}
; FLUSH_START
M400
M109 S[new_filament_temp]
G1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature
; FLUSH_END
M400
G92 E0
G1 E-[new_retract_length_toolchange] F1800
M106 P1 S255
M400 S3
G1 X80 F15000
G1 X60 F15000
G1 X80 F15000
G1 X60 F15000; shake to put down garbage

G1 X70 F5000
G1 X90 F3000
G1 Y255 F4000
G1 X100 F5000
G1 Y265 F5000
G1 X70 F10000
G1 X100 F5000
G1 X70 F10000
G1 X100 F5000
G1 X165 F15000; wipe and shake
G1 Y256 ; move Y to aside, prevent collision
M400
G1 Z{max_layer_z + 3.0} F3000
{if layer_z <= (initial_layer_print_height + 0.001)}
M204 S[initial_layer_acceleration]
{else}
M204 S[default_acceleration]
{endif}
{else}
G1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000
{endif}
M621 S[next_extruder]A

Vielen Dank für die ausführliche Antwort @ EnoTheThracian. Ich fürchte, diesen G-Code habe ich schon probiert, jedoch ohne Erfolg. Dabei flitzt der Druckkopf beim Ender 3 wie wild herum, versucht die Nozzle abzustreifen und zu reinigen, und druckt nachher munter weiter. Ich müsste für den Ender3 einen M600-Befehl irgendwie im G-Code einbinden, das versteht scheinbar der Ender 3 als Filamentwechsel, damit kann der etwas anfangen.
Wenn ich unter Maschincode/Filamentwechsel M600 eingebe funktioniert der Filamentwechsel aber leider ist das Timing falsch. Wenn ich im Slicer zum Beispiel für Layer 14 einen Filamentwechsel einstelle, so macht der Drucker bereits in Layer 2 einen Filamentwechsel und überspringt Layer 14.

Ich habe es jetzt so gelöst das ich unter Maschinen G-Code den M25 Code durch einen M600 Code getauscht habe. Jetzt fährt der Ender3 bei gesetzter Pause schön in den Filamentwechsel Modus, alles bestens.

Danke für die Hilfe!
LG Roland

Moin @RoLendo ,

Ja, 1:1 einsetzen und ausprobieren ist mutig :wink:

Aber es hat gezeigt, dass der Code getriggert wird. Nur seltsamerweise wohl an der falschen Stelle? Dann muss da irgendetwas im Code der Lage 2 stehen dass den Filamentwechselcode triggert.
Du kannst in der Slicer Vorschau durch den den Code der Lage 2 scrollen (der Slider unten) und sehen was die Düse macht. Dann musst Du Deine Hardware nicht riskieren um zu sehen was der Drucker an Befehlen erhält.
Steht da irgendwo ein M620 code? Das ist normalerweise der Filamentwechselcode für den Bambu.

Ich würde erst einmal neu und einfarbig slicen damit ich einen sauberen Start habe. Dann gibt es 2 Möglichkeiten:

  • Entweder händisch an der gewünschten Lage mit Rechtsklick auf den slider rechts in der Vorschau spezifischen GCode einfügen um erst einmal die Syntax und Kommandos hin zu bekommen. M600 kann Dir helfen, aber dann steht die Nozzle immer noch im Bauteil. Da muss also noch mehr hin (s. unten).
  • Oder gleich versuchen den Filamentwechselcode zu triggern (zum Beispiel durch Filamentwechsel im Slicer).

Wenn der Filamentwechselcode an der richtigen Stelle getriggert wird, geht es natürlich noch darum (nur) das Wichtige dort zu haben:

  • Hochheben der Nozzle. Das müsste das hier sein:
    G17
    G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift
    G1 Z{max_layer_z + 3.0}
    Du kannst natürlich die nozzle dort oben lassen, aber dann gibt es wahrscheinlich oozing und einen purge willst Du über Deinem Bauteil auch nicht machen.
  • Darum willst Du wahrscheinlich erst einmal eine Parkposition ansteuern. Das könnte zum Beispiel so aussehen (kommt aber auf Deinen Ender an):
    G1 X70
    G1 Y245
  • Und dann erst einmal Pausieren um das Filament (händisch?) zu wechseln. Das wäre beim Bambu M400, kann beim Ender (mit dem ich keine Erfahrung habe) aber anders sein. In der RepRap Wiki finde ich zum Beispiel die M25 für Pause SD Print und M24 für Resume SD Print.
  • Bei meinem alten Tarantula konnte ich das Filament händisch wechseln. Damit würde ich erst einmal anfangen und auch den Purge händisch machen um mich Schrittchenweise voran tasten zu können. Mit dem Ender 3 kenne ich mich leider nicht aus.
  • Vor dem Zurückfahren habe ich etwas Respekt und bin da unsicher. Aber wenn er bei Deinem Versuch mit der 1:1 Kopie nach seinem “Tanz” wieder zurück an die richtige Position gefahren ist dann müsste es diese Kombi sein (aber komplett ohne Gewähr):
    G1 Z{max_layer_z + 3.0}
    G1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange]

Es sind nur wenige Zeilen in dem “Roman” der beim X1C dort steht die Du für den Anfang brauchst. Aber es wird noch einiges an Debugging, Versuchen und Ausprobieren nötig sein. 1:1 werden meine Überlegungen sicher nicht funktionieren. Aber ich hoffe, dass sie Dir helfen können einen einfachen, schlanken Code für einen machbaren Filamentwechselcode auf Deinem Ender zu entwickeln.

VLG und viel Erfolg,
Eno

Hallo Eno,

vielen Dank für die detaillierte Anleitung. Ich befürchte, mein alter Ender 3 ist vielleicht zu primitiv für all die Befehle, da es sich um einen Drucker der ersten Generation handelt.

Trotzdem komme ich mit meiner Lösung sehr gut zurecht. Ich habe bei einem Bauteil zu Testzwecken fünf Pausen eingestellt, was sehr gut funktioniert hat. Bei Eingabe des Codes M600 unter Maschinen G-Code /Pause fährt er für einen Filamentwechsel zur Seite, um den Filamentwechsel vorzunehmen, und gibt das Filament ordnungsgemäß aus. Im Grunde genommen bewirkt M600 genau das, was auch über das Bedienfeld beim Filamentwechsel passiert.

Herzlichen Dank für deine Unterstützung! Ich freue mich schon sehr auf meinen Bambu A1.

LG Roland

1 Like