Klipper für Noobs am Ultimaker Original

Ja, late to the Party – i know. Aber ich hab die Tage einen (archivierten) Livestream gesehen, wo jemand seinen alten Ultimaker Original mit Klipper ausgestattet hat. Da ich auch noch einen von 2013 (!) rumstehen habe, dachte ich, ich probiere das mal aus und mach davon eine kleine Anleitung für absolute Einsteiger.

Der gute alte Ultimaker 1 brauchte nur eine intensive Reinigung, dann druckte er schon wieder. Selbst die offene PLA Spule, die schon sicher 5 Jahre offen und unbenutzt da dran hängt, war noch halbwegs okay. Also einfach alle Wellen raus, die Lager gereinigt, das ganze neu geschmiert und das Ding läuft wieder wie eine 1. Nicht schlecht für den alten Holzkasten.

Damals hatte ich (gibt ja kein beheiztes Druckbett) auf ein PEI-Druckbett vom Ziflex-Kickstarter upgegraded. Das hab ich nun mal ersetzt, da ich manche Reste einfach nicht runter bekomme. Dazu gibt es beim <$>Amazon</$> recht günstige, die kompatibel sind (220x220mm). Das macht bisher auch einen guten Eindruck.

Eigentlich wollte ich einen Testdruck auf der original Firmware machen um danach mit einem Druck auf Klipper zu vergleichen, hab ich aber leider verballert, weil ich so hyped war. Sorry! Da das ein langer Beitrag wird, hier mal ein praktisches Inhaltsverzeichnis:

Inhalt

Klipper

Als ich das erste mal von Klipper gehört hab, war ich etwas eingeschüchtert. Die ganze Firmware vom Drucker austauschen schien mir zu krass. Ich hatte auch nur einen 3D-Drucker und wenn der dann nicht mehr läuft… Gerade weil damals der Ultimaker ja auch über 1000 € gekostet hat. Das war mir zu risky. Jetzt hab ich aber meinen Anycubic i3 Mega verkauft und als Hauptdrucker einen BambuLab A1 Mini, da kann man das alte Schätzchen hier verbasteln.

Was ist Klipper?

Die meisten denken bei Klipper erstmal an eine alternative zu Octoprint, was in gewisser Weise auch stimmt, aber eben nicht ganz. Früher haben wir die 3D-Drucker mit Pronterface bzw. heute offenbar als Printrun bekannt, gesteuert. Dazu mussten wir den 3D-Drucker per USB mit einem Rechner verbinden. Dann kamen die ersten Controller mit SD-Karten Slot, LCD 4 Zeilen Display, Drehknopf und nervigem Piepser. In meinem Fall war das der Ulti-Controller. Irgendwann hat man das Steuerinterface dank Raspberry Pi dann mit Octoprint virtualisiert und so die Fernsteuerung ermöglicht. Im Wohnzimmer Slicen, im Keller Drucken, ohne vom Sofa aufzustehen. Dazu übernimmt Octoprint die Rolle des Rechners und Raspi ist per USB an das Controllerboard angeschlossen.

Klipper kann auf den ersten Blick das selbe, hat aber einen entscheidenden Unterschied. Es ist auch eine Firmware für die Drucker. Hier wird also nicht nur das Ausführen von Steuerbefehlen (G-Code) auf den Raspi ausgelagert, sondern ein Teil der Intelligenz (Interpretation dieser Befehle) in der Firmware des Druckers. Man könnte sagen, das Gehirn des Druckers wird erweitert. Weil die Teile der Firmware, die Rechenintensiv sind, nun auf eine potentere Hardware übertragen werden, kann der Controller viel schneller Arbeiten. Außerdem gibt es die Möglichkeit nun Fancy Sachen wie Resonanzkorrektur (aka. input shaper) einzubauen. Doch dazu später mehr. Klipper wird, genau wie Octoprint, über ein Webinterface bedient. Dazu gibt es eine Schnittstelle (Moonraker) die verschiedene Webinterfaces mit Klipper verbindet. Hier kann man Mainsail, Fluidd oder sogar auch Octoprint (aka. Octoklipper) benutzen. Oder auch direkt Android-Apps, oder Touchscreens.

Materialliste

Für Klipper brauchen wir nicht mal einen besonders starken RaspberryPi. Der 3A oder Zero 2 W reichen schon aus. Die meisten haben aber eh den 3B+, einen 4er oder neuerdings einen 5er zuhause. Wer Input Shaping nutzen möchte, braucht tatsächlich nur Temporär einen stärkeren Pi und kann danach wieder auf einen schwächeren Wechseln, da die Mathematik nur einmal ausgeführt wird. Das geht super, da das OS ja einfach auf einer SD Karte läuft, die dann in den nächsten Pi wandert. Man kann so dann auch alle seine Drucker mit einem einzigen Accelerometer einstellen.

  • RaspberryPi ab 2. Generation (z.B. bei <$>Amazon</$>)
  • Entsprechendes Netzteil
  • USB A Kabel (Drucker – Raspi) (<$>Amazon</$>)
  • SD Karte (Empfehlung: 8GB aufwärts) (<$>Amazon</$>)
  • optional: Housing für den Raspi (<$>Amazon</$>)
  • optional: Beschleunigungssensor + Kabel (<$>Amazon</$>)
  • optional: Kamera (Webcam oder RaspiCam)
  • optional: Netzwerkkabel

Image flashen

Früher haben wir mit Etcher geflasht, nun haben wir aber den coolen Raspberry Pi Imager. Wir müssen also nicht mal unser Image großartig suchen, da der Imager ein MainSail Image in der Repo hat.

Wir installieren also den Pi Imager. Bis vor kurzem sah der noch so aus:

Der neue sieht noch so aus:

Wir lassen den Board Filter so wie er ist und wählen dann unter OS wählen zunächst „Other specific-purpose OS“ aus.

Hier gehen wir auf „3D printing“.

Und wählen dann eines der Klipper Images aus. Ich hab mich hier für Mainsail OS entschieden, weil ich das unbedingt mal ausprobieren wollte. Ggf. probier ich das OctoKlipper später auch mal aus.

Hier gibt es verschiedene Versionen. Wenn ihr auf einem 4er Raspi oder 5er seid, nehmt gern das 64bit Image. Wer ein anderes Board benutzt, kann das entsprechende Image nehmen. Ansonsten nutzen wir das 32bit Image für den Raspi. Die Version kann bei euch abweichen.

Nun müssen wir noch eine SD-Karte wählen und können dann auf weiter klicken.

Nun können wir zusätzliche Einstellungen für WLan, lokalisation und SSH festlegen:

Boot

Nun schreibt er fleißig auf die SD-Karte. Diese stopfen wir dann in unseren Pi, stecken optional das Netzwerkkabel an oder hoffen, dass wir uns nicht vertippt haben beim W-Lan Zugang und bestromen den Kollegen mit dem passenden Netzteil. Wenn hier keine Fehler aufgetreten sind, können wir nun im Browser unseres Vertrauens den eben festgelegten Host-Namen eintippen und sehen schon das Mainsail Webinterface.

Wenn das nicht klappt, schaut mal in euer Routerinterface ob sich dort ein neues Gerät verbunden hat, ebenfalls mit dem festgelegten Hostname. Hier seht ihr dann die IP, die können wir copy & pasten oder wenn der Pi nicht im Netzwerk ist, aufs Kabel wechseln.

Es gibt noch komplexere Wege mit KIAUH (Klipper Installation and Update Helper), aber wir sind hier Noobs, daher so leicht wie möglich.

Damit haben wir sozusagen die eine Gehirnhälfte aufgebaut, fehlt noch die andere.

Drucker Firmware compilieren & flashen

Jetzt wirds wieder nerdiger. Wir öffnen die Windows Eingabeaufforderung und starten eine ssh Verbindung zu unserem Klipper Raspberry Pi. Dazu brauchen wir den User (vorhin festgelegt im Imager) und den Hostname oder die IP

ssh pi@ultiklipper.local
bzw:
ssh username@hostname.local
bzw.
ssh username@IP

Dann werden wir nach dem (eben vergebenen) Passwort gefragt.

Als nächstes gehen wir in das Verzeichnis von Klipper. Dazu gibt es den Befehl cd (change directory):

cd klipper

Und um die Inhalte hier schön formatiert zu sehen benutzen wir eine Form des List befehls:

ls -al

Make menuconfig

Soweit so gut. Nun müssen wir unsere Voreinstellungen für die Druckerfirmware machen. Dazu tippen wir den folgenden Befehl ein:

make menuconfig

Nun sehen wir das obere Bild. Mit den Pfeiltasten können wir hier navigieren. Leertaste toggelt, enter ist enter. Mit Q kommen wir wieder raus (Quit) bzw. zum Speicherbildschirm. Mit ESC kommen wir so raus.

Ich bin in der entspannten Lage und kann alles so lassen wie es ist. Wenn ihr einen anderen 3D-Drucker habt, müsst ihr in der Github Klipper repository nachschauen, welches Board euer Drucker hat. Die Liste aller Drucker / Boards / Microcontroller ist hier zu finden:

https://github.com/Klipper3d/klipper/tree/master/config

Wenn ich das jetzt z.B. für meinen I3 Mega von Anycubic machen würde, suche ich links danach und schau dann in der Datei oben nach:

Würde also immernoch passen bei mir. Navigiert euch also durch und wählt den richtigen Controller aus. Dann raus mit Q und speichern. Der nächste Befehl compiliert dann die Firmware:

make

Wer neugierig ist, kann nun einmal im Ordner nachschauen was da sonst noch so liegt

cd out
ls -al

Das schaut dann so aus:

Und da sehen wir auch schon, da ist unsere .hex

Wenn ihr einen anderen Drucker habt, kann es sein dass ihr eine .bin File oder sowas bekommt. Achtet hier einfach auf die Ausgabe in der Konsole.

Bei mir gehts um die klipper.elf.hex

Damit der nächste Befehl funktioniert, dürfen wir nicht ganz ins root Verzeichnis zurück, sondern gehen einfach zurück in den Ordner klipper.

cd ..

MCU Flashen

Nun flashen wir die eben compilierte Firmware auf unseren MCU (Microkontroller) im Drucker. Dazu müssen wir aber den „Pfad“ wissen. Diesen bekommen wir mit dem Befehl:

ls /dev/serial/by-id/*

Wir bekommen, hier in Babyblau, den Pfad zurück, den wir nun einmal markieren und mit strg + c (oder rechtsklick, geht aber nur hier in der Konsole) kopieren.

Als nächstes stoppen wir Klipper:

sudo service klipper stop

Und setzen unseren flash befehl zusammen:

make flash FLASH_DEVICE=/dev/serial/by-id/ #+ id aus vorherigem befehl

Also bei mir:

make flash FLASH_DEVICE=/dev/serial/by-id/usb-Arduino__www.arduino.cc__0042_A4136373037351303110-if00

Ihr seht, ich war nicht im Klipper Verzeichnis, also hats beim ersten versuch nicht geklappt. Nun starten wir wieder Klipper.

sudo service klipper start

Drucker konfigurieren

Als nächstes brauchen wir eine Konfigurationsdatei für unseren Drucker. Dazu gehen wir im Klipper Interface im Browser auf den Reiter Maschine. Hier gibt es einen Button „create File“, den wir sogleich betätigen. Im Dialog tippen wir „printer.cfg“ ein und bestätigen.

Nun gehen wir wieder ins Klipper GitHub Repo und suchen uns ein für unseren Drucker geeignete Konfigurations-Datei. Das sollte eigentlich die gleiche Datei sein, wie vorhin, für die Auswahl des MCU zum Kompilieren der Firmware. Diese kopieren wir uns nun komplett und fügen alles in unsere eben erstellte printer.cfg im Klipper ein.

Unter [mcu] müssen wir noch den Pfad zum Drucker anpassen. Der könnte sich durch das flashen der neuen Firmware geändert haben, daher fragen wir den in der Konsole (in der ssh verbindung) frisch ab:

ls /dev/serial/by-id/*

Bei mir ist der gleich geblieben, also füge ich den in die printer.cfg unter [mcu] ein:

Nun drücken wir oben rechts den Button save & restart.

Wer einen Ultimaker Original hat, so wie ich, findet im offiziellen Klipper Repo leider nicht die richtige printer.cfg. Ich hab im Netz aber bei JeremyGrosser eine gute gefunden:

https://gist.github.com/JeremyGrosser/079d68fd2458c356b527be700c09efdb

Wenn ihr die dann überschreibt, vergesst nicht hier dann wieder den mcu pfad zu korrigieren. Ich hänge meine unten aber auch an.

Eine letzte Fehlermeldung bzw. Warnmeldung im frischen Klipper gibt es noch: Missing Configuration

Diese beheben wir ganz leicht, in dem wir in unsere printer.cfg folgende Zeile direkt ganz oben einfügen

[include mainsail.cfg]

Wieder save & restart und weiter gehts.

Das System Testen

Nun ist eigentlich schon alles bereit. Wir müssen dann jetzt testen ob die Bewegungen Maßhaltig sind, ob der Extruder die richtige Menge extrudiert und natürlich das Druckbett leveln. Damit wir das Safe machen können, sollten wir einmal händisch die Endstops testen. Hierzu wechseln wir in Klipper wieder auf Maschine und unten gibts eine kleine Kachel für den Endschalter test:

Wir können also einfach mal mit der Hand die Endstops auslösen und auf das kleine aktualisieren Icon drücken:

Funktionieren die korrekt, fahre ich die Home-Position an. Das mache ich einzeln, mit einer Hand auf dem Ausschalter 🙂

Wenn nix schlimmes passiert ist, können wir nun zunächst die X-Achse um z.B. 50 mm fahren lassen und nachmessen ob das auch in echt 50 mm waren. Dazu suchen wir uns einen guten Referenzpunkt am Drucker. (Der Rand am Druckkopf und der Rand oben innen eignen sich gut.) Danach die Y-Achse und die Z-Achse.

Das hat bei mir mit dem importierten Profil schon ganz gut gepasst für X und Y. Bei Z hingegen gab es eine Abweichung. Nach etwas Recherche und ausprobieren hab ich hier den korrekten Wert herausgefunden und meine printer.cfg im Abschnitt [stepper_z] angepasst:

rotation_distance: 6

Ulti Controller

Wer den Ulti Controller hat, merkt sicher, der läuft mit unserer aktuellen printer.cfg noch nicht so wie er soll. Dazu habe ich aber auch irgendwann die passende Config gefunden. Wir können in der printer.cfg also folgende Blöcke hinzufügen.

[display]
lcd_type: hd44780
rs_pin: PD1
e_pin: PH0
d4_pin: PH1
d5_pin: PD0
d6_pin: PE3
d7_pin: PH3
hd44780_protocol_init: True
#   Perform 8-bit/4-bit protocol initialization on an hd44780 display.
#   This is necessary on real hd44780 devices. However, one may need
#   to disable this on some "clone" devices. The default is True.
line_length: 20
#   Set the number of characters per line for an hd44780 type lcd.
#   Possible values are 20 (default) and 16. The number of lines is
#   fixed to 4.

Für den Drehkopf habe ich zwar einen config Block gefunden, die Pins passen aber noch nicht:

noch herausfinden:
encoder_pins: ^PC6, ^PC4 
click_pin: ^!PC2 
kill_pin: ^!PG0

[output_pin beeper] 
pin: EXP1_1

Das nutze ich wahrscheinlich eh nicht, daher hab ich das erstmal auskommentiert. Wer hier was weiß, immer her damit!

Update: Ich hab mir aus Marlin diese Tabelle für Pin-Mappings (bei mir für den ATMEGA2560) gezogen:

* Pin mapping for the 1280 and 2560
 *
 *   Hardware Pin  : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100
 *   Port          : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx
 *   Logical Pin   : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
 */

Nun habe ich mal geschaut, im Klipper bei X-Stepper step_pin steht A3 – und in der UMO Marlin steht 25. Das stimmt mit der Tabelle überein. Auch dir_pin und enable_pin passen. Also haben wir hier einen guten Hinweis.

Nun suche ich meinen Bereich für mein LCD:

Übersetzt heißt das dann:

encoder_pins: PG1, PL7 #ggf tauschen
click_pin: PD2 
#kill_pin: ^!PG0

[output_pin beeper] 
pin: PD3

Nun sollte das auch funktionieren. Zumindest wird jetzt ein wenig sinnvolle Info angezeigt. Im Dashboard kann man den Beeper auch manuell aktivieren, empfehle ich aber nicht 😀

Weiter gehts!

Wenn ich bei mir den Knob drehe, passiert noch nichts. Da bin ich allerdings gerade nicht sicher ob das nicht daran liegt, dass da nix hinterlegt ist, was zu tun wäre. Also keine weiteren Infos etc. Ich muss mich erst weiter mit den ganzen Möglichkeiten beschäftigen und werde das dann ergänzen. (Siehe Hier)

Die offiziellen Ultimaker UltiController files gibts btw. auf Thingiverse:

https://www.thingiverse.com/thing:27039

Bei mir sind die Seiten gebrochen, man kann die aber mit 3D-gedruckten von Thingiverse ersetzen:

https://www.thingiverse.com/thing:774846

Z-Offset einstellen

Der Endstop-Switch sollte so eingestellt sein, dass das Druckbett ein paar wenige Millimeter (2-5 mm) unter der Nozzle zum stehen kommt. Dann bleibt die Düse beim Homing nämlich in der Luft und versaut euch nicht die eine Ecke vorne am Druckbett mit dauernder Hitzeeinwirkung (so bei meinem Ziflex passiert). Auch wenn noch Plastikreste an der Nozzle hängen, gibts hier dann keinen Crash (auch so passiert).

Damit man dann aber trotzdem nicht in der Luft druckt, kann man in Klipper ein Z-Offset einstellen. Dazu fahren wir den Druckkopf in die Mitte vom Druckbett und geben danach im interface den Befehl zur Kalibrierung ein:

G1 X100 Y100 Z0
Z_ENDSTOP_CALIBRATE

Nun öffnet sich ein Menü, mit der wir in verschiedenen kleinen Schritten über den Endstop hinaus fahren können.

Wer noch mit den ganz alten Maschinen manuell das Bett leveln musste weiß was jetzt kommt. Wir nehmen uns ein Stückchen Papier welches wir mit Nozzle und Druckbett einklemmen. Wir verkleinern also den Spalt so lange, bis wir das Papier noch mit ein ganz wenig Reibung bewegen können. Diese neue Höhe ist unser Z-Offset. Diese speichern wir in unsere printer.cfg mit dem Befehl:

SAVE_CONFIG

Bei mir ist der Wert etwa bei +0.8 über Z gelandet. Wenn bei euch der Dialog abbricht, müsst ihr in der printer.cfg die Grenzwerte des Druckers anpassen (position_min):

[stepper_z]
step_pin: PC0
dir_pin: !PG2
enable_pin: !PC2
microsteps: 16
rotation_distance: 6
endstop_pin: ^!PC7
#position_endstop: 0
position_min: -5
position_max: 200
homing_speed: 20.0

Bed Leveling

Da wir hier ja sehr Oldschool unterwegs sind, haben wir leider keinen Bed-Leveling Sensor. Wir müssen daher nun manuell in die Ecken des Druckbetts fahren und in jeder Ecke die Nozzle mit dem Papier auf dem Druckbett prüfen.

Klipper hat noch die Möglichkeit, die Position der Stellschrauben in der Config zu hinterlegen und dort die höhe zu Messen. Dann misst er mit der Probe die höhendifferenz und gibt euch zurück, wie weit diese gedreht werden müssen, um ein perfektes Ergebnis zu erzielen. Eine Anleitung dazu gibt es hier:

https://www.klipper3d.org/Manual_Level.html

Da denk ich doch tatsächlich drüber nach mir eine günstige mal zu besorgen.

Extruder Test

Nun fehlt noch der Extruder. Ich hab sogar das Dual Extrusion Upgrade drin, also muss ich das ganze zwei mal machen. Im Klipper Dashboard gibt es oben rechts die Temperaturanzeige:

Wenn diese Werte plausible sind, sollte alles passen. Wenn nicht, müssen wieder in der printer.cfg die Pins, bzw. die Art des Sensors auf euer SetUp angepasst werden. Wie man dazu vorgeht, die korrekten Pins zu finden, seht ihr in der blauen Box etwas weiter oben.

Wir heizen unsere Nozzle auf – am besten wenn das Druckbett nicht direkt anliegt – und warten bis diese auf Temperatur ist. Nun markieren wir hinten am Einzug das Filament, direkt wo es ins Bauteil verschwindet. Das ist unser Referenzpunkt. Nun können wir statt zu extrudieren in die andere Richtung (retract auf deutsch?!) fahren und die Distanz vom Referenzpunkt zur Markierung messen. Wenn das passt, alle gut, ansonsten hier wieder in der Printer.cfg unter [extruder] die rotation distance anpassen. Das kann man z.B. mit dem Dreisatz machen:

Gemessene Extrusionslänge / Soll Extrusionslänge * Wert bei rotation Distance

Bei mir war das im Default bei 33.6.. ich brauche allerdings 3.36. Also es war Faktor 10 zu wenig Extrudiert.

In der Klipper-Dokumentation gibt es auch Hinweise zur rotation Distance. Man kann diese mit den Daten des Steppers (bei mir sind es 200 Steps pro volle Umdrehung), mal den Microsteps (bei mir 16) und geteilt durch die Step Distance (laut Internet 833 für den Ultimaker 1) ausrechnen. Ergibt bei mir 3.8. Kommt also auch hin.

Hier muss man nicht übertrieben genau nachkalibrieren, da Düsentemperatur, Filamentdurchmesserschwankungen und später auch presusre Advance immer für etwas Über- oder Unterextrusion sorgen. Messen und mit Dreisatz auf den korrektur Wert kommen, ist also genau genug.

Dual Extrusion

Wer mit Dual Extrusion arbeitet, muss noch Macros in die printer.cfg packen, damit Klipper mit T0 und T1 im Gcode arbeiten kann. Zu Macros gibt es weiter unten mehr.

[extruder]
step_pin: PL6
dir_pin: PL4
enable_pin: !PG0
microsteps: 16
rotation_distance: 3.3500
nozzle_diameter: 0.400
filament_diameter: 2.850
heater_pin: PE4
sensor_type: AD595
sensor_pin: PK0
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 275

[gcode_macro T0]
gcode:
    #SET_SERVO SERVO=extruder_servo angle=100    # Lift secondary extruder
    #SET_GCODE_OFFSET Z=0 MOVE=1                 # Adjust z-height
    #SET_GCODE_OFFSET X=0                        # Clear X offset
    ACTIVATE_EXTRUDER EXTRUDER=extruder

# Dual extruder support.
[extruder1]
step_pin: PL2
dir_pin: PL0
enable_pin: !PL1
microsteps: 16
rotation_distance: 3.3500
nozzle_diameter: 1.00
filament_diameter: 2.850
heater_pin: PE5
sensor_type: AD595
sensor_pin: PK1
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 275

[gcode_macro T1]
gcode:
    #SET_GCODE_OFFSET Z=0.100 MOVE=1             # Adjust z-height
   # SET_SERVO SERVO=extruder_servo angle=100    # Position second extruder
    #SET_GCODE_OFFSET X=5                        # Account for different X offset
    ACTIVATE_EXTRUDER EXTRUDER=extruder1

Dann können wir jetzt jede Nozzle einmal unabhängig voneinander anheizen und ein wenig Material extrudieren.

Und siehe da, mein Extruder1 dreht sich noch nicht…

Ich schau also wieder im Marlin nach:

49 entspricht der Tabelle D6. 74 ist D4 und 48 ist D5.

In meiner printer.cfg steht aber was anderes. Aber auch wenn ich die Pins ändere, passiert noch nix. Der Trick war dann, PL1 wieder auf !PL1 zu setzen. Hier also für den Ultimaker T1 die Konfig:

# Dual extruder support.
[extruder1]
# step_pin: PL2
# dir_pin: PL0
# enable_pin: PL1
step_pin: PL0
dir_pin: PL2
enable_pin: !PL1
microsteps: 16
rotation_distance: 3.3500
nozzle_diameter: 1.00
filament_diameter: 2.850
heater_pin: PE5
sensor_type: AD595
sensor_pin: PK1
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 275

[gcode_macro T1]
gcode:
    #SET_GCODE_OFFSET Z=0.100 MOVE=1             # Adjust z-height
    #SET_SERVO SERVO=extruder_servo angle=100    # Position second extruder
    #SET_GCODE_OFFSET Y=21,6                     # Account for different position
    ACTIVATE_EXTRUDER EXTRUDER=extruder1

Erster Druck mit Klipper

Da der Drucker nun eigentlich schon läuft, ist es Zeit für einen ersten Testdruck. Dazu nehme ich eins der vielen Testobjekte von Thingiverse, wie z.B. das hier:

https://www.thingiverse.com/thing:34558

Ich hab in letzter Zeit eigentlich nur noch den Prusa Slicer benutzt, aber ich will Cura auch mal wieder eine Chance geben, ist ja schließlich die Mutter-Software zum Drucker. Ich lade also die aktuelle Version runter und richte den Drucker ein. Muss ich das hier noch beschreiben? Nee oder?

Nun wird ganz normal gesliced, noch keine spannenden HighSpeed Sachen. Ich nutze die Standard absoluten Defaults auf 0,2 mm „Draft Quality“. Die einzige Änderung die ich bisher gemacht hab: Meine 2. Nozzle ist eine 1mm Düse.

Ich teste erstmal die Standard 0.4er Nozzle und dann die 1mm Nozzle, weil ich jetzt dann ja beim Leveln auch noch beide auf die gleiche höhe bringen muss. Das ist beim Ultimaker Original relativ bescheiden gelöst, in dem man oben diese Schrauben dreht, die aber frei im Druckkopf schwimmen. Hier muss ich mir mal ein gescheites Upgrade überlegen.

Double Trouble

Und wie sie sehen, sehen sie nichts. Meine Nozzle heizt auf aber dann meint Klipper, die zweite Nozzle wäre zu kalt zum drucken. Also die, die ich garnicht benutzen will. Dann müssen wir vermutlich doch noch was im Slicer anpassen.

Fix

Ich hab nun beim Cura bei Printer Start Code und Printer End Code einfach den Befehl für das Klipper Macro [START_PRINT] und [END_PRINT] reingehauen. Was genau da dann passiert, seht ihr unter Macros. Das scheint das Problem vorerst zu beheben, aber die zweite Nozzle heizt auch mit auf, obwohl ich die nicht brauche. Das ist wahrscheinlich den Defaults im Makro geschuldet. Schau ich mir aber dann mal an. (Laut Internet ein bisher nicht gelöstet Pröblem, da wohl erst ab Ultimaker 3 in der FW anders aufgelöst wird).

Long Story Short: Man MUSS im Slicer kleine Anpassungen machen, damit die Print Start sequenz korrekt funktioniert.

SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_temp VALUE={material_print_temperature_layer_0,0}
SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_temp1 VALUE={material_print_temperature_layer_0,1}
START_PRINT

Hier wird aus dem Slicer mit einem Befehl den Klipper lesen kann, der Wert für die erste Schicht übertragen.

{material_print_temperature_layer_0,0} ist also einfach wieder ein Platzhalter. Die 0 hinter dem Komma steht für T0. Die 1 natürlich für T1.

Hier wird aktuell auch wenn ich nur eine Nozzle nutzen möchte für die andere jeweils eine Temperatur übergeben. Ggf. kann ich später mal eine Art Stand-By Temperatur als Korrektur überschreiben. Noch übersteigt das aber meine Fähigkeiten.

In Print Start ist dann im Klipper eine G-Code Sequenz hinterlegt (Homing, Purge-Line).

Das Ergebnis besticht durch die außergewöhnlich schlechte Qualität, aber hey, beide Düsen tuen jetzt was sie sollen (obviusly not). Beim Bed-Leveling kann ich noch Nachhilfe brauchen. (Hier war das Problem noch Under Extrusion durch die falsche Rotation-Distance, ist mir da aber noch nicht aufgefallen.)

Benchy

Nachdem ich nun einen funktionierenden Drucker habe, muss ich natürlich einen Benchy drucken.

Hier ist mir dann auch endlich das Dilemma mit der Underextrusion (und der falschen Rotation Distance) aufgefallen.

Nach der Korrektur und noch ein wenig Feintuning (Live Z-Adjust ist auch ein Game-Changer) beim Bed-Leveling, kam dann auch schon ein gescheiter Benchy raus.

Und hier mit der 1mm Nozzle:

Hier ist die Qualität durchaus noch bescheiden. Mal gucken wie sich das entwickelt.

Als nächstes will ich mal testen ob ich mit beiden Düsen gleichzeitig drucken kann. Ich hab mir hier mal zwei Benchys reingeladen und den unterschiedlichen Düsen zugewiesen.

Aber hier ist leider nur die 0.4mm Düse erfolgreich gewesen.

Und als nächstes kommt ein gemischter Benchy aus beiden Düsen. Hier gibt es dafür ein Modell. Man lädt einfach beide STL-Files in den Cura und muss diesen dann die jeweilige Nozzle zuweisen und einfach beide Zentrieren, so dass sie übereinanderliegen.

Und weiterhin ist die 1mm Nozzle problematisch. Naja.

Klipper Plug-In für Cura

Es gibt in Cura ja einen Marketplace, da gibt es zwei Plug-Ins für Klipper, die ich mir mal installiert habe.

Eine Moonraker-Verbindung und ein Klipper Settings Plug-In. Nach der Installation muss man Cura neu starten:

Nach dem Neustart sehen wir jetzt unter der Drucker-Verwaltung einen button für die Moonraker-Verbindung.

Hier sollen wir unsere Daten eingeben. Ich hab hier aber noch kein Plan, daher lass ich das mal so.

Außerdem finden wir nun unter den Druck-Einstellungen die Klipper-Settings, das einzig spannende für mich ist der Pressure Advance Factor:

Ich hab nun Cura mal aktualisiert und jetzt gibt es, ohne das ich etwas weiter Konfiguriert hätte, die möglichkeit, direkt zu Moonraker hochzuladen. Ich hab da nur die IP eingetragen und es funktioniert. Cool!

Unter Überwachen kommt aber leider nix:

Man kann nun aber auch .ufp mit Thumbnails hochladen, was in der MainSail Oberfläche ganz schick ist:

Macros:

Macros sind selbst definierte Funktionen und Gruppen von GCode. Z.B: könnt ihr fürs Vorheizen ein Makro Anlegen, wo der Druckkopf schon mal in die Home-Position fährt und dann die Düsen angeschmissen werden. Oder es gibt Makros fürs Bed-Leveling, da hier ja auch viele Schritte hintereinander ausgeführt werden. Auch Filament-Wechsel wäre eine Sache, die sich gut mit einem Macro machen lässt.

Ein oft erwähntes Makro ist das für den Drucker Start. Im Cura seht ihr ja, es gibt Start-GCode und End-GCode, der immer in die Datei mit eingefügt wird.

Wenn ihr jetzt Klipper habt, müsst ihr diese Macros in den GCode einbauen. Erst dann wird der Start_Print befehl (Also das Macro) erkannt und ihr könnt hier dann Angepasste Sequenzen fahren, ohne alle alte Dateien neu Slicen zu müssen. (Nachgerüstetes HotBed oder ähnliches). Hier gibts ein paar gute Beispiele:

https://github.com/Klipper3d/klipper/blob/master/config/sample-macros.cfg

Also neu wäre es jetzt so:

Wie oben beschrieben, habe ich hier den Code um die Temperatur an Klipper zu übergeben.

Weiter oben hab ich auch schon Macros eingerichtet, damit ich beide Extruder ansteuern kann. Da das ganze Thema Klipper Macros aber eine größere Geschichte ist, auf die ich gern genauer eingehen will, lager ich das in einem eigenen Beitrag aus. Diesen gibt’s dann hier verlinkt.

Start Print Macro

In meiner printer.cfg lege ich aber zumindest noch mein start print macro an. Die sieht bei mir so aus:

[gcode_macro START_PRINT]
description: Macro to Prepare the printer to start
variable_extruder_temp: 185
variable_extruder_temp1: 185
gcode:
  M104 S{extruder_temp} T0
  M104 S{extruder_temp1} T1 # heats nozzles to value of extruder temp variable without waiting
  G90
  G28 F1500.0 #homes all axis. i home y first, otherwise i have some weird problems with the endstop x
  G92 E0 #this resets extruder
  G1 Z50 F4000.0 #moves bed 50mm down
  M109 S{extruder_temp} T0
  M109 S{extruder_temp1} T1 # now waits to reach temp.
  PURGELINE

#PurgeLine
[gcode_macro PURGELINE]
gcode:
# Move Z axis up 
  G1 Z2.0 F3000 
  # Move to start position 
  G1 X10.1 Y20 Z0.28 F5000.0 
  # Draw the first line
  G1 X10.1 Y200.0 Z0.28 F1500.0 E15 
  # Move to the side
  G1 X10.4 Y200.0 Z0.28 F5000.0 
  # Draw the second line 
  G1 X10.4 Y20 Z0.28 F1500.0 E30 
  # Reset extruder 
  G92 E0

Genauergesagt sind es zwei, da ich die Purgeline einfach mal als extra Macro angelegt habt. Das Macro fährt einfach die Sequenz fürs Aufheizen durch und fährt dann den Druckkopf in die Endschalter um die Positionen zurückzusetzen. Ich hab keine Bedleveling-Probe, daher fällt das bei mir recht kurz und einfach aus.

End Print Makro

Und natürlich brauchen wir auch eins, wenn der Drucker fertig ist, wechles den Druckkopf in eine schöne End-Position fährt, vll noch das Druckbett nach unten fährt und dann für eine schnelle Abkühlung sorgt.

[gcode_macro END_PRINT]
gcode:
    # Turn off bed, extruder, and fan
    M140 S0
    M104 S0
    M106 S0
    # Move nozzle away from print while retracting
    G91
    G1 X-2 Y-2 E-3 F300
    # Raise nozzle by 10mm
    G1 Z10 F3000
    G90
    #Fan
    M106 S255
    # Disable steppers
    M84

Mehr zu Macros dann im eigenen Post, wenn es soweit ist.

KIAUH

KIAUH steht für Klipper Installation and Update Helper und ist eine kleine Hilfreiche Software für das CLI (die Konsole), die euch helfen soll, alles up-to-date zu halten und ggf. auch Zusatz Software zu installieren. Ein weitere Feature ist z.B. der einfache Wechsel der Web Interfaces. Also von Mainsail zu Fluidd oder vice versa. Auch Octoklipper kann man mit KIAUH einfach Nachinstallieren.

Mehr zu KIAUH findet ihr in der Github-Repo.

Damit wir KIAUH installieren können, müssen wir mit ssh auf den RaspberryPi mit Klipper. Das geht einfach mit Putty oder auch direkt in der Windows Command Line (win +r, cmd, enter) und dann

ssh username@ip-adresse
password

Wenn wir erfolgreich verbunden sind geben wir einen Befehl für ein Update ein und installieren Git (sollte aber schon da sein.)

sudo apt-get update && sudo apt-get install git -y

Wenn wir Git haben und alles aktuell ist, können wir das Install-Script benutzen um alles zu installieren:

cd ~ && git clone https://github.com/dw-0/kiauh.git
./kiauh/kiauh.sh

Nun startet auch direkt KIAUH und wir sehen eine Übersicht mit Optionen links und einen Status unseres Systems. Bei mir ist Klipper, Moonraker und Mainsail, sowie Crownsnest (für Webcam) als Default installiert.

Hier könnt ihr euch mal durchklicken, wenn es euch interessiert, aber ändern müssen wir hier erstmal nix. Ich hab das der Vollständigkeit halber hier mit reingenommen.

Webcam und Timelapse

Eine Webcam lässt sich super einfach einrichten. Wenn ihr das Image von ganz oben benutzt habt, sollte Crownsnest schon laufen. Sonst nutzt KIAUH um es nach zu installieren. Entweder nutzt ihr eine Raspi-Cam an dem speziellen Anschluss oder eine USB Webcam, wie z.B. die Logitech C270. Für beide gibt es btw. auch haufenweise Halterungen bei Thingiverse.

Dann gibt es seit kurzem ein Klipper-Plug-In für Timelapse, dass war bei mir tatsächlich schon im Image dabei. Das integriert man einfach noch mit dem Eintrag in der printer.cfg

[include timelapse.cfg]

Konfigurieren können wir das über die Zahnräder oben rechts und dann den letzten Eintrag.

Und Links im Menü sollte ein Unterpunkt sein.

Ansonsten hier auch wieder mehr dazu in der Github-Repo.

Falls bei euch nicht dabei: Wir gehen wieder in die Konsole und verbinden uns mit ssh mit dem Raspi. Dann nutzen wir folgende Sequenz um Timelapse zu installieren:

cd ~/
git clone https://github.com/mainsail-crew/moonraker-timelapse.git
cd ~/moonraker-timelapse
make install

Auch hier den include in der printer.cfg nicht vergessen!

Den korrekten Pfad zur Kamera könnt ihr über den Geräte button oben rechts abfragen. Der muss dann unter Device eingetragen werden. Ich hatte erst die alte 1.3er Pi-Cam dran, aber bin jetzt auf eine V3 umgestiegen. Da muss man lib-camera nachinstallieren, den legacy modus deaktivieren und die Kamera als webrtc laufen lassen.

Leider fällt die bei mir immer noch manchmal aus. Ich werde dazu aber wahrscheinlich noch ausführlicher in einem eigenen Beitrag schreiben.

Input Shaper

Beim Input Shaping wird das Signal für die Motorsteuerung moduliert um Resonanzen durch die Bewegung und Beschleunigung zu unterdrücken. Das kann man sich in etwa wie bei Noise-Cancelling Kopfhöhrern vorstellen. Dies führt im 3D-Druck zu glatteren Oberflächen. Damit man hier ein geeignetes Verfahren und auch entsprechende Parameter verwenden kann, muss man das Verhalten des Druckers an seinem Aufstellungsort messen. Also Tische oder Rollwägen machen einen Unterschied. Natürlich auch die Art des Gehäuses bzw. dessen mechanische Steifigkeit.

Für die Resonanzmessung habe ich mir einen sogenannten Portablen Input Shaper gekauft. z.B. den hier von <$>Amazon</$>. Dabei handelt es sich um einen Beschleunigungssensor, der auch schon einen kleinen Microcontroller mit an Board hat. Das praktische ist, dass diese Variante einfach per USB an den RaspberryPi des Druckers (mit der Klipper Firmware) angeschlossen wird. Man kann aber auch einfach einen Barebone Sensor (adxl) kaufen und diesen über einen zweiten Raspi laufen lassen, oder eine zweite Klipper instanz auf dem gleichen Raspi starten, um den Sensor auszulesen. Das hat mich aber alles abgeschreckt, da man hier wieder mit SPI etc. hantieren muss und fummelige Pins anschließen.

Die passende Doku gibt es hier bei GitHub:

https://github.com/FYSETC/FYSETC-PortableInputShaper

Im Prinzip folgen wir aber einfach dem Guide aus der Klipper-Dokumentation: https://www.klipper3d.org/Measuring_Resonances.html

Vorbereitung

Um bei unserem Beschleunigungssensor (bzw. Portable Input Shaper aka PIS) an die Werte zu kommen, müssen wir den mit einer Firmware flashen. Das heißt, wir flashen tatsächlich eine Klipper-Version auf den Chip. Hier ist nur wichtig, dass beide Chips die gleiche Klipper-Version haben. Also am besten Vorher alles einmal updaten. Diese können wir uns ganz einfach auf dem Raspi erstellen, auf dem wir schon Klipper für den Ultimaker betreiben. Dazu verbinden wir uns per ssh wieder zu Klipper und gehen in das Klipper Verzeichnis:

cd klipper
make menuconfig

Mit dem Befehl „make menuconfig“ kommen wir in die Ansicht um das Klipper-System zu Konfigurieren.

Hier müssen wir unter „Micro Controller Architechture“ den Chip „RaspberryPi 2040“ auswählen. Wenn ihr einen anderen Chip auf eurem PIS habt, muss dieser natürlich gewählt werden. (Man navigiert hier mit Pfeiltasten und wählt mit leertaste oder Enter). Das „Communication Interface“ muss auf „USB“ bzw. auf „USBSerial“ gesetzt werden. Am Ende drücken wir auf der Tastatur die Taste q zum speichern und können dann mit y bestätigen.

Dann geben wir die beiden Befehle „make clean“ und danach „make“ ein, um die Firmware zu kompilieren.

make clean
make

Am Ende wird uns angezeigt, wo wir die fertige Datei finden. Diese müssen wir ja noch auf unseren Portable Input Shaper übertragen. Ich nutze dazu FileZilla um mich per SFTP mit den Raspi zu verbinden. Das geht mit der IP des Druckers, dem Username (default war pi) und dem Passwort (default war raspberry). Der Port ist 22.

Nun navigieren wir in das richtige Verzeichnis (home/pi/klipper/out) und sehen dort die Datei klipper.uf2. Die können wir mit Drag & Drop z.B. auf unseren Desktop kopieren lassnen.

Als nächstes müssen wir den Portable Input Shaper mit dem Rechner verbinden. Bei mir hat der PIS einen USB C anschluss. Ich nehme also einfach ein USB C Kabel. Damit wir den Chip aber korrekt mit der Firmware beschreiben können, müssen wir den kleinen Knopf auf der Platine drücken und halten. Dann können wir das USB Kabel einstecken – Und siehe da: Ein Explorer-Fenster öffnet sich! Jetzt kann man den Button loslassen. In das neue Fenster ziehen wir per Drag&Drop die kopierte Datei „klipper.uf2 hinein und sofort schließt sich das Fenster wieder.

Der PIS rebootet sich und ist nun mit der Firmware geflasht. Jetzt ziehen wir das USB Kabel vom Rechner ab und verbinden es mit dem Raspi des 3D-Druckers.

Ob die Verbindung erfolgreich hergestellt wurde können wir mit dem folgenden Befehl prüfen:

ls -l /dev/serial/by-id 

Links ist der RaspberryPi vom Ultimaker, rechts der RaspberryPi Chip mit dem adxl Beschleunigungssensor auf dem PIS.

Packages installieren

Auf dem Haupt-Raspi (am Ultimaker) brauchen wir noch ein paar Pakete, um die nötigen Berechnungen durchzuführen. Das kann bischen dauern.

sudo apt update
sudo apt install python3-numpy python3-matplotlib libatlas-base-dev libopenblas-dev
~/klippy-env/bin/pip install -v numpy

Ich hab dann direkt noch Python aktualisiert.

Zurück in der Web-Oberfläche von MainSail gehe ich in den Bereich „Maschine“ und erstelle eine neue Datei. Die könnt ihr nennen wir ihr möchtet, bei mir heißt die PIS.cfg. In die muss der folgende Code-Block:

[mcu PIS]
# Obtain definition by "ls -l /dev/serial/by-id/" then unplug to verify
serial: /dev/serial/by-id/your-secondary-klipper

[adxl345]
cs_pin: PIS:gpio13
#spi_bus: spi1a
spi_software_sclk_pin: PIS:gpio10
spi_software_mosi_pin: PIS:gpio11
spi_software_miso_pin: PIS:gpio12
axes_map: x,-z,y # verify orientation

[resonance_tester]
#accel_chip: adxl345 usbadxl
accel_chip: adxl345 
probe_points:
# should be more or less center of printbed
    100,100,20 #comment if using any of the others

Hier muss man nur bei serieal: /dev … den Pfad ändern. Den könnt ihr einfach mit dem Button am oberen Rand „Geräte“ und dann auf Serial nochmal abrufen. Oder aus der Konsole, wie weiter oben schon gemacht mit:

ls -l /dev/serial/by-id 

Ggf. wollt ihr bei probe_points noch die Werte für die Mitte eures Druckbetts anpassen. Das ganze Speichern wir dann einmal und fügen noch in der printer.cfg einen passenden include-Tag ein:

[include PIS.cfg]

Diesen Schritt können wir wieder mit Speichern & Neustart abschließen.
Dann testen wir, ob Sensorwerte vom Portable Input Shaper durchkommen. Dazu gehen wir auf die Klipper-Konsole und tippen den folgenden Befehl ein:

ACCELEROMETER_QUERY

Hier sehen wir nun drei Werte, einer davon ist die Erdbeschleunigung (9.81m/s²). Man sieht, bei mir sind z und y vertauscht, trotz korrekter Montage. Das ist aber nicht weiter schlimm, nur auf dem Graphen falsch.

Montage

Das bringt mich zum nächsten Schritt. Der Montage des Sensors. Wenn ihr könnt, montiert den am besten direkt an der (kalten) Nozzle. Denn genau hier wollen wir ja die Vibrationen rausbekommen. Bei mir war mir das zu fummelig, daher hab ich den einfach oben am Druckkopf befestigt. Wenn ihr einen BedSlinger habt, muss der Sensor einmal am Druckkopf und einmal am Druckbett gefestigt werden.

Der Sensor sollte sich nicht bewegen können und schön stabil verbunden werden, damit die Schwingungen unverändert auf den Sensor übertragen werden. Wenn möglich, nutzt also zwei Schrauben.

Die Ausrichtung des Sensors ist nicht so wichtig, da in alle Richtungen gemessen wird.

Resonanzmessung

Jetzt können wir die eigentliche Resonanzmessung vornehmen. Zunächt müssen wir den Drucker homen und dann können wir den Test über die Klipperkonsole starten:

TEST_RESONANCES AXIS=X
TEST_RESONANCES AXIS=Y

Nun rattert der Drucker fröhlich seine Messreihe durch. Wenn es bei euch zu heftig vibriert, kann die Messung in der Klipperkonsole mit M112 abgebrochen werden.

Nun wechseln wir wieder in die Windows-Konsole und starten den nächsten Befehl:

~/klipper/scripts/calibrate_shaper.py /tmp/resonances_x_.csv -o /tmp/shaper_calibrate_x.png ~/klipper/scripts/calibrate_shaper.py /tmp/resonances_y_.csv -o /tmp/shaper_calibrate_y.png

Dieser wertet die abgelegten Messwerte (eine .csv Datei) aus und erstellt ein Diagramm. Das können wir z.B. wieder mit FileZilla vom Raspi herunterladen. Zu finden is das unter ~/tmp. (Also ganz nach oben in der Ordnerstruktur).

Hier sieht man nun das Schwingungsverhalten seines Druckers und ein paar korrekturvorschläge in der Textbox oben rechts. Man kann nun die vorgeschlagenen Werte in die printer.cfg packen. Die Klipperdoku erklärt hier noch etwas ausführlicher, welchen Einfluss welcher Parameter hat.

In der printer.cfg muss der Block also so aussehen und auf eure Vorschläge angepasst werden:

[input_shaper]
shaper_freq_x: ...
shaper_type_x: ...
shaper_freq_y: 34.6
shaper_type_y: mzv

Außerdem sollte im printer-block noch eine Zeile eingefügt werden:

[printer] max_accel: 3000 # should not exceed the estimated max_accel for X and Y axes

Die ganze Schwingungsmessung und Kalibrierung geht aber auch Vollautomatisch mit:

SHAPER_CALIBRATE

Wenn Klipper damit fertig ist, können wir die Änderungen übernehmen:

SAVE_CONFIG

Damit ist eigentlich das Input Shaping fertig. Man kann hier aber nichts kaputt machen, also gibt es raum für ein paar Trial & Error Schleifen. Nicht vergessen in der printer.cfg den include des PIS auszukommentieren, wenn ihr durch seid und dann erst den portable input shaper abzuziehen. Sonst gibt’s einen Fehler. Oder einfach dran lassen.

Pressure Advance

In aktuellen Marlin Versionen gibt es einen vergleichbaren Ansatz namens Linear Advance. Aber egal ob LA oder PA, beide sind mathematische Konzepte um das gleiche Problem zu lösen. Wenn der Extruder das Filament mit einer (theoretisch perfekt stabline) Temperatur und mit einer (ebenfalls theroetisch perfekten) gleichbleibenden Vorschubrate in die Düse drückt, kann der geschmolzene Kunststoff ja nicht ungehindert ausströmen. Da entweder das Druckbett oder die bisherigen Schichten unterhalb der Düse (mit Abstand der Schichthöhe natürlich) warten, entsteht ein Filamentrückstau. Dieser führt zu Druck in der Düse. Kann man sich etwas wie beim Wasserhahn vorstellen, wo das Wasser im geschlossenen Hahn wartet. Das ist sozusagen die Materialzufuhr.

Jetzt bewegt sich aber der Druckkopf sehr unterschiedlich. Wir haben eine Phase der Beschleunigung, daraus resultiert eine Geschwindigkeit, daraus resultiert unterschiedliche Materialabfuhr. Das ganze äußert sich dann als Überextrusion in Ecken, da hier gebremst wird, es dadurch zu weniger Materialabgang, ergo höherem Düsendruck kommt. Bzw. zu Unterextrusion auf langen Wänden, da hier nicht genug Material nachkommt. Je höher die Druckerbeschleunigung, bzw. Endgeschwindigkeit, desto deutlicher wird der Effekt. Das ganze macht es also schon spannend, wenn man an die mechanischen Grenzen seines 3D-Druckers gehen möchte. Um das zu Verhindern muss also die Zuflussrate des Filament moduliert werden.

Und genau hier setzten pressure Advance und linear Advance an. Bei Linear Advance wird einfach die maximale Beschleunigung der Düse begrenzt um nicht zu hohe Extrusionsraten (Verhältnis von Materialabgang zu Materialzugang in der Düse) zu bekommen.

Bei Pressure Advance wird das Verhältnis der vorherigen Bewegung zur aktuellen Berücksichtigt und der Zufluss des Filamentes mit einem korrekturfaktor moduliert. Es gibt also gezielte Über- bzw. Unterextrusion.

Beim Ultimaker, bzw. generell bei Bowdenextrudern halte ich es persönlich für unnötig, sich großartig mit der Optimierung zu befassen, da wir durch die verhältnismäßig lange Strecke zwischen Extrudermotor und Heizbereich unvorhersehbare, federnde Effekte bekommen. Schließlich hat das Filament ja etwas Platz im Schlauch und kann sich hier hinbiegen. Ich kann mir vorstellen, dass dadurch ohnehin eine Art Glättungs Effekt des Düsendrucks auftritt, da sich das wie eine vorgespannte Feder verhalten kann. Aber vll. ist das auch Blödsinn 🙂

Wenn ihr ein Direct-Drive Hot-End habt, macht es durchaus Sinn, sich mit der Optimierung zu befassen.

Damit die Anleitung hier vollständig ist, hab das ganze trotzdem gemacht, auch um zu sehen, ob meine Meinung blödsinn ist.

Um den PA-Wert herauszufinden gibt es viele Varianten. Ich finde das Tool hier von „realdeuce“ ganz Hilfreich:

https://realdeuce.github.io/Voron/PA/pressure_advance.html

Hier könnt ihr eure druckerspezifischen Daten eingeben und euch einen G-Code generieren lassen, der leicht lesbare Linien mit unterschiedlichen Werten für den Pressure Advance Korrekturfaktor zeichnet.

Bei Bowden-Extrudern suchen wir einen Wert zwischen 0 und 1 mit einer Schrittweite von 0.05. Bei Direct-Drive suchen wir zwischen 0 und 0.1 mit Schrittweiten von 0.005. Die Website checkt auch ob die Linien auf das Druckbett passen. Ganz praktisch. Hier darf man nur nicht den Klipper-spezifischen Start und End-Gcode vergessen und die Temperatur für das Material passend einzutragen. Ich drucke eigentlich nur PLA, daher mache ich das ganze auch nur für PLA. Eigentlich muss man das bei jeder neuen Spule neu machen, zumindest für jedes Material, aber das ist mir zu aufwändig.

(Fun-Fact: Ich hab das ganze mit Underextrusion und schlecht geleveltem Druckbett gemacht und mich gewundert, warum das überhaupt nicht funktioniert…)

So sieht das ganze bei mir für T0 aus:

Ich kann jetzt die Beste Linie raussuchen oder ich grenze den Wert noch genauer ein. Bei mir sieht man die besten Linien noch gar nicht, ich schaue mir aber den Bereich 0.7 bis 1 nochmal an. Nun mache ich einfach nochmal eine neue Datei mit den beiden Werten als Start und Endpunkt und einer Schrittweite von 0.01. Wenn ihr enger beieinander liegt von den Werten könnt ihr jetzt auch wieder 0.005 Schrittweite machen.

Nun würde ich hier das beste Ergebnis auswählen und mache das gleiche nochmal für Nozzle T1. Da ich aber hier, wie erwartet, kein richtiges Ergebnis sehe, lass ich das ganze bleiben.

Achtung: Bei dem G-Code ist kein aktiver Extruder implementiert. Wenn ihr also noch versehentlich den falschen aktiv habt, wird der G-Code ggf. mit dem falschen Nozzle-Durchmesser abgefahren.

User Interface

Browser

Klipper bietet einige Möglichkeiten, was User Interfaces angeht. Den Standard – im Browser – haben wir hier ja schon sehr intensiv genutzt. Durch die modulare Gestaltung (klipper – moonraker – ui) kann man die Interfaces leicht wechseln. Ich hab hier Mainsail benutzt. Alternativ kann man aber auch Fluidd oder OctoKlipper als GUI im Browser nutzen.

KlipperScreen

Dann gibt es noch KlipperScreen, wo der Browser ausgelassen wird um das Interface zu rendern, sondern direkt per Firmware ausgegeben wird. Das wäre aber ein eigener Beitrag, sollte ich das Umsetzen.

Apps

Man kann bequem vom Smartphone, z.B. mit Mobileraker auf Klipper zugreifen.

LCD vom Drucker

Oder man hat ein altes Board mit LCD, so wie ich. Damit man dieses benutzen kann, muss man in der printer.cfg die korrekten Blöcke für seine Hardware einbauen. Leider hatte das GitHub Repo nichts für den Ultimaker original, aber die Werte für das generische 1.4 Ramps scheinen zu funktionieren. In der printer.cfg kommen also bei mir noch folgende Zeilen dazu:

[board_pins]
aliases:
    # Common EXP1 header found on many "all-in-one" ramps clones
    EXP1_2=PC2, EXP1_4=PH1, EXP1_6=PA3, EXP1_8=PA7, EXP1_10=<5V>,
    EXP1_1=PC0, EXP1_3=PH0, EXP1_5=PA1, EXP1_7=PA5, EXP1_9=<GND>,
    # EXP2 header    
    EXP2_2=PB1, EXP2_4=PB0, EXP2_6=PB2, EXP2_8=PG0, EXP2_10=<RST>,
    EXP2_1=PB3, EXP2_3=PC6, EXP2_5=PC4, EXP2_7=PL0, EXP2_9=<GND>,

Jetzt sollte der kleine Drehknopf am UltiController auch bei euch wieder funktionieren. Man kann dann noch das angezeigte Menü customizen. Dazu gibt es eine default menu.cfg im GitHub von Klipper, bzw. kann man sich eine zusätzliche .cfg mit beliebigem Namen anlegen, die hier die Einträge überschreibt. Nur nicht die jeweiligen Includes vergessen. Dazu schreibe ich dann auch noch einen eigenen Beitrag oder ergänze es hier. Ich will mir das Menü so configurieren, dass es wie das alte vom Ultimaker ausschaut.

Remote Zugriff

Richtig cool ist es natürlich, wenn man auch von Unterwegs auf die Kamera am oder im Drucker gucken kann und auch im Notfall mal einen Druck stoppen kann. Das geht mit Diensten wie Obico (früher mal als Spaghetti Detective bekannt) oder Octoeverywhere. Letzteres probiere ich hier mal aus. Dazu muss man einfach per SSH auf den Pi ein Paket installieren:

bash <(curl -s https://octoeverywhere.com/install.sh)

Wenn die installation fertig ist, bekommt ihr einen Code, den ihr auf der folgenden Website (wenn ihr eingeloggt seid) eingeben müsst:

https://octoeverywhere.com/code

Wer zu lang gewartet hat, kann einen neuen innerhalb der Konsole erzeugen lassen.

Nun kann man einen Shared Link erstellen (in der unteren Kachel), den man anstelle der IP des Drucker im Heimnetzwerk in eine App wie Mobileraker eingeben kann.

Jetzt kann man mit Mobileraker oder OctoApp auch von Unterwegs auf seinen Klipper-Drucker zugreifen. Der Dienst ist sogar kostenlos.

Im Broswer geht das ganze auch. Wenn ihr euch einfach von irgendwo bei Octoeverywhere einloggt und dann den Connect Button drückt, gelangt ihr zum gewohnten Klipper-Browser Interface.

Hier ist die URL für mich dann ultimaker.octoeverywhere.com. Diese kann man sich auch bequem als Lesezeichen abspeichern. Wenn ihr nicht eingeloggt seid, werdet ihr dann automatisch zum Log-In weitergeleitet. Alles ganz cool, denn so kann man auch Remote auf die .cfg files zugreifen.

Zurück zur Original Firmware

Falls ihr mal Zurück auf die Original-FW wollt, hier gibt es einen FW Builder für den Ultimaker Original:

https://bultimaker.bulles.eu/

Und hier die Ultimaker Original Marlin-FW zum selbst kompilieren:

https://github.com/AmedeeBulle/Marlin/tree/Marlin_UMO_Unified/Marlin

Das ist erstmal der grobe Überblick wie man Klipper zum laufen bringt und die Basics einrichtet. Es gibt aber noch viele ziemlich coole andere Features, z.B. wenn ihr autobedleveling habt. Auch kann man Klipper easy in Home Assistant einbinden, da wird der gleiche Weg genutzt, den ich schon für NanoDLP benutzt hab, da Klipper auch eine Web-API bereitstellt.

Ich lade euch meine vollständigen .cfg Files auch als Kopie in mein GitHub. Bzw. hier nutze ich Klipper-Backup:

https://klipperbackup.xyz/installation/#download-klipper-backup

$ Die mit einem $ gekennzeichneten Links, sind Affiliate Links. Wenn du über diese in den Shop gelangst und etwas kaufst, bekomme ich eine kleine Provision

Schreibe einen Kommentar

Geb mir einen aus :)

Wenn du das Zeug hier magst, denk doch über eine Spende nach um Server und Domain zu finanzieren.

$ Die mit einem $ gekennzeichneten Links, sind Affiliate Links. Wenn du über diese in den Shop gelangst und etwas kaufst, bekomme ich eine kleine Provision.

Suche & Filter