Bed level not representative of real life

Basic Information:

Printer Model: modified Ender 3
MCU / Printerboard: Creality 4.2.7
Host / SBC Raspberry Pi 4B
klippy.log

Fill out above information and in all cases attach your klippy.log file (use zip to compress it, if too big). Pasting your printer.cfg is not needed
Be sure to check our “Knowledge Base” Category first. Most relevant items, e.g. error messages, are covered there

Describe your issue:

Hi, this is my first post here. My Ender 3’s ABL mesh is -.5mm on the far right side compared to the rest, even though I leveled the bed using BED_SCREWS_ADJUST

Let me guess. Your probe is mounted on the left side of your carriage?

And please attach the klippy.log as it was requested.

Exactly, is that a problem?

Will do as soon as possible

In case this is useful, I have a Sprite Extruder Pro kit and CR-Touch.

klippy.log.txt (118.4 KB)

Not a problem exactly, but it’s why you’re seeing this behavior. My probe is mounted on the right side of my carriage and I’ve had issues with the left side of my bed rolling off like this. The problem is that the probe can’t reach that edge so when the bed mesh points are used to interpolate the shape of the bed surface, there’s a gap between the right edge of the probe area and the right edge of the physical bed. As you can see in your height map, for whatever reason, your probe is reporting that every single point is above 0, except possibly the probe points on the right edge. The mesh algorithm sees this and assumes that the shape of the bed must exhibit the same degree of slope all the way to edge.

One way I reduced this effect on my machine was to use the probe for homing and to use the same point for both homing and Z=0. That tends to reduce the phenomenon of the mesh essentially being used to set the Z offset as well, which results in these weird extrapolation issues.

1 Like

So what are you saying I should do? Should I change anything in the config file? Should I print a zero x-offset mount for CR Touch?

Its not interpolation, the right literally probes lower.

FWIW, Bed Mesh does not extrapolate points outside of the probed area. Everything outside of the mesh is clamped to the nearest value in the mesh.

That said, when using bicubic interpolation, it does extrapolate values outside of the mesh for the purpose of determining the slope of interpolated values in the final segment. That can impact the very edge of the mesh by introducing too much curvature. The impact can be mitigated by adjusting the bicubic_tension option, a value of .5 should flatten the curve.

As the OP stated, his issue is with actual probed values on the right being much lower than the rest of the bed. It looks like the NotSedna is experiencing Probe Location Bias. It is possible that there is a twist in the X axis that is throwing off the probed values.

Where do I find bicubic tension? I can’t find it

Also now on the 2nd-8th layer the gantry doesnt go up, is there a solution for this

[bed_mesh]
#speed: 50
#   The speed (in mm/s) of non-probing moves during the calibration.
#   The default is 50.
#horizontal_move_z: 5
#   The height (in mm) that the head should be commanded to move to
#   just prior to starting a probe operation. The default is 5.
#mesh_radius:
#   Defines the radius of the mesh to probe for round beds. Note that
#   the radius is relative to the coordinate specified by the
#   mesh_origin option. This parameter must be provided for round beds
#   and omitted for rectangular beds.
#mesh_origin:
#   Defines the center X, Y coordinate of the mesh for round beds. This
#   coordinate is relative to the probe's location. It may be useful
#   to adjust the mesh_origin in an effort to maximize the size of the
#   mesh radius. Default is 0, 0. This parameter must be omitted for
#   rectangular beds.
#mesh_min:
#   Defines the minimum X, Y coordinate of the mesh for rectangular
#   beds. This coordinate is relative to the probe's location. This
#   will be the first point probed, nearest to the origin. This
#   parameter must be provided for rectangular beds.
#mesh_max:
#   Defines the maximum X, Y coordinate of the mesh for rectangular
#   beds. Adheres to the same principle as mesh_min, however this will
#   be the furthest point probed from the bed's origin. This parameter
#   must be provided for rectangular beds.
#probe_count: 3, 3
#   For rectangular beds, this is a comma separate pair of integer
#   values X, Y defining the number of points to probe along each
#   axis. A single value is also valid, in which case that value will
#   be applied to both axes. Default is 3, 3.
#round_probe_count: 5
#   For round beds, this integer value defines the maximum number of
#   points to probe along each axis. This value must be an odd number.
#   Default is 5.
#fade_start: 1.0
#   The gcode z position in which to start phasing out z-adjustment
#   when fade is enabled. Default is 1.0.
#fade_end: 0.0
#   The gcode z position in which phasing out completes. When set to a
#   value below fade_start, fade is disabled. It should be noted that
#   fade may add unwanted scaling along the z-axis of a print. If a
#   user wishes to enable fade, a value of 10.0 is recommended.
#   Default is 0.0, which disables fade.
#fade_target:
#   The z position in which fade should converge. When this value is
#   set to a non-zero value it must be within the range of z-values in
#   the mesh. Users that wish to converge to the z homing position
#   should set this to 0. Default is the average z value of the mesh.
#split_delta_z: .025
#   The amount of Z difference (in mm) along a move that will trigger
#   a split. Default is .025.
#move_check_distance: 5.0
#   The distance (in mm) along a move to check for split_delta_z.
#   This is also the minimum length that a move can be split. Default
#   is 5.0.
#mesh_pps: 2, 2
#   A comma separated pair of integers X, Y defining the number of
#   points per segment to interpolate in the mesh along each axis. A
#   "segment" can be defined as the space between each probed point.
#   The user may enter a single value which will be applied to both
#   axes. Default is 2, 2.
#algorithm: lagrange
#   The interpolation algorithm to use. May be either "lagrange" or
#   "bicubic". This option will not affect 3x3 grids, which are forced
#   to use lagrange sampling. Default is lagrange.
#bicubic_tension: .2                                 # <==================
#   When using the bicubic algorithm the tension parameter above may
#   be applied to change the amount of slope interpolated. Larger
#   numbers will increase the amount of slope, which results in more
#   curvature in the mesh. Default is .2.
#zero_reference_position:
#   An optional X,Y coordinate that specifies the location on the bed
#   where Z = 0.  When this option is specified the mesh will be offset
#   so that zero Z adjustment occurs at this location.  The default is
#   no zero reference.
#faulty_region_1_min:
#faulty_region_1_max:
#   Optional points that define a faulty region.  See docs/Bed_Mesh.md
#   for details on faulty regions.  Up to 99 faulty regions may be added.
#   By default no faulty regions are set.
#adaptive_margin:
#   An optional margin (in mm) to be added around the bed area used by
#   the defined print objects when generating an adaptive mesh.
#scan_overshoot:
#  The maximum amount of travel (in mm) available outside of the mesh.
#  For rectangular beds this applies to travel on the X axis, and for round beds
#  it applies to the entire radius.  The tool must be able to travel the amount
#  specified outside of the mesh.  This value is used to optimize the travel
#  path when performing a "rapid scan".  The minimum value that may be specified
#  is 1.  The default is no overshoot.

Also this: Bed Mesh - Klipper documentation

Please attach an actual klippy.log to your next post.

Thanks for correcting me @Arksine. It had been a little while since I wrestled with this issue and I misremembered the details.

1 Like

I loosened all the screws (to originally put a better spring on the rear left), releveled, did a BED_MESH_CALIBRATE, and it ended up looking much better.

1 Like

Also releveled X gantry to the frame.

TL;DR: Check your X gantry.

well it broke itself