EDDY TAP Mode Debugging
This page covers the debugging process, inspection sequence, and common troubleshooting for EDDY in TAP mode. TAP mode determines the trigger threshold by lightly touching the nozzle to the bed. During debugging, pay attention to the nozzle, heated bed, and Z-axis motion status.
Before starting, completely turn off the printer and disconnect the power supply. Do not plug, unplug, or organize wiring harnesses or touch terminals while power is on.
- This page describes debugging methods and is not a complete
printer.cfgto copy directly. canbus_uuid,serial, probe pins, homing direction, Z-axis travel, and offsets must be modified according to actual hardware.- Before first use, ensure the status of EDDY, toolboard, mainboard, and Z-axis mechanical structure is normal.
Applicable Scope
- Uses EDDY / LDC1612 eddy current sensor, requiring
METHOD=tapor TAP threshold trigger method. - Applicable to toolboards with EDDY support such as FLY SHT36 V3, SB2040 V3.
- Basic EDDY wiring and standard height calibration completed, requiring further enabling or troubleshooting of TAP mode.
Version Requirements
- Using FLY FAST system: Ensure system version >=
V1.3.9. - Using other systems: Ensure Klipper is updated to the latest version.
- The toolboard or related secondary MCU firmware must also be updated to the latest, otherwise the host may support TAP commands while the MCU firmware does not respond.
Required Configuration
Using SHT36 V3 or SB2040 V3 as an example, [probe_eddy_current fly_eddy_probe] must include frequency: 40000000, otherwise EDDY may not function correctly.
[probe_eddy_current fly_eddy_probe]
sensor_type: ldc1612
# Modify i2c_mcu, i2c_bus, and offsets according to actual toolboard and installation position
i2c_mcu: SHT36
i2c_bus: i2c1e
i2c_speed: 400000
frequency: 40000000
x_offset: 0
y_offset: 21.42
descend_z: 2.5
tap_z_offset: 0
# Comment out before auto-calibrating TAP threshold; will be written by SAVE_CONFIG after successful calibration
# tap_threshold: 40000
After configuration, re-execute Drive Current Calibration and Height Calibration according to the corresponding product documentation.
Related Documents: SHT36 V3 EDDY Usage
Pre-Configuration Checks
Before checking EDDY wiring, toolboard interface, probe fixing screws, nozzle, and structures around the heated bed, completely turn off the printer and disconnect power. Do not plug/unplug wires or adjust terminals while power is on.
- Nozzle and bed surface are clean, free of filament residue, adhesive bumps, or debris.
- EDDY is securely fixed, and the coil installation position has no loosening.
- Z-axis can move up and down normally without jamming, hitting limits, or colliding with the frame.
- For multi-Z-axis machines, complete basic mechanical leveling first.
- Basic EDDY configuration is completed, and sensor data can be read normally.
Reference Configuration Snippet
This configuration keeps only the common EDDY TAP parts. mcu name, I2C bus, offsets, leveling method, and start macro parameters must be modified according to the actual machine. It is recommended to place this in a separate configuration file and include it via printer.cfg.
[respond]
[force_move]
enable_force_move: true
[probe_eddy_current fly_eddy_probe]
sensor_type: ldc1612
i2c_address: 42
i2c_mcu: SHT36
i2c_bus: i2c1e
i2c_speed: 400000
frequency: 40000000
x_offset: 0
y_offset: 21.42
descend_z: 2.5
speed: 5
samples: 3
sample_retract_dist: 5.0
samples_tolerance: 0.05
samples_tolerance_retries: 3
tap_z_offset: 0
# Comment out before auto-finding TAP threshold; will be written by SAVE_CONFIG after successful calibration
# tap_threshold: 40000
TAP Set Z Offset Macro
SET_Z_FROM_PROBE METHOD=tap updates the current Z coordinate after a TAP trigger. It is recommended to execute it several times consecutively and observe if the results are consistent. If there is significant variation, do not save; instead, check the nozzle, bed, Z-axis backlash, and TAP threshold.
[gcode_macro _RELOAD_Z_OFFSET_FROM_PROBE]
description: Refresh current Z coordinate based on the last PROBE result
gcode:
{% set Z = printer.toolhead.position.z %}
{% set position_endstop = 0 %}
{% set raw_config = printer.configfile.config %}
{% if 'stepper_z' in raw_config and 'position_endstop' in raw_config.stepper_z %}
{% set position_endstop = raw_config.stepper_z.position_endstop|trim|float %}
{% endif %}
{% set setZ = Z - printer.probe.last_probe_position.z + position_endstop %}
SET_KINEMATIC_POSITION Z={setZ}
RESPOND MSG="position_Z={'%0.3f' | format(Z)} probe_Z={'%0.3f' | format(printer.probe.last_probe_position.z)} position_endstop={'%0.3f' | format(position_endstop)} set_Z={'%0.3f' | format(setZ)}"
[gcode_macro SET_Z_FROM_PROBE]
description: TAP mode set Z offset, usage: SET_Z_FROM_PROBE METHOD=tap
gcode:
{% set METHOD = params.METHOD | default("automatic") %}
G0 Z5 F300
PROBE METHOD={METHOD} SAMPLES=3
_RELOAD_Z_OFFSET_FROM_PROBE
G0 Z5 F300
If using this macro to save and reuse position_endstop, ensure the configuration contains a savable stepper_z position_endstop value. During initial debugging, it can be set to 0, then confirm the actual value through manual Z offset and first layer testing.
Print Start Macro Call
In the start macro, simply call TAP to set the Z offset after heating, homing, and any necessary leveling is complete. The nozzle can be kept at a lower temperature before reaching printing temperature to avoid oozing affecting the TAP.
[gcode_macro PRINT_START]
gcode:
{% set BED = params.BED|default(60)|int %}
{% set EXTRUDER = params.EXTRUDER|default(200)|int %}
{% set X_CENTER = printer.toolhead.axis_maximum.x|float / 2 %}
{% set Y_CENTER = printer.toolhead.axis_maximum.y|float / 2 %}
SET_GCODE_OFFSET Z=0
G21
G90
G28
G1 X{X_CENTER} Y{Y_CENTER} Z15 F9000
M190 S{BED}
M109 S150
# Keep your original pre-print preparation process here
# ...
# If you have a nozzle wipe macro, consider cleaning the nozzle before TAP
# CLEAN_NOZZLE
SET_Z_FROM_PROBE METHOD=tap
# Continue with original print preparation process after TAP
M109 S{EXTRUDER}
G92 E0
If the nozzle tends to ooze, perform a nozzle wipe before and after SET_Z_FROM_PROBE METHOD=tap, and repeat SET_Z_FROM_PROBE METHOD=tap once to improve stability.
Auto-Calibrate TAP Threshold
Klipper supports automatic measurement of the TAP threshold after 2026-05-02. Before using it, first comment out the manually filled tap_threshold, then use the following commands to re-find the threshold.
TAP threshold calibration command: PROBE_EDDY_CURRENT_TAP_CALIBRATE TAP=xxx, common values are guess, refine, verify.
The following steps will cause the nozzle to move towards and lightly touch the bed. Before starting, ensure you can execute an emergency stop (M112) at any time. If the nozzle continues descending after contacting the bed, immediately emergency stop.
① guess: Initial Rough Threshold
Ensure the nozzle and bed are clean. After homing, move the toolhead near the center of the bed, with the nozzle 3~10mm above the bed.
PROBE_EDDY_CURRENT_TAP_CALIBRATE TAP=guess
This command analyzes data from the main probe calibration to obtain an initial rough tap_threshold value, then performs a tap probe. Ideally, the probe descends, the nozzle contacts the bed, retracts, and reports a valid detection result.
② refine: Refine Threshold
After TAP=guess succeeds, keep the nozzle near the bed center at 3~10mm and execute:
PROBE_EDDY_CURRENT_TAP_CALIBRATE TAP=refine
This command uses data from the previous successful probe to determine a more precise threshold.
③ verify: Verify Stability
After TAP=refine succeeds, execute:
PROBE_EDDY_CURRENT_TAP_CALIBRATE TAP=verify
This command probes the bed five times consecutively. Passing requires all five probes to complete normally with stable results.
④ Save Configuration
After all steps above succeed, execute:
SAVE_CONFIG
Save and restart Klipper. This only saves the TAP threshold. Z offset confirmation must still be completed.
Manual Threshold Finding
If the auto-calibration reports an unsuitable threshold, or if there are issues like premature triggering or failure to stop after contacting the bed, do not keep repeatedly executing the automatic commands. Instead, use PROBE_ACCURACY to find the threshold manually:
PROBE_ACCURACY METHOD=tap tap_threshold=40000
When adjusting manually, start testing around 40000:
- Triggers without contacting bed → Threshold too low, increase appropriately.
- Does not stop after contacting bed → Threshold too high, immediately emergency stop and decrease.
- Before each test, ensure nozzle and bed are clean, and the nozzle is
3~10mmabove the bed.
Once a stable manual threshold is found, you can return to auto-calibration's TAP=refine and TAP=verify for validation.
Setting Z Offset
After the TAP threshold passes, use Klipper's TAP method to set the Z offset:
SET_Z_FROM_PROBE METHOD=tap
It is recommended to execute this several times consecutively to observe if results are consistent. If there is significant variation, do not save; instead, check nozzle cleanliness, heated bed rigidity, Z-axis backlash, and TAP threshold.
In newer Klipper versions, tap_z_offset can be used for TAP gap fine-tuning. The actual first layer should still be confirmed by printing results, not just by single probe values.
Manual Z Offset Verification
After both the TAP threshold and SET_Z_FROM_PROBE METHOD=tap pass, the actual gap between the nozzle and bed must still be confirmed manually:
- Clean the nozzle and bed, move the nozzle near the center of the heated bed.
- Execute
SET_Z_FROM_PROBE METHOD=tap, confirm no anomalies. - Use paper or a first-layer test to check the actual nozzle gap, fine-tune Z offset via the web interface.
- Save configuration once the first layer is satisfactory.
- If the nozzle, hotend, EDDY mounting position, or bed structure is changed later, re-confirm the offset.
Common Issues
Still cannot use normally after configuration
- Confirm FAST system version >=
V1.3.9(or Klipper updated to latest). - Confirm secondary MCU firmware is updated to the latest version.
- Confirm
[probe_eddy_current fly_eddy_probe]hasfrequency: 40000000configured. - Confirm
i2c_speedis not too high. For SHT36 V3 / SB2040 V3, test with400000first. - Re-execute drive current calibration and height calibration.
- Check
klippy.logfor the first EDDY or TAP related error, and troubleshoot based on the error content.
Unstable TAP probe results
- Clean the nozzle and bed.
- Check if EDDY is loosely fixed.
- Check if Z-axis has stuttering or backlash.
- Re-execute
TAP=refineandTAP=verify.
EDDY TAP / Z_TILT triggers Timer too close
Typical error:
!! MCU 'xxx' shutdown: Timer too close
If this error only occurs during EDDY TAP, Z homing, Z_TILT_ADJUST, QUAD_GANTRY_LEVEL, or bed probing phases, it is usually necessary to check EDDY sampling, CAN communication, and host scheduling margin simultaneously.
- Check the
Statslines before and after the error inklippy.logto see if there are concurrent anomalies likebytes_retransmit,bytes_invalid,canstat_*, I2C errors, or increased host load. - Ensure Klipper, toolboard MCU, and EDDY MCU firmware versions are consistent. After updating, re-flash all related MCUs.
- Temporarily disable camera streams, KlipperScreen, remote control plugins, and other high-usage services, then retest.
- If the error occurs during
Z_TILT_ADJUSTand the machine structure allows, temporarily switch toZ_TILT_ADJUST METHOD=scanfor testing to reduce timing synchronization pressure in the TAP trigger path. - Reduce unnecessary repeated homing, repeated TAP, and continuous bed probing actions in the start macro. If already homed and the machine state is trustworthy, the macro can avoid redundant
G28. - If EDDY I2C errors also appear, first follow I2C BUS_TIMEOUT to troubleshoot wiring, I2C speed, and toolboard interface.
System-level troubleshooting: Timer too close
MCU 'xxx' I2C request to addr 42 reports error BUS_TIMEOUT
Communication between the MCU hosting EDDY and the LDC1612 has failed or is unstable.
Before checking EDDY wiring, I2C interface, terminal crimping, or replacing wiring, completely turn off the printer and disconnect power. Do not plug/unplug wires or adjust terminals while power is on.
- Verify
i2c_mcu,i2c_bus, or software I2C pins match the actual toolboard. - First, lower
i2c_speedto400000for testing. - Check if EDDY wiring, terminals, and toolboard interface are loose.
- Ensure EDDY and toolboard firmware are updated to versions compatible with the current Klipper.
Unable to detect tap: insufficient slope delta
Typical error:
!! Unable to detect tap: insufficient slope delta (-36983.054918 vs 30633.703000)
The current tap_threshold is unsuitable, or the probe data does not form a sufficiently clear TAP inflection point.
- Clean the nozzle and bed.
- Do not repeatedly run auto-calibration. Instead, use
PROBE_ACCURACY METHOD=tap tap_threshold=40000to manually find the threshold. - Once a stable manual threshold is found, return to
TAP=refineandTAP=verifyfor validation.
Unable to detect tap: invalid depress distance
Typical error:
!! Unable to detect tap: invalid depress distance (0.020411 vs 0.030000:0.250000)
The depress distance detected by Klipper is outside the expected range (0.03~0.25mm). Common causes: insufficient bed rigidity, unstable nozzle contact process, Z-axis backlash, or unsuitable TAP threshold.
- Check if the nozzle, bed surface, and build plate/surface are clean and flat.
- Check for significant looseness in bed support, Z-axis structure, or probe mounting.
- Lower Z homing and probe speed, then re-validate.
- If the same error appears multiple times, do not save TAP parameters initially. Prioritize troubleshooting mechanical rigidity and threshold.
- It is not recommended for ordinary users to directly modify
klippy/extras/probe_eddy_current.pyto relax the error range. Only after confirming hardware and thresholds are normal should someone familiar with Klipper source code evaluate if an adjustment is needed.
Eddy: CLKIN frequency too low
Typical error:
!! Eddy: CLKIN frequency too low: 0.001 < 0.002
I2C communication is unstable, and the time interval for data point acquisition is abnormal.
- Confirm
i2c_mcu,i2c_bus, or software I2C pins are filled correctly. - Test with
i2c_speedset to400000first; do not set it too high initially. - Check if EDDY wiring, terminals, and toolboard interface are loose.
- If using software I2C, confirm the corresponding GPIO is not occupied by other functions and that no peripheral circuitry affects the signal.