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:
- Fewer probe points: A part sitting in the center of a 350mm bed might only need a 3x3 or 4x4 grid over its footprint, reducing probe time by 60-80%
- Better first layer: By focusing probe density on the area that actually matters, you get a more accurate local mesh rather than averaging across the whole plate
- Fewer probe errors: Probing near the bed edges is risky — probes can miss the build plate or trigger on clips. Adaptive probing stays safely inside the print area
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:
EXCLUDE_OBJECT_START name=part1— marks the beginning of an objectEXCLUDE_OBJECT_END name=part1— marks the end of an objectEXCLUDE_OBJECT name=part1— cancels that specific object (remaining objects continue printing)EXCLUDE_OBJECT_DEFINE name=part1 center=150,150— pre-defines an object with its center position
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:
- The object bounding box pushes probe points too close to bed edges
- Your mesh_min/mesh_max exceed position_min/position_max on your stepper config
- Your probe is offset too far from the nozzle (large x_offset or y_offset)
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:
- The [exclude_object] module is not enabled in printer.cfg
- The G-code file doesn't contain EXCLUDE_OBJECT_START/END markers — re-slice with "Label object" enabled
- You're using an older Klipper version that doesn't support exclude objects (update to the latest)
- You're printing via direct serial stream instead of virtual_sdcard
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:
- Full 7x7 mesh: ~60-80 seconds, 49 points, covers entire 350x350mm plate
- Adaptive 4x4 mesh (small part): ~15-20 seconds, 16 points, covers 100x100mm print area
- Adaptive 5x5 mesh (medium part): ~25-35 seconds, 25 points, covers 200x200mm print area
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:
- Enable [exclude_object] in printer.cfg
- Enable "Label object" in your slicer (OrcaSlicer, SuperSlicer, or PrusaSlicer)
- Use BED_MESH_CALIBRATION ADAPTIVE=1 in PRINT_START
- Run QUAD_GANTRY_LEVEL or Z_TILT_ADJUST before the mesh
- 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.