(This can affect first layer consistency and z offset consistency between prints.)
⚠️ On larger enclosed printers (i.e. V2 & Trident), ensure that you are heat soaking for at least an hour.*- *This is not necessary when printing unenclosed. If you have a thick bed, or your bed is mounted to frame extrusions, give it 5-10 minutes.
Z will drift upwards as the frame and gantry thermally expand with chamber heat. This can cause your first layer squish to vary between prints, and can even cause your first layer to drift up as it prints.
Look at the graph below. The red line represents Z offset drift over time as the frame comes up to temperature (this is on a V2.).
It's not ideal, but just get into a routine - start the heat soak from your phone when you wake up in the morning.
There are ways around this - specifically by using gantry backers in combination with software-based frame thermal expansion compensation. This is also commonly combined with auto z calibration (or auto baby-stepping, as I prefer to call it) to allow for an accurate starting offset at any temperature.
- Below are some links.
⚠️ This guide is NOT a tutorial about any of the below, so you're on your own here!- Backers
- The science behind backers
- My preferred backers (MGN9s)
- Titanium backers
- These are available from multiple other stores.
- Steel backers
- A set of 3 backers in 1.9 mm steel can be custom ordered at SendCutSend for somewhere in the neighborhood of $10 (presuming you've met their minimum order of $29). See first link.
- Mechanical Probes / Auto Baby-stepping
⚠️ Auto baby-stepping is some work to set up, and builds off of other knowledge (standard Z endstop offset adjustment / probe offset adjustment) that you should ideally become familiar with first. - Frame Expansion Compensation (z_thermal_adjust)
⚠️ Thermal compensation is an advanced feature which requires some know-how, Python script tinkering, and inference.- Klipper z_thermal_adjust config reference
- Klipper set_z_thermal_adjust command reference
- Determining your temperature coefficient
- This is currently the only way to measure your coefficient.
- Forewarning: In the creator's own words, it's "jank".
- For script related errors, alch3my has asked that you 📄contact him on Discord.
- Backers
(If your squish seems to vary at different spots on the bed)
-
In my opinion, you should use 📄bed mesh. I personally recommend generating a bed mesh before every print, by adding
BED_MESH_CALIBRATE
to yourPRINT_START
macro. (requires the config section in the link above.)-
With a physical Z endstop, make sure not omit the
relative_reference_index
setting described in the link above. Follow the formula. This setting is not needed when using the probe as your Z endstop (virtual endstop), however.relative_reference_index
= ((x points * y points) - 1) / 2
-
Use
algorithm: bicubic
instead ofalgorithm: lagrange
when using a mesh size greater than 3x3. -
Some discourage using bed mesh unless absolutely necessary, but I disagree. In my opinion it's cheap insurance. It's very rare for larger printers to have a perfect first layer without it.
-
Your heat soaked mesh will be different from your cold mesh. The bed and gantry can warp with heat. It will even vary at different temperatures. This is why I prefer to generate a fresh bed mesh for every print.
-
Bed mesh can't always save you from mechanical problems.
- Most bed mesh issues are caused by the gantry rather than the bed itself.
- For V2, follow my 📄V2 gantry squaring instructions. A poorly squared gantry can be the root cause of a lot of first layer issues.
- On all CoreXY printers: 📄de-rack.
- For V2, this is part of the gantry squaring instructions above. Please follow those first/instead.
- If you are using dual X rails, make sure they are properly aligned with each other. This can cause left-to-right first layer issues that mesh can't compensate for.
- Ensure that everything is tight in your toolhead and across your X extrusion, including the hotend and nozzle.
- Most bed mesh issues are caused by the gantry rather than the bed itself.
-
Try more mesh points. Usually anything above 5x5 is overkill, but you can try up to 9x9.
- With a physical Z endstop, don't forget to update your
relative_reference_index
when changing mesh points. This setting is not needed when using the probe as your Z endstop (virtual endstop), however.relative_reference_index
= ((x points * y points) - 1) / 2
- With a physical Z endstop, don't forget to update your
-
-
For V2:
-
Ensure that you place your
BED_MESH_CALIBRATE
after G32, as the stock G32 macro clears bed meshes. -
You may need to play with how tight your bed mounting screws are.
-
I heat soak, fully hot-tighten 3/4 bed screws, and make the 4th screw "snug but not tight"
- It's commonly advised to mount your bed with only three screws, with "one tight, two loose". Anecdotally this advice has caused fist layer issues for me.
-
-
Ensure that your Z belts are properly tensioned. They should all be roughly equal tensions.
-
I tension mine to 140hz over a 150mm span of belt.
- Apps:
- Android: Gates Carbon Drive (select "motorcyle" option) or Spectroid.
- iPhone: Gates Carbon Drive (select "motorcyle" option) or Sound Spectrum Analysis.
- Apps:
-
Your closed loop belts (the short belts loops in the Z drive units) should be quite tight, but not so tight that they are pulling the motors shaft out of parallel.
- The stock tension levers don't always give enough tension on their own. You may have to loosen the motor mount, stick a flathead screwdriver between the lever tensioner and the Z drive main body to give it a bit more tension, and tighten it back down.
- (It's not easily possible to measure these with a frequency)
-
-
-
For V0:
- Ensure that your bed is solidly mounted. Check that the screws are not coming loose in the MGN7 carriage.
-
For inductive probes:
- Make sure your PEI is not bubbling in places. Inductive probes can only sense the subsurface, so cannot correct for PEI bubbles.
- Try leaving the toolhead sitting close to the center of the bed during your heat soak. Inductive probes thermally drift, and this can pre-heat it so that it does not drift during your mesh generation.
- Microswitch-based magprobes (Klicky/Quickdraw) and other physical probes like BLTouch allow for detection of the actual print surface (though I would recommend Klicky/Quickdraw over BLTouch if you take this route)
-
Ensure that there is no debris under your spring steel.
-
Disable z lift (z hop) on first layer.
-
Check your Z axis. Make sure everything is tight, especially grub screws.
-
Run
PROBE_ACCURACY
to check for issues with your Z axis repeatability.- My personal comfort zone:
- Standard deviation ≤ 0.004.
- Range ≤ 0.0125.
- On V2, run
PROBE_ACCURACY
in each corner of the bed to check all four Z drives.
- My personal comfort zone:
-
Ensure that everything is tight in your toolhead and across your X extrusion, including the hotend, nozzle, and probe.
-
See the 📌Thermal Drift section. Ensure that you are heat soaking for long enough on larger enclosed printers.
(If your Z offset seems to vary between prints.)
-
Check your Z axis. Make sure everything is tight, especially grub screws.
-
Ensure that everything is tight in your toolhead and across your X extrusion, including the hotend, nozzle, and probe.
-
For nozzle endstops:
-
Ensure that your start g-code contains a final z homing with a hot nozzle near the end.
- This ensures that any plastic remaining on the nozzle is squished out of the way, and is less likely to affect your Z offset.
- This also accounts for the small amount of thermal expansion in the nozzle as it heats.
- You can use a nozzle brush mod to automatically clean any debris. You should still home Z with a hot nozzle, though.
- You can control when your heating occurs by 📄passing variables to
PRINT_START
.
-
Ensure that the endstop pin is square on top, otherwise it can cause your Z offset to drift as it rotates over time.
- Notching your Z endstop pin (as described in the Voron manuals) can prevent it from rotating.
-
Ensure that your nozzle is hitting the center of the pin.
-
Test your endstop's accuracy using 📄
PROBE_Z_ACCURACY
. You may want to try different endstop switches to find a more accurate one.-
NOTE: This requires you to install the above linked Klipper plug-in (klipper_z_calibration). This command is NOT built into Klipper natively.
-
You can just install it for the accuracy test. You don't have to read/use anything else from that link.
-
Scroll all the way to the end of the main page for usage / arguments.
-
-
-
-
For V2:
⚠️ Ensure that you are homing Z again after QGL, as QGL throws off Z height.- See the V2 notes under the 📌First Layer Consistency section above.
-
For inductive probes as Z endstop (virtual endstop):
- Inductive probes thermally drift, meaning that your Z offset can change at different bed/enclosure temperatures. You may need to calibrate Z offset for the temperatures you intend to print at.
-
For Klicky/Quickdraw 📄Automatic Z Calibration*:
- Ensure that none of your magnets are loose.
- If they are coming loose, make sure to lightly sand the tops of the magnets before gluing them back in. They adhere much better this way. Even still, I occasionally have one work its way loose.
- Ensure that your
Calibrate_Z
macro is hitting the body of the Klicky microswitch on the Z endstop, not the button of the Klicky microswitch. - Try
PROBE_ACCURACY
and check how accurate your switch is. Sometimes you may need to try multiple switches to find the "best" one.
- Ensure that none of your magnets are loose.
-
See the 📌Thermal Drift section. Ensure that you are heat soaking for long enough on larger enclosed printers.
* This is a mod. It essentially baby steps for you, to account for different bed heights in addition to nozzle heights.