Automatic bed leveling probes outside of bed despite NOZZLE_TO_PROBE_OFFSET I just changed the motherboard of my CR-10 mini printer to an SKR 1.4 and installed Marlin 2.0.x on it. Everything seems to work except for the automatic bed leveling. I’m using an EZABL probe.

The probe is mounted to the left and slightly in front of the nozzle. Therefore I have set the probe-nozzle offset in Marlin as:

#define NOZZLE_TO_PROBE_OFFSET { -45, -12, 0 }


When I run automatic bed leveling with G29 the nozzle moves to a position where the sensor is outside of the bed (but the nozzle is inside the bed). And then it crashes down into the bed with the nozzle because the Z endstop is never triggered.

To debug I used the DEBUG_LEVELING_FEATURE in Marlin and ran G29 from Pronterface. This is what I got:

SENDING:G29
  current_position= X140.00 Y90.00 Z5.00 : &gt;&gt;&gt; G29
Machine Type: Cartesian
Probe: FIX_MOUNTED_PROBE
Probe Offset X10.00 Y10.00 Z0.00 (Right-Back &amp; Same Z as Nozzle)
Auto Bed Leveling: BILINEAR (disabled)
  current_position= X140.00 Y90.00 Z5.00 : Probe::set_deployed
deploy: 1
Probe::move_z(5.00)
&gt;&gt;&gt; do_blocking_move_to X140.00 Y90.00 Z5.00
&lt;&lt;&lt; do_blocking_move_to
reset_bed_level
&gt;&gt;&gt; Probe::probe_at_point(30.00, 30.00, raise, 0, probe_relative)
  current_position= X140.00 Y90.00 Z5.00 :
&gt;&gt;&gt; do_blocking_move_to X20.00 Y20.00 Z5.00
&lt;&lt;&lt; do_blocking_move_to
  current_position= X20.00 Y20.00 Z5.00 : Probe::set_deployed
deploy: 1
  current_position= X20.00 Y20.00 Z5.00 : &gt;&gt;&gt; Probe::run_z_probe
  current_position= X20.00 Y20.00 Z5.00 : &gt;&gt;&gt; Probe::probe_down_to_z
&gt;&gt;&gt; do_blocking_move_to X20.00 Y20.00 Z-3.00
&lt;&lt;&lt; do_blocking_move_to
echo:busy: processing
  current_position= X20.00 Y20.00 Z-3.00 : sync_plan_position
  current_position= X20.00 Y20.00 Z-3.00 : &lt;&lt;&lt; Probe::probe_down_to_z
FAST Probe fail!
  current_position= X20.00 Y20.00 Z-3.00 : &lt;&lt;&lt; run_z_probe
  current_position= X20.00 Y20.00 Z-3.00 : Probe::set_deployed
deploy: 0
&gt;&gt;&gt; do_blocking_move_to X20.00 Y20.00 Z-3.00
&lt;&lt;&lt; do_blocking_move_to
Error:Probing Failed
[ERROR] Error:Probing Failed


What I don’t understand is why it says:

Probe Offset X10.00 Y10.00 Z0.00 (Right-Back &amp; Same Z as Nozzle)


Because that is not at all the NOZZLE_TO_PROBE_OFFSET I have defined. Is there another setting related to the nozzle/probe offset besides NOZZLE_TO_PROBE_OFFSET that I have missed? Or why does Marlin get the idea that my probe is to the right and back of the probe when in reality its to the front and left?
The problem is that, although you have set the offsets correctly, the boundary limits for the probe to "probe the area" have not been adjusted. It is my belief that this is a flaw in ABL of Marlin 2.0.x. If the user has set the probe offsets, the firmware already knows that the probe area is limited!

This answer on question "How to set Z-probe boundary limits in firmware when using automatic bed leveling?" describes in detail what the boundaries of the probe are for Marlin firmware 1.1.x and 2.0.x.

Basically, you need to set the boundaries of the probe using some extra definitions in your Configuration_adv.h file:


  constexpr int nozzle_to_probe_offset[] = NOZZLE_TO_PROBE_OFFSET;
  #define PROBE_X_OFFSET_FROM_EXTRUDER nozzle_to_probe_offset[0]
  #define PROBE_Y_OFFSET_FROM_EXTRUDER nozzle_to_probe_offset[1]


When including the MIN_PROBE_EDGE this means that the area is defined as:


  #define MIN_PROBE_EDGE_LEFT (MIN_PROBE_EDGE)
  #define MIN_PROBE_EDGE_RIGHT (MIN_PROBE_EDGE - PROBE_X_OFFSET_FROM_EXTRUDER)
  #define MIN_PROBE_EDGE_FRONT (MIN_PROBE_EDGE)
  #define MIN_PROBE_EDGE_BACK (MIN_PROBE_EDGE - PROBE_Y_OFFSET_FROM_EXTRUDER)


(Since the offsets are negative in your probe setup, we need to subtract the values in order to add up the absolute value to the edge...)