Disclaimer: This is an independent resource site. Not affiliated with the Voron project or its development team.

Klipper Adaptive Bed Mesh for Voron — Exclude Objects and Smart Probing

Klipper Calibration Firmware

A flat bed is the foundation of a successful first layer, and on a Voron that means using Klipper's bed mesh compensation. But running a full bed mesh before every print takes time and can sometimes probe points that fall off the bed or hit already-printed parts. Klipper's adaptive bed mesh features — ADAPTIVE probing, mesh_min/mesh_radius, exclude_object, and bed mesh profiles — solve these problems. This guide covers how to configure and use each one on your Voron. Last updated: May 2025.

Why Adaptive Bed Mesh?

A standard BED_MESH_CALIBRATION probes the entire build plate regardless of where your part actually sits. On a 350mm Voron V2.4, a 7x7 grid means 49 probe points. Do that before every print and you add 90 seconds to each job — time that adds up fast.

Adaptive bed mesh solves this by probing only the area your object occupies. The benefits:

ADAPTIVE=1 Probing

The simplest way to enable adaptive probing is by passing ADAPTIVE=1 to BED_MESH_CALIBRATION. Klipper automatically calculates the bounding box of all objects in your G-code file and probes only that region.

In your PRINT_START macro:


[gcode_macro PRINT_START]
gcode:
    # Heat the bed and nozzle
    M140 S{params.BED|default(100)}
    M104 S{params.EXTRUDER|default(250)}
    M190 S{params.BED|default(100)}
    G28
    BED_MESH_CALIBRATION ADAPTIVE=1
    M109 S{params.EXTRUDER|default(250)}
    # Continue with print
    

When ADAPTIVE=1 is set, Klipper reads the G-code file loaded via virtual_sdcard, finds all G1 moves, and computes a bounding box that covers every object. It then probes a mesh over that bounding box with the probe_count scaled proportionally.

Important: ADAPTIVE=1 only works when printing from virtual_sdcard (the standard SD card mode in Fluidd/Mainsail). It does not work with direct serial G-code streaming.

Mesh Min and Mesh Radius

If you prefer manual control over the probed area, use mesh_min and mesh_radius (or mesh_min and mesh_max) parameters:


BED_MESH_CALIBRATION mesh_min=100,100 mesh_max=250,250 probe_count=5,5
    

Or with a circular radius centered on the nozzle:


BED_MESH_CALIBRATION mesh_radius=100 mesh_origin=175,175
    

mesh_radius is particularly useful for delta and SCARA printers, but on a Voron Cartesian system, mesh_min/mesh_max gives you more intuitive rectangular regions.

Exclude Objects Integration

The [exclude_object] module in Klipper is closely related to adaptive meshing. When enabled, Klipper tracks individual objects on the build plate and lets you cancel or skip specific parts without stopping the whole print. The adaptive mesh system uses the same object data to know where to probe.

Add this to your printer.cfg:


[exclude_object]
    

That's it. Once enabled, any G-code that contains EXCLUDE_OBJECT_START and EXCLUDE_OBJECT_END markers will be tracked by Klipper. The EXCLUDE_OBJECT commands you can use during a print:

OrcaSlicer Setup for Exclude Objects

OrcaSlicer has built-in support for exclude object markers. In the "Others" tab of your print settings, enable "Label object" and "Exclude object" under the "Output options" section. This tells OrcaSlicer to insert EXCLUDE_OBJECT_START/END markers in the generated G-code.

Once enabled, you can click individual objects in Fluidd or Mainsail's web interface and choose "Exclude Object" to cancel just that part while the rest of the print continues.

SuperSlicer and PrusaSlicer support similar features. In SuperSlicer, enable "Complete individual objects" and the "Label objects" option under Output options.

Bed Mesh Profiles for Different Print Sizes

Another smart probing strategy is defining multiple bed mesh profiles and selecting the right one based on your print size. This is especially useful for Voron builds where you might print tiny V0 parts one day and full-sized 350mm panels the next.

Define profiles in your printer.cfg:


[bed_mesh]
speed: 120
horizontal_move_z: 5
mesh_min: 35, 35
mesh_max: 315, 315
probe_count: 7, 7
fade_start: 1.0
fade_end: 10.0
fade_target: 0

# Small part profile (center only)
# Use: BED_MESH_CALIBRATION mesh_min=130,130 mesh_max=220,220 probe_count=3,3

# Medium part profile
# Use: BED_MESH_CALIBRATION mesh_min=80,80 mesh_max=270,270 probe_count=5,5

# Full bed profile (default)
# Use: BED_MESH_CALIBRATION
    

In your PRINT_START macro, you can determine the print size from the G-code file and select the appropriate profile:


[gcode_macro PRINT_START]
gcode:
    {% set BED_TEMP = params.BED|default(100) %}
    {% set EXTRUDER_TEMP = params.EXTRUDER|default(250) %}
    
    M140 S{BED_TEMP}
    M104 S{EXTRUDER_TEMP}
    
    G28
    G29  # Probe bed screws
    
    # Use adaptive mesh by default
    BED_MESH_CALIBRATION ADAPTIVE=1
    
    # Fall back to standard mesh if adaptive fails
    # (e.g., printing from direct serial)
    M109 S{EXTRUDER_TEMP}
    

Troubleshooting Adaptive Mesh

Probes Out of Bounds

If you see "Probe points out of bounds" errors during adaptive probing, Klipper is trying to probe outside the physical limits defined in your stepper configuration. This usually happens when:

Solution: Reduce the probe_count parameter or increase position_max in your stepper config. For a Voron V2.4 350mm with standard kinematics:


[stepper_x]
position_min: -5
position_max: 355
    

Exclude Object Not Working

If EXCLUDE_OBJECT commands fail silently, check these common issues:

Adaptive Mesh Produces a Bad First Layer

If your first layer is inconsistent with adaptive mesh enabled, try increasing the probe_count or disabling fade entirely. Adaptive meshes use fewer points by default, which can miss surface irregularities:


BED_MESH_CALIBRATION ADAPTIVE=1 PROBE_COUNT=5,5
    

You can pass PROBE_COUNT alongside ADAPTIVE to override the automatic probe density calculation.

Combining Adaptive Mesh with Bed Screw Adjust

For best results, use Klipper's bed screw adjustment (or Z_TILT_ADJUST / QUAD_GANTRY_LEVEL on Vorons with multiple Z motors) before the mesh calibration. This ensures the bed is mechanically level first, then the mesh handles minor surface irregularities.


[gcode_macro PRINT_START]
gcode:
    {% set BED_TEMP = params.BED|default(100) %}
    {% set EXTRUDER_TEMP = params.EXTRUDER|default(250) %}
    
    M140 S{BED_TEMP}
    
    G28
    QUAD_GANTRY_LEVEL  # Or Z_TILT_ADJUST for Trident
    G28 Z
    
    BED_MESH_CALIBRATION ADAPTIVE=1
    
    M190 S{BED_TEMP}
    M109 S{EXTRUDER_TEMP}
    

Performance Comparison

Here's the real-world time difference on a Voron V2.4 350mm with a standard probe speed of 10mm/s:

Over a 10-hour print session with multiple parts, that's 10+ minutes saved — time that goes directly into printing.

Final Recommendations

For most Voron users, the best setup is:

  1. Enable [exclude_object] in printer.cfg
  2. Enable "Label object" in your slicer (OrcaSlicer, SuperSlicer, or PrusaSlicer)
  3. Use BED_MESH_CALIBRATION ADAPTIVE=1 in PRINT_START
  4. Run QUAD_GANTRY_LEVEL or Z_TILT_ADJUST before the mesh
  5. Keep a full 7x7 mesh profile available for when you need to probe the entire bed

Adaptive bed mesh is one of those features that seems minor until you use it — then you'll never go back to full-bed probing every print. Combined with exclude objects, it makes multi-part printing on your Voron faster, safer, and more reliable.

Need Parts?

China-direct sourcing for Voron-compatible probes, hotends, boards, and frame components — all tested and verified before shipping. Save 30-50% compared to Western vendors.

Shop Tested Components →