A probe is a switch (much like an Endstop) used to find where something is located automatically.
Smoothie will use it to move until the probe is “triggered” and stop there.
It can be used on CNC mills to:
It can be used on 3D printers to:
Different strategies are useful for different geometries of machines, click on one to go to it:
NOTE When G30 stores the probe position or prints out the value, it is in actuator units not necessarily in mm. This is only an issue for rotary deltas where the actuator units are degrees not mm. Most other configurations it will be mm.
Making the probe retractable allows the probe not to be in the way of the plastic when it is not used.
You will need a probe switch attached to the machine’s actuator, or a bed able to trigger an end stop input when the hotend touches it. A point detection is best as the actual position is important for probing. (proximity probes are suboptimal as they do not detect the point position).
A bit more: You have two choices:
The point is you configure your sensor as either a probe or an endstop, not both. You can still use it for both leveling/calibration and bed seeking, it’s just that if it’s a probe (and not an endstop), you use a different Gcode (G30) than if it were an endstop (G28).
When setting up endstops and probes for your CNC machine or 3D printer, choosing the right sensor type is crucial for reliable operation.
Here is a table of the common sensor types, with their pros, cons, and our advice:
Type | Uses | Pros | Cons | Our rating | Advice |
---|---|---|---|---|---|
Mechanical switch | Endstops, retractable Z-probes | Cheap, very durable, very precise/repeatable | None | This is the simplest, and also by chance the best sensor. Don’t use anything else unless you have a very good reason to. Just getting a fancier sensor because it feels cool to do so, is most likely going to bite you in the back quickly. | |
Optical switch | Endstops, retractable Z-probes | Cheap, durable, very precise/repeatable | Dust can block light path after some time | This can be used in place of mechanical switches in most situations, has similar advantages, and doesn’t produce any sound. | |
Hall effect | Endstops, bed probe | Fairly cheap, non-contact, variable precision/repeatability | Requires magnets, which accumulates ambient metal dust, can lack repeatability | A fair non-contact option if contact is an issue in your setup. | |
Inductive | Endstops, bed probe | Non-contact | Expensive, difficult to wire, substandard repeatability, 24-36V requirement, endstop input protection (voltage divider) required | You probably shouldn’t use these unless you have a very good reason. | |
Capacitive | Endstops, bed probe | Non-contact, can be used with glass bed | Expensive, difficult to wire, substandard repeatability, 24-36V requirement, endstop input protection (voltage divider) required | You probably shouldn’t use these unless you have a very good reason. | |
Force sensitive resistor (FSR) | Bed probe | Can be used under a glass bed, non-contact, can be very reliable if set up correctly | Difficult to set up correctly, finicky, expensive, analog meaning it requires an adapter, more complex to wire | You probably shouldn’t use these unless you have a very good reason. | |
IR probes | Z probe, bed probe | Non-contact | Expensive, analog meaning it requires an adapter, terrible repeatability/accuracy, more complex to wire | You probably shouldn’t use these unless you have a very good reason. | |
Bltouch | Retractable Z-probes | Cheap, very durable, very precise/repeatable, retractable (equivalent to a servo-mounted mechanical switch) | None, other than the added complexity of retracting | The mechanical switches are the best sensors by far, but this is very similar, essentially emulating a servo-mounted mechanical switch. |
The Reprap probe page also has information on this that you might find helpful.
Add the following to the config file:
gamma_min_endstop nc # normally 1.28. Change to nc to prevent conflict, not needed on Azteeg X5
zprobe.enable true # set to true to enable a zprobe
zprobe.probe_pin 1.28!^ # pin probe is attached to if NC remove the !, Azteeg X5 this is 1.29
zprobe.slow_feedrate 5 # mm/sec probe feed rate
#zprobe.debounce_ms 1 # set if noisy
zprobe.fast_feedrate 100 # move feedrate
zprobe.probe_height 5 # how much above bed to start probe NB only needed for G32 on delta
zprobe.return_feedrate 0 # feedrate after a probe, default 0 is double of slow_feedrate (mm/s)
zprobe.max_z 200 # maximum default travel for the probe command, will use gamma_max if not defined
slow_feedrate
is the speed the probe moves down to find the bed, it returns (probe up) at 2 * slow_feedrate
or return_feedrate
.
fast_feedrate
is only used for any XY moves done during probing.
First test the zprobe with M119
, make sure that the probe is 1 when triggered and 0 when not triggered.
G30
will probe from the current position until it hits the bed and the probe triggers, it will report the distance traveled then return to where it started.
G30 Znnn
will probe until it hits the bed then sets Z to nnn (by doing G92 Znnn), this can be used to set the nozzle height if nnn is the probes Z offset from the nozzle in the Z direction.
G30 Fxxx
will run the probe at xxx mm/min overriding the slow_feedrate.
G38.2
, G38.3
, G38.4
, G38.5
(for probing in X and Y) are also implemented as documented here NOTE probing in X or Y on a delta is not recommended due to non-linear movement issues.
If there are multiple leveling strategies selected the Pn
parameter will select which one to send leveling codes to, 0 being the first defined one, 1 the second and so on. eg G29 P1
will send G29 to the second defined leveling strategy.
There are several M670 parameters that can set different settings for zprobe overriding the config settings, these are all saved with M500
M670 S0.50 K2.00 R2.5 |
Set Probe feedrates slow/fast/return (mm/sec) |
M670 Z200.00 |
Set Probe max_z (mm) |
M670 H2.00 |
Set Probe height (mm) |
M670 I1 |
Temporarily invert the sense of the probe pin (Not saved with M500) |
leveling-strategy.xxx.enable
is set to true
this enables one of the bed leveling strategies described below.
NOTE that most leveling strategies cannot be run from a web interface. If using network, use telnet to run them, or use the USB serial port.
| Option | Example value | Explanation | | — | — | — |
The Z-probe module in Smoothieware is used to scan surfaces, calibrate machine parameters, and compensate for non-planar surfaces.
This is essential for features like bed leveling, height mapping, and automated calibration.
The following table lists the configuration options for the Z-probe module:
Option | Value | Description |
---|---|---|
zprobe.enable |
true |
Set to true to enable the Z-probe module. This is used to scan surfaces, and to calibrate parameters and compensate for non-planar surfaces. |
zprobe.probe_pin |
1.28!^ |
Pin the probe is connected to. |
zprobe.slow_feedrate |
5 |
Speed in millimetres/second at which the probe seeks a surface. |
zprobe.fast_feedrate |
100 |
Speed in millimetres/second at which the probe does fast moves. |
zprobe.return_feedrate |
50 |
Speed in millimetres/second at which the probe does the return after a probe. |
zprobe.debounce_ms |
1 |
Debounce the probe pin over this number of milliseconds. Set to 1 or 2 if your probe is too noisy and gives false readings. |
zprobe.probe_height |
5 |
Distance above the bed at which the probing is started, once the bed’s height is known. |
zprobe.max_z |
200 |
Maximum Z (was gamma_max) |
zprobe.dwell_before_probing |
0.2 |
Dwell time in seconds before probing. Useful for piezo Z-probe to avoid false trigger. |
The Z-probe module uses different speeds for different operations:
Using a slower speed for the actual probing ensures more accurate measurements.
The probe_pin
setting uses special suffixes:
!
- Inverts the pin logic (useful for normally-open vs normally-closed switches)^
- Enables internal pull-up resistorFor example, 1.28!^
means pin 1.28 with inverted logic and pull-up enabled.
Different probe types work with Smoothieware:
dwell_before_probing
settingAfter configuration, use these G-codes:
Make sure the config has delta_homing
true set and that zprobe.max_z
is set to about 20-30mm shorter than the distance to the bed, otherwise it will crash into the bed at high speed.
Also in the config set:
leveling-strategy.delta-calibration.enable true # basic delta calibration
leveling-strategy.delta-calibration.radius 100 # the probe radius
leveling-strategy.delta-calibration.initial_height 10 # height above bed to stop initial move
#the initial height above the bed we stop the initial move down after home to find the bed
#this should be a height that is enough that the probe will not hit the bed and is an offset from zprobe.max_z (can be set to 0 if zprobe.max_z takes into account the probe offset)
leveling-strategy.delta-calibration.radius
should optimally be set such that the probe points are on the circumference of a circle that is equidistant from the center of the bed to the towers.Issuing the G32
command will run the full calibration sequence automatically.
It will cycle several times to converge on a good result.
If the result is good use M500
to save the M666
settings.
What will happen is it will home the probe down to find the bed, then home again then move down to 5mm above the bed (or whatever you set zprobe.probe_height
to).
Then it will probe the three towers at the specified leveling-strategy.delta-calibration.radius
from the center, and will print out the results, it will set the endstop trims and home, this will repeat 3-4 times, each time the difference between the three probes should get smaller, once it has completed 4 probes or the difference is under 0.03mm it will home one last time then probe the three points to confirm the calibration, then probe the center.
It will also adjust the delta radius (M665 Rnnn
) to get the center the same height as the outside points.
| Option | Example value | Explanation | | — | — | — |
The delta calibration leveling strategy is specifically designed for linear delta machines.
It uses a Z-probe to automatically determine the bed plane’s tilt and the arm’s radius.
This provides precise calibration for delta kinematics.
The following table outlines the configuration options for the delta calibration leveling strategy:
Option | Value | Description |
---|---|---|
leveling-strategy.delta-calibration.enable |
true |
Set to true to enable the delta calibration leveling strategy. This uses the probe to determine the plane’s tilt and arm’s radius in a delta machine. |
leveling-strategy.delta-calibration.radius |
100 |
Radius at which to probe the three points. |
leveling-strategy.delta-calibration.initial_height |
10 |
The initial height above the bed where we stop the initial move down after home to find the bed. This should be a height that is enough that the probe will not hit the bed and is the absolute Z position. |
To activate this leveling strategy, copy/paste the following to your configuration file and edit it accordingly:
leveling-strategy.delta-calibration.enable true # Set to true to enable the delta calibration leveling strategy.
# This uses the probe to figure out the plane's tilt and arm's radius
# in a delta machine
leveling-strategy.delta-calibration.radius 100 # Radius at which to probe the three points
leveling-strategy.delta-calibration.initial_height 10 # The initial height above the bed we stop the initial move down after home
# to find the bed. This should be a height that is enough that the probe
# will not hit the bed
These are the different ways to use the calibration routine:
G29 |
will probe the seven points on your bed, you can use this to see how well the bed is leveled. |
G29.1 |
will probe the seven points on your bed, and output the data that can be fed into some offline least errors scripts to adjust tower offsets |
G32 |
Does the full calibration sequence, endstop and delta radius |
G32 R0 |
Will only do delta radius calibration |
G32 E0 |
Will only do endstop calibration |
G32 I0.02 |
Will set the target to within 0.02mm |
G32 K0 |
Will keep the current endstop trim settings and check them, without K the trims are cleared to zero and a full calibration is performed |
G32 J110.0 |
will set the probe radius to 110.0 mm for this session |
M500 |
saves the probe points |
M503 |
displays the current settings |
Example use:
G28 (Home XYZ)
(Move Z at least 30mm away from the bed if it's not, and attach probe if you have a removable probe)
G32 (Calibrate the machine)
(Remove probe if you have a removable probe)
M500 (to save probe results)
G28 (Home XYZ)
(Manually: jog down to touch the plate)
M306 Z0
M500 (to save homing offset)
G28
(Machine is now calibrated and knows its correct height above the bed)
Calibration failed to complete
error, or the probe crashes into the bed on the initial probe, it usually means you need to increase the leveling-strategy.delta-calibration.initial_height
config setting to a bigger value, try 10 or 20 or bigger.See http://minow.blogspot.com/ for more details of calibrating a delta.
Nothing is perfect
Probes delta_grid.size points in X and Y (total probes size * size) and stores the relative offsets from the 0,0 Z height. When enabled every move will calculate the Z offset based on interpolating the height offset within the grids nearest 4 points.
Should be used in conjunction with the delta calibration strategy above.
First calibrate with G32 then if needed do G31 to set the grid compensation. If you want to save the grid, do M374.
delta-grid.radius
specified should be at least as big as the largest X,Y position likely to be moved to.G31
is the probe command on this not G32
.
The strategy must be enabled in the config as well as zprobe.
leveling-strategy.delta-grid.enable true
The radius of the bed must be specified with…
leveling-strategy.delta-grid.radius 50
This needs to be at least as big as the maximum printing radius as moves outside of this will not be compensated for correctly
The size of the grid can be set with…
leveling-strategy.delta-grid.size 7
This is the X and Y size of the grid, it must be an odd number, the default is 7 which is 49 probe points
leveling-strategy.delta-grid.do_home true
This must be set on a Delta printer (although it should default to true).
If you are not using all 3 endstops (or prefer to home manually before G32):
leveling-strategy.delta-grid.do_home false
do_home
is set to false
.
Optionally probe offsets from the nozzle or tool head can be defined with…
leveling-strategy.delta-grid.probe_offsets 0,0,0 # probe offsets x,y,z (Z should always be 0)
They may also be set with M565 X0 Y0 Z0.
If the saved grid is to be loaded on boot then this must be set in the config…
leveling-strategy.delta-grid.save true
Then when M500 is issued it will save M375 which will cause the grid to be loaded on boot. The default is to not autoload the grid on boot.
Optionally an initial_height can be set that tell the initial probe where to stop the fast descent before it probes, this should be around 5-10mm above the bed
leveling-strategy.delta-grid.initial_height 10
| Option | Example value | Explanation | | — | — | — |
The Delta Grid leveling strategy provides automatic bed leveling for delta-style 3D printers by probing multiple points across the print surface.
The following are the configuration options for the Delta Grid leveling strategy:
Option | Value | Description |
---|---|---|
leveling-strategy.delta-grid.enable |
true |
The strategy must be enabled in the config, as well as the zprobe module. |
leveling-strategy.delta-grid.size |
7 |
The size of the grid, for example, 7 causes a 7x7 grid with 49 points. Must be an odd number. |
leveling-strategy.delta-grid.probe_offsets |
0,0,0 |
Optional probe offsets from the nozzle or tool head. NOTE: Z must be 0 |
leveling-strategy.delta-grid.save |
false |
If the saved grid is to be loaded on boot then this must be set to true. |
leveling-strategy.delta-grid.initial_height |
10 |
Optionally, an initial_height can be set that tells the initial probe where to stop the fast descent before it probes. This should be around 5-10mm above the bed. |
To activate this leveling strategy, copy/paste the following to your configuration file and edit it accordingly:
leveling-strategy.delta-grid.enable true # The strategy must be enabled in the config, as well as the zprobe module.
leveling-strategy.delta-grid.radius 50 # Radius of the bed, must be specified. This needs to be at least as big as
# the maximum printing radius as moves outside of this will not
# be compensated for correctly
leveling-strategy.delta-grid.size 7 # The size of the grid, for example, 7 causes a 7x7 grid with 49 points.
# Must be an odd number.
leveling-strategy.delta-grid.probe_offsets 0,0,0 # Optional probe offsets from the nozzle or tool head
leveling-strategy.delta-grid.save false # If the saved grid is to be loaded on boot then this must be set to true
leveling-strategy.delta-grid.initial_height 10 # Optionally an initial_height can be set that tell the initial probe
# where to stop the fast descent before it probes, this should be
# around 5-10mm above the bed
G29 |
test probes in a grid pattern within the radius producing a map of offsets, this can be imported into a graphing program to visualize the bed ( |