@FranckFG when executing the CALIBRATE_Z_START - I am getting the following issue (after T is done warming up and on temperature 200): “Move out of range: 10.000 5.000 5.000 [0.000]” and I can not proceed with the Z Calibration. The Head is not moving to the middle of the bed.
Correct. I think I put a comment on the autotune file that it would need to configured by each user to be functional (per person), but thanks for highlighting it for others.
@snapidxuser, I’ll take a look at that as soon as possible
I bricked my MCU during a Klipper firmware update
Be careful with the ribbon cable between the screen and the MCU in my case, it seems very fragile… The traces came unglued which caused the MCU to brick… Well, with Eazrael’s help I managed to recover the SACP bootloader and get the MCU working again.
There you go, I’ve fixed the problem and updated GitHub. I also took the opportunity to fix other issues and restore the correct shortcuts in KlipperScreen. Thanks for reporting the problem
Please don’t hesitate to report any issues you encounter. The more of us who run the tests, the faster we’ll have reliable configurations ![]()
Nice work! I’m currently testing the new version and wanted to give some quick feedback. One detail I really appreciate in your start G-code is that you move the nozzle off the silicone pad while it heats up. It’s a small touch, but it prevents filament from getting trapped inside the nozzle during the heat cycle. As a result, the purge line comes out much cleaner and more consistent. Great attention to detail there.
@FranckFG FYI: Within my setup the TESTZ is an unknown command, so I was doing the calibration over the Fine Tuning Menu and save it then over Maintenance. Also there is still a French Message within the English messages.
I am testing both and jumping back and forth between @FranckFG and @DeSkwared
One consideration I believe would benefit both projects is the nozzle parking position during heating phases. Currently, across various functions, calibration routines, filament loading/unloading, and similar operations. The nozzle is held at the home position, directly over the silicone pad.
This presents a potential issue: as the nozzle heats up, residual filament remaining inside can ooze out and pool on the pad. A better approach would be to park the nozzle just off the edge of the pad during heat cycles. This allows any oozing filament to drip clear rather than accumulating on the pad surface, which in turn significantly eases the cleaning process prior to calibration.
Additionally, it may be worth implementing a small retraction at the start of heating cycles. A slight pull-back of the filament would help prevent it from slowly extruding out and interfering with sensitive calibration routines that rely on clean nozzle contact.
Hello Snapidxuser,
You have 3 macros to calibrate the Z Offset:
Calibrate Z start: moves the print head (T0) to the center, then adjusts the height using a piece of paper.
Calibrate Z save: saves the Z Offset value to the variable.cfg file and moves the print head (T1) to the same position for manual adjustment using the adjustment screw.
Calibrate Z end: parks the print heads.
SET Z offset: allows you to enter a value manually.
Personally, I start with this calibration, then fine-tune the Z Offset by printing an 80x80 square in copy mode to find the right compromise. Of course, you must have leveled the print bed beforehand ![]()
The adjustments are made directly on the print surface, which eliminates any issues with the rigidity of the heated bed.
In my setup, the print head is often parked outside the silicone pad.
I also added a retraction function once the print head has reached temperature.
I think I’ve fixed the French errors in the messages. I expected more fellow countrymen to be interested in this development, lol.
The repository has been updated with a few other corrections.
Thanks for the update, within your code I can see you are using an external mcu for input shaper.
I gonna try to implement my version on the raspberry pi pico. Where did you mount the accelerometer, do you have by any chance a mounting bracket which I can print and use?
Due to my bootloader and ribbon cable issues, I lost some time developing the Extras section… I started implementing the configurations based on what I found at the bottom of my drawers, lol. The ADXL module will be mounted behind the head on the metal bracket for the X-axis endstop sensor; a simple small bracket secured with the two screws should do the trick.
I just completed the last GitHub update for today. ![]()
Nice update! The visual blinking effects are a cool touch. I’ll give it a proper test tomorrow.
On a related note, I wanted to share something I’ve been using in my end print routine that worked really well for me back when I was running Marlin. I was dealing with a small oozing issue at the end of prints where a fine hair of PLA would form between the nozzle and the last point of contact on the model. To counter it, I added an anti-ooze sequence to my end G-code that solved the problem nicely.
If you think it’s a useful addition, it might be worth considering for your End Print routine. Happy to share the full G-code block if you want to experiment with it.
G92 E0
; === ANTI-OOZE SEQUENCE ===
; 1. Cool nozzle to reduce oozing (safe for PLA, PETG, ABS)
M104 S160
G4 P1500 ; Wait 1.5 seconds for temperature to drop
; 2. Retract filament to relieve pressure
G1 E-8 F200
G4 P300 ; Dwell to allow filament to relax
; 3. Lift Z high and fast (snaps any string)
G0 Z{max_layer_z + 15.0} F600
; 4. Move away from print area to safe position
G0 X150 Y150 F6000
; 5. Final retract to completely relieve pressure
G1 E-2 F200
G92 E0
; Home all axes
G28
; Turn off both extruders (if used)
{if is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))]}
M104 T{(initial_extruder % 2 == 0 ? min(initial_extruder + 0, 63) : max(initial_extruder - (1-0), 0))} S0
{endif}
{if is_extruder_used[(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))]}
M104 T{(initial_extruder % 2 == 0 ? min(initial_extruder + 1, 63) : max(initial_extruder - (1-1), 0))} S0
{endif}
; Turn off bed heater
M140 S0
; Turn off part cooling fan
M107
; Reset feedrate to 100%
M220 S100
; Disable stepper motors
M84
I didn’t create a mount. What I did instead was simply attach my S2DW to the printheads by using one of the factory bolts used to mount the T1 nozzle assembly, since it’s a little longer than the T0 bolt (the same ones we loosen when adjusting the T1 z-height.) I mounted it with the usb port facing upwards, and that worked great. Don’t forget to reassign your axis maps for each toolhead, depending on your own mounting solution.
Intéressant, je vais tester! merci pour ce retour d’expérience ![]()
Well, I have officially decided this effort is a success. I’ve converted my production machine to Klipper and dissected my test unit for parts. I DID save a stock MCU and screen. So, in case something unexpected or unsolvable rears its head with the Klipper setup, I can reluctantly revert.
I will continue to play with macros and configurations, but I think we have things established well enough that I am, personally, moving out of the beta test phase and moving to ops testing. I’m sure there are still some bugs to be squashed, and probably many optimizations to be made, but I am extremely pleased with how things have turned out so far.
Again, absolutely HUGE “thank you” to Evil and Franck for their help, ingenuity and support. It is not an overstatement to say that this would have been absolutely impossible without their brilliance.
I will report back if I discover anything critical or make any notable improvements or changes. Of course, please let me know if you find any major issues or implement any big improvements of your own.
Until then, Happy (Klipper) Printing!
Big dang heroes! ![]()
is anyone else having the filament runout sensor fail? i saw franck was able to have backup mode. maybe it is not working in desqwared, which i am trying because of the clean menu layout.
I have only had a few false-positives, but no other issues. I did not attempt a backup mode of my own.
i had 1 print earlier ‘complete’ half missing. the sensor didnt trigger and klippy log said nothing so the machine was finishing the gcode file. what should i look into? i dont troubleshoot klipper so know little.
It’s really difficult to say what the issue might be. The stock filament runout sensors are bespoke, custom things that don’t really conform to the typical type (primarily because they are intended to detect jams as well as runouts.). Klipper doesn’t play nice with them. If runout detection is something that is really critical for you, you may have better luck wiring and programming your own sensors and skip using the stock ones altogether.
You can play with the settings in the filament runout macro, but, unfortunately, I haven’t had any issues other than a few false positives, so it makes it hard to be exceptionally helpful.
For me, runout is a “nice to have” but not particularly critical for my use, so I didn’t devote a ton of time to it other than to establish basic functionality.
Perhaps Franck’s macro will work better for you. Have you given it a try?
Hello Jbot, as-tu bien renommer le plateau “backup ou backup_t1” ?
Hello Snapiduser, j’ai adapté ton G-code à la macro print_end et cela semble effectivement améliorer la qualité
Je dois revoir les macros de purge vu la distance supplémentaire rétracter… Pour l’unput_shaper, j’ai commencé à faire quelques tests en parallèle et regarde pour modéliser un support qui viendrai se pincer sur la tôle du fin de course X. Quelques choses qui devrait resembler à cela lol

