I installed a BLTouch bed leveling probe on my printer which uses Marlin

Now the printer seems to be of two minds when it comes to finding the origin. Homing XY moves to the lower left as it always has, but homing Z moves not only to Z=0, but also to the center of the build plate. The printer knows this is (100,100,0) and is not mistakenly thinking it is (0,0,0).

This causes some issues such as now the nozzle wipe at the beginning of a print happens right in the center of where the print is supposed to be.

Is this expected behavior?

  • $\begingroup$ what did you do besides mounting the bed leveling sensor? Which distribution of marlin did you install? Which slicer do you use? Did you hook "Origin is in center"? $\endgroup$
    – Trish
    Jun 14, 2020 at 16:56
  • $\begingroup$ I'm not sure what distribution you're referring to, I built it myself from source. I do not have BED_CENTER_AT_0_0 enabled. I mounted and wired up the sensor but have not calibrated the Z offset yet. $\endgroup$
    – rgov
    Jun 14, 2020 at 17:36

2 Answers 2


This is a consequence of enabling Z_SAFE_HOMING:

Z Safe Homing prevents Z from homing when the probe (or nozzle) is outside bed area by moving to a defined XY point (by default, the middle of the bed) before Z Homing when homing all axes with G28. As a side-effect, X and Y homing are required before Z homing. If stepper drivers time out, X and Y homing will be required again.

Enable this option if a probe (not an endstop) is being used for Z homing. Z Safe Homing isn’t needed if a Z endstop is used for homing, but it may also be enabled just to have XY always move to some custom position after homing.

My default Cura start G-code contained this sequence:

G28 X0 Y0 ;move X/Y to min endstops
G28 Z0 ;move Z to min endstops

I changed this to

G28 ;safe homing
G90 ;absolute positioning
G0 X0 Y0 ; move to bottom-left corner for nozzle wipe

However any oozing will still happen at the center of the build plate, which is a problem.

  • 1
    $\begingroup$ Note that G28 X0 Y0 and G28 Z0 are incorrect instructions, from the wiki: The X, Y, and Z parameters act only as flags. Any coordinates given are ignored. For example, G28 Z10 results in the same behavior as G28 Z. $\endgroup$
    – 0scar
    Jun 14, 2020 at 22:22
  • $\begingroup$ you should possibly retract the filament before probing Z to prevent oozing $\endgroup$
    – Trish
    Jun 15, 2020 at 6:29

I had the same problem, solved it by inserting

// Move X and Y to 0 after homing
process_subcommands_now_P("G1 X0 Y0 F5000");

at the end of G28.cpp, just before ui.refresh();

This moves the print head to X0, Y0 and leaves Z untouched after the homing procedure. This way any oozing that might happen while the extruder heats up will be outside of the bed.

  • $\begingroup$ Hi and welcome to SE.3DP. Could you expand upon your answer a little, by explaining what the additional code does and why it solves the issue? $\endgroup$
    – Greenonline
    Jan 1, 2021 at 4:33
  • $\begingroup$ This is pretty cumbersome, while adding G1 X0 Y0 after G28 or G29 would do exactly the same (in your start G-code script), but it doesn't require any firmware changes. It is Z_SAFE_HOMING causing Z to home in the middle of the bed (as instructed by the configuration file) for safety so that the probe hits the bed surface at any time. $\endgroup$
    – 0scar
    Jan 3, 2021 at 17:45

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .