BLTouch / CR Touch Z Offset (Z Probe Offset) Calibration in Marlin Firmware

While it’s indeed true that an automatic bed leveling sensor, such as the BLTouch, will ensure that your printer’s bed is always level before a print without requiring any input from you, there is one essential piece of configuration you will need to adjust manually first for the sensor to work as intended.

In this guide, we will go through the process of correctly calibrating (and setting) the Z offset value (also known as the Z probe offset) for your BLTouch (or CR Touch) automatic bed leveling sensor in Marlin firmware and take a glance at the babystepping feature that allows you to correct or further refine the Z probe offset value as the print is taking place.

BLTouch / CR Touch Z Offset (Z Probe Offset) Calibration in Marlin Firmware

As there is more than one way to calibrate and set the Z probe offset value for your BLTouch / CR Touch sensor, we will walk you through the two distinct methods we prefer using for both accessibility and convenience purposes.

While the first method is more manual in comparison, the fact that it doesn’t require any extra configuration means that anyone can use it to calibrate the Z probe offset value for their BLTouch / CR Touch.

On the other hand, even though the second method simplifies things by automating some of the steps, the fact it requires your 3D printer’s firmware to be configured in a certain way means it won’t be available to everyone.

Calibrating BLTouch / CR Touch Z Offset Manually in Marlin Firmware

When calibrating the Z offset value manually for your BLTouch / CR Touch, the process practically comes down to moving the Z-axis to the point where the nozzle is as close as possible to the print bed and setting the current Z position as the Z probe offset value.

To start, auto-home your 3D printer by sending the G28 G-code command through a terminal or using the LCD controller if available.

ender 3 v2 auto home example


Once auto-homing is done, reset the Z probe offset value to 0 by sending the M851 Z0 G-code command through a terminal (or with the LCD controller), and auto-home your printer again afterward.

setting the z probe offset to 0


Next, disable the software endstops by sending the M211 S0 G-code command through a terminal (or with the LCD controller).

Disabling the software endstops will allow you to move the Z-axis below the Z_MIN_POS during the calibration process, which can be necessary in some cases to bring the printhead to the correct spot and find the optimal Z-offset value.

disable software endstops in octoprint


Afterward, bring the printhead to a location where it’s comfortably on top of the print bed, such as the center point, with the G1 Xn Ym G-code command, where n and m are X and Y coordinates, respectively (or with the LCD controller).

Additionally, raise the Z position (G1 Zn) to create space between the nozzle and the print bed if the printhead is too close to the bed after auto-homing.

printhead positioned on top of the bed


Next, place a standard piece of paper on top of the print bed, and move the printhead down until the nozzle is very close to the paper, with only a tiny gap separating the two.

printhead positioned close to the bed with a piece of paper in between


Once there’s barely any space between the paper and the nozzle, move the printhead down 0.1 mm at a time with the LCD controller (enable live axis movement if the firmware you’re using has support for it, as it’ll make things much more convenient); try to drag the paper out slowly, and keep repeating this until you reach a point where you feel friction when trying to drag the paper.

Similarly, if the paper is entirely stuck, move the printhead up 0.1 mm instead, and keep repeating these movements until you find the spot where it’s possible to drag the paper out, but with some resistance making it more difficult.

moving the z axis ender 3 v2


Once you find the sweet spot, where you feel some friction when trying to pull the paper out, but not to the extent where the paper would end up being ripped if you try to get it off the print bed, make a note of the Z-axis value displayed on the screen, which will be your Z probe offset.

checking the z-axis value on the screen


Finally, bring the software endstops back to the enabled state by sending the M211 S1 G-code command through a terminal (or with the LCD controller).

enable software endstops in octoprint


Now that you have the correct Z probe offset value at hand, a couple of different paths are available to put this value into action and finish the calibration process of your BLTouch / CR Touch, so feel free to pick the one you think will be the most convenient for you from the methods listed below.

Setting Z Probe Offset with G-Code

Provided that you have access to a G-code terminal, our primary recommendation would be to send the M851 Zn command to your 3D printer, where n is the Z probe offset value you have noted earlier, and follow it up with M500 to save the change you have made to the EEPROM.

setting z probe offset with m851 gcode in octoprint


For instance, if the Z probe offset value you found with the paper method was -2.5, the correct G-code command to send through the terminal would be M851 Z-2.5 (followed by M500 to save).

Finally, to verify, reboot your 3D printer, check the saved probe Z offset value (you can use the LCD controller or the M503 G-code command), and ensure it’s the same value you have set.

Setting Z Probe Offset with the LCD Controller

If you have no terminal access, the next best option is to use the LCD controller of your printer to set and save the Z probe offset, as we can’t provide a complete step-by-step guide for this process due to it being different for each 3D printer.

Regardless, if you search the menus for an entry like Probe Settings or Z Probe Offset, you should be able to quickly locate the menu where you can configure the Z offset value for your BLTouch / CR Touch.

Once you put the value in, the last step is to save the modification you have made to the EEPROM (to make it permanent), with the command usually labeled similarly to Save Settings or Store Settings in the menus.

For instance, on an Ender 3 V2 running MRiscoC Professional Firmware, you can find the Probe Z Offset setting by navigating to the Advanced section first, followed by the Probe Settings sub-section.

ender 3 v2 setting probe z offset


Once you back out of the Probe Settings sub-section, you will also find the Store Settings entry, which you can use to save the modification you have made.

ender 3 v2 store settings


Finally, to verify, reboot your 3D printer, check the saved probe Z offset value by navigating to the related menu, and ensure it’s the same value you have set.

Setting Z Probe Offset with Cura

Finally, one last alternative that can be handy in some cases is to use the Cura Z Offset Setting plugin, and even though this technically won’t set the Z probe offset in the firmware, it will cause the G-code files you have sliced with Cura to take the Z probe offset value into account.

cura z offset plugin


When you install the plugin in Cura, you will find a new input labeled as Z Offset in the Print Settings section, and once you enter the Z probe offset value you have found, Cura will take care of the rest.

Please note that the plugin is an alternative method, and refrain from configuring the Z probe offset on your 3D printer’s firmware and with the Z Offset Setting plugin at once, as this will cause your offset to be doubled and create undesired results.

Calibrating BLTouch / CR Touch Z Offset with the Z Probe Offset Wizard in Marlin Firmware

You can only use the Z Probe Offset Wizard if PROBE_OFFSET_WIZARD is defined in Configuration_adv.h.

marlin configuration probe offset wizard variable


The Z probe offset wizard is a tool in Marlin firmware that allows you to adjust the Z probe offset value on the fly by actively moving the printhead position to take the new Z probe offset into account, which makes calibration more convenient compared to the manual method.

For the purposes of this guide, our steps will be based on an Ender 3 V2 Neo running on MRiscoC Professional Firmware.

Please note that the names of the menu entries and where they reside in the menus can vary across different forks of Marlin Firmware (and types of screens), meaning that you may have to look around a bit to find them on your 3D printer.

To start, auto-home your 3D printer by using the LCD controller or sending the G28 G-code command through a terminal.

ender 3 v2 auto home example


Once auto-homing is done, bring the printhead to a central area of the print bed, and raise it up a bit on the Z-axis to leave some room between the print bed and the nozzle.

printhead positioned on top of the bed


Then, place a piece of paper on the print bed. If the paper is small, ensure it’s directly under the nozzle.

printhead positioned close to the bed with a piece of paper in between


Next, move the position of the Z-axis to 0 (you can use the G0 Z0 G-code or the LCD controller).

moving the z axis ender 3 v2


With that done, go back to the main screen and navigate to the Prepare menu.

Depending on the 3D printer you’re using, you may need to navigate to the Configuration menu instead; and potentially follow up by navigating to the Advanced Settings menu.

ender 3 v2 prepare menu


Moving forward, navigate to the Z Probe Wizard section.

Once again, depending on the 3D printer and firmware you’re using, this section may be located under another section, such as one labeled Probe Offsets, meaning it should be a good idea to look everywhere.

ender 3 v2 z probe wizard


Once the Z Probe Wizard section is visible on the screen, scroll to the Probe Z Offset entry in the menu, and press the button.

If navigating to the Z Probe Wizard section already took you to a menu where you can actively modify the probe Z offset value by turning the knob, you can stay there.

If the menu you’re currently in presents you with options, such as Move 1 mm and Move 0.1 mm, choose the Move 0.1 mm option.

configuring the z probe offset with the z probe wizard on an ender 3 v2


Now, slowly modify the probe Z offset value to bring the nozzle as close as possible to the piece of paper by using the knob on the LCD controller but not so much that the nozzle pins the paper in place.

The sweet spot for the probe Z offset value is where you feel a decent amount of friction trying to drag the paper off the print bed but still are able to get the paper out comfortably without the nozzle ripping or scratching it.

printhead positioned close to the bed with a piece of paper in between


Once you find the optimal probe Z offset value, press the button to finalize the configuration and save your modifications to the EEPROM by clicking on the Store Settings menu entry.

ender 3 v2 store settings


Finally, to verify, reboot your 3D printer, check the saved probe Z offset value in the Z probe wizard section, and ensure it’s the same value you have set.

Babystepping (Live Z Offset Tuning) for Fine Z Probe Offset Adjustment

Even though babystepping isn’t a feature designed to be the primary way of adjusting the Z probe offset value, it’s pretty useful as a complementary tool that allows you to correct a wrongly adjusted Z probe offset or further refine it with the observations you make after the print has already started by making it possible to apply slight movements to the printhead on the Z-axis.

With this in mind, we can say that the opportune time to use the babystepping feature is when your 3D printer is printing the skirt or the first layer, as this will practically be your only chance to see whether a misconfigured Z probe offset is causing bed adhesion issues and quickly fix it without having to cancel your print and start over.

For the babystepping feature to be active for your 3D printer’s Z-axis, the firmware you’re using requires to have the BABYSTEPPING variable defined in the Configuration_adv.h file.

Unlocking babystepping for X and Y axes additionally requires BABYSTEP_XY to be defined in Configuration_adv.h.

marlin configuration babystepping explanation


To use the babystepping feature, all you will need to do is to start a print as usual, and provided that it’s active in the firmware configuration you’re using, the menus should present you with the option to move the Z-axis as the printing process is taking place, usually with an entry labeled Babystep Z (Z Babystepping) or Probe Z Offset (Babystep Z Probe Offset).

ender 3 v2 babystepping example


Alongside using the menus, you can also babystep using the M290 Zn G-code command, where n refers to the distance you would like the Z-axis to travel, such as M290 Z-0.1 moving the Z-axis down by 0.1 mm.

babystepping with m290 gcode in octoprint


When using the babystepping feature, one thing to be aware of is that its sole purpose is to make slight temporary adjustments, which makes it behave differently than moving the axes in a standard way in a couple of ways.

First, the changes to the positioning of the Z-axis you make through babystepping won’t affect the current Z-axis coordinates but instead cause the 3D printer to behave like the coordinate plane has shifted, similar to how offsets work.

Second, the movements made with babystepping don’t respect endstops, which makes it a good idea to be careful as to not crash the nozzle into the print bed while you’re performing adjustments.

Finally, while the adjustments you make through babystepping won’t be permanent and will only apply to the printing process you have made the adjustments for, having the BABYSTEP_ZPROBE_OFFSET variable enabled in Configuration_adv.h will change this behavior and modify your Z probe offset value according to the modifications you have made.

marlin config babystep z probe offset variable


To make the new Z probe offset value you have obtained through babystepping permanent, you will still need to save the settings to the EEPROM with the M500 G-code command or the LCD controller.

Conclusion

Now that you know how to set the Z probe offset value correctly for your BLTouch / CR Touch, you can fully enjoy the convenience and reliability that an automatic bed leveling sensor brings to your prints and completely forget about the days when you had to level the bed manually before each print.

While finding the sweet spot where the Z probe offset is perfect can take an attempt or two, you can always utilize the babystepping feature to quickly correct a slight imperfection without having to cancel the print and save the changes to your 3D printer’s configuration once the print is done.