add support for clicky and auto-z

This commit is contained in:
Peter Tillemans 2025-06-11 13:58:12 +02:00
parent 440f1b9130
commit 9f29fadc5c
10 changed files with 1308 additions and 17 deletions

View file

@ -0,0 +1,32 @@
# This macro was provided by discord user Garrettwp to whom i give my thanks for sharing it with me.
# I have tweaked it a lot.
# They are based on the great Annex magprobe dockable probe macros "#Originally developed by Mental,
# modified for better use on K-series printers by RyanG and Trails", kudos to them.
# That macro as since evolved into a klipper plugin that currently is pending inclusion in klipper,
# more information here, https://github.com/Annex-Engineering/Quickdraw_Probe/tree/main/Klipper_Macros
# User richardjm revised the macro variables and added some functions, thanks a lot
# by standing on the shoulders of giants, lets see if we can see further
#
# the current home for this version is https://github.com/jlas1/Klicky-Probe
###################
# Bed mesh calibrate
[gcode_macro BED_MESH_CALIBRATE]
rename_existing: _BED_MESH_CALIBRATE
description: Perform Mesh Bed Leveling with klicky automount
gcode:
{% set V = printer["gcode_macro _User_Variables"].verbose %}
{% if V %}
{ action_respond_info("Bed Mesh Calibrate") }
{% endif %}
_CheckProbe action=query
G90
Attach_Probe
_KLICKY_STATUS_MESHING
_BED_MESH_CALIBRATE {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe

990
klicky-macros.cfg Normal file
View file

@ -0,0 +1,990 @@
# This macro was provided by discord user Garrettwp to whom i give my thanks for sharing it with me.
# I have tweaked it a lot.
# They are based on the great Annex magprobe dockable probe macros "#Originally developed by Mental,
# modified for better use on K-series printers by RyanG and Trails", kudos to them.
# That macro as since evolved into a klipper plugin that currently is pending inclusion in klipper,
# more information here, https://github.com/Annex-Engineering/Quickdraw_Probe/tree/main/Klipper_Macros
# User richardjm revised the macro variables and added some functions
# User sporkus added led status notifications
# Thanks to all who helped,
# by standing on the shoulders of giants, lets see if we can see further
#
# the current home for this version is https://github.com/jlas1/Klicky-Probe
[respond]
[gcode_macro _Probe_Variables]
variable_probe_attached: False
variable_probe_state: False
variable_probe_lock: False
variable_probe_z_homed: False
variable_z_endstop_x: 0
variable_z_endstop_y: 0
gcode:
#checks if the variable definitions are up to date
[gcode_macro _klicky_check_variables_version]
gcode:
{% set version = printer["gcode_macro _User_Variables"].version|default(0) %}
{% if version != 1 %}
{ action_raise_error("Please update your klicky variables, there are some functionality changes") }
{% endif %}
[gcode_macro _KlickyDebug]
gcode:
{% set message = params.MSG %}
{% set debug = printer["gcode_macro _User_Variables"].debug|default(False) %}
{% if debug %}
{ action_respond_info(message) }
{% endif %}
[gcode_macro _exit_point]
gcode:
{% set function = 'pre_' ~ params.FUNCTION %}
{% set move = params.MOVE|default(0) %}
{% set speed = printer["gcode_macro _User_Variables"].travel_speed %}
# mandatory to save the new safe position
M400
SET_VELOCITY_LIMIT ACCEL={printer.configfile.settings.printer.max_accel}
RESTORE_GCODE_STATE NAME={function} MOVE={move} MOVE_SPEED={speed}
[gcode_macro _entry_point]
gcode:
{% set function = 'pre_' ~ params.FUNCTION %}
{% set move_accel = printer["gcode_macro _User_Variables"].move_accel|default(1000) %}
# mandatory to save the new safe position
M400
SAVE_GCODE_STATE NAME={function}
# removes the Z offset for better bed based docking
SET_GCODE_OFFSET Z=0
# all the macros initially assume absolute positioning
G90
# set a safe(sane) Acceleration
SET_VELOCITY_LIMIT ACCEL={move_accel}
[gcode_macro _Homing_Variables]
gcode:
{% set reset = params.RESET|default(0) %}
{% if reset %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ False }
{% endif %}
##########################
# Attach probe and lock it
[gcode_macro Attach_Probe_Lock]
description: Attaches Klicky Probe, can only be docked after unlocking
gcode:
Attach_Probe
_Probe_Lock
########################
# Dock probe and lock it
[gcode_macro Dock_Probe_Unlock]
description: Docks Klicky Probe even if it was locked
gcode:
_Probe_Unlock
Dock_Probe
##############
# Unlock Probe
[gcode_macro _Probe_Unlock]
description: Unlocks Klicky Probe state
gcode:
_KlickyDebug msg="_Probe_Lock setting probe_lock variable to False"
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ False }
############
# Lock Probe
[gcode_macro _Probe_Lock]
description: Locks Klicky Probe state
gcode:
_KlickyDebug msg="_Probe_Lock setting probe_lock variable to True"
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_lock VALUE={ True }
###################
# Klicky Dock Servo Deploy
[gcode_macro _DeployKlickyDock]
description: Deploys Klicky servo-controlled dock
gcode:
{% set enable_dock_servo = printer["gcode_macro _User_Variables"].enable_dock_servo|default(False) %}
{% set servo_delay = printer["gcode_macro _User_Variables"].servo_delay|default(1000) %}
{% set servo_name = printer["gcode_macro _User_Variables"].servo_name %}
{% set servo_deploy = printer["gcode_macro _User_Variables"].servo_deploy|default(360) %}
#wait for all the moves to complete
M400
{% if enable_dock_servo != False %}
_KlickyDebug msg="_DeployKlickyDock Klicky servo configuration enabled"
{% if servo_deploy == 360 %}
{ action_raise_error("Klicky: servo active on klicky-variables, but no servo deploy angle specified") }
{% endif %}
_KlickyDebug msg="_DeployKlickyDock SET_SERVO SERVO={servo_name|string} ANGLE={servo_deploy|int}"
SET_SERVO SERVO={servo_name|string} ANGLE={servo_deploy|int}
M400
G4 P{servo_delay|int}
_KlickyDebug msg="_DeployKlickyDock SET_SERVO SERVO={servo_name|string} WIDTH=0"
SET_SERVO SERVO={servo_name|string} WIDTH=0
{% elif printer["gcode_macro _DeployDock"] is defined %}
_KlickyDebug msg="_DeployKlickyDock calling _DeployDock"
_DeployDock
{% endif %}
####################
# Dock Servo Retract
[gcode_macro _RetractKlickyDock]
description: Retracts Klicky servo-controlled dock
gcode:
{% set enable_dock_servo = printer["gcode_macro _User_Variables"].enable_dock_servo|default(False) %}
{% set servo_delay = printer["gcode_macro _User_Variables"].servo_delay|default(1000) %}
{% set servo_name = printer["gcode_macro _User_Variables"].servo_name %}
{% set servo_retract = printer["gcode_macro _User_Variables"].servo_retract|default(360) %}
#wait for all the moves to complete
M400
{% if enable_dock_servo != False %}
_KlickyDebug msg="_RetractKlickyDock Klicky servo configuration enabled"
{% if servo_retract == 360 %}
{ action_raise_error("Klicky: servo active on klicky-variables, but no servo retract angle specified") }
{% endif %}
_KlickyDebug msg="_RetractKlickyDock SET_SERVO SERVO={servo_name|string} ANGLE={servo_retract|int}"
SET_SERVO SERVO={servo_name|string} ANGLE={servo_retract|int}
M400
G4 P{servo_delay|int}
_KlickyDebug msg="_RetractKlickyDock SET_SERVO SERVO={servo_name|string} WIDTH=0"
SET_SERVO SERVO={servo_name|string} WIDTH=0
{% elif printer["gcode_macro _RetractDock"] is defined %}
_KlickyDebug msg="_RetractKlickyDock calling _RetractDock"
_RetractDock
{% endif %}
######################
# Attach Probe Routine
[gcode_macro Attach_Probe]
description: Attaches Klicky Probe
gcode:
# See if the position should be restored after the attach
{% set goback = params.BACK|default(0) %}
# Get probe attach status
{% set probe_attached = printer["gcode_macro _Probe_Variables"].probe_attached %}
{% set probe_lock = printer["gcode_macro _Probe_Variables"].probe_lock %}
{% set verbose = printer["gcode_macro _User_Variables"].verbose %}
# Get Docking location
{% set dockmove_x = printer["gcode_macro _User_Variables"].dockmove_x|default(0) %}
{% set dockmove_y = printer["gcode_macro _User_Variables"].dockmove_y|default(0) %}
{% set dockmove_z = printer["gcode_macro _User_Variables"].dockmove_z|default(0) %}
{% set docklocation_x = printer["gcode_macro _User_Variables"].docklocation_x %}
{% set docklocation_y = printer["gcode_macro _User_Variables"].docklocation_y %}
{% set docklocation_z = printer["gcode_macro _User_Variables"].docklocation_z %}
{% set attachmove_x = printer["gcode_macro _User_Variables"].attachmove_x|default(0) %}
{% set attachmove_y = printer["gcode_macro _User_Variables"].attachmove_y|default(0) %}
{% set attachmove_z = printer["gcode_macro _User_Variables"].attachmove_z|default(0) %}
{% set attachmove2_x = printer["gcode_macro _User_Variables"].attachmove2_x|default(0) %}
{% set attachmove2_y = printer["gcode_macro _User_Variables"].attachmove2_y|default(0) %}
{% set attachmove2_z = printer["gcode_macro _User_Variables"].attachmove2_z|default(0) %}
# Safe Z for travel
{% set safe_z = printer["gcode_macro _User_Variables"].safe_z %}
{% set enable_z_hop = printer["gcode_macro _User_Variables"].enable_z_hop %}
# Set feedrates
{% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% set dock_feedrate = printer["gcode_macro _User_Variables"].dock_speed * 60 %}
{% set release_feedrate = printer["gcode_macro _User_Variables"].release_speed * 60 %}
{% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
{% set bypass_probe_docking = printer["gcode_macro _User_Variables"].bypass_probe_docking|default(False) %}
_entry_point function=Attach_Probe
{% if bypass_probe_docking == False %}
# If x and y are not homed
{% if not 'xy' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X and Y Axis First!") }
_KlickyDebug msg="Attach_Probe Axis homed"
# If probe not attached and locked
{% elif not probe_attached and not probe_lock %}
_KlickyDebug msg="Attach_Probe going to attach probe"
{% if verbose %}
{ action_respond_info("Attaching Probe") }
{% endif %}
_KLICKY_STATUS_BUSY
{% if not 'z' in printer.toolhead.homed_axes %}
{% if verbose %}
{ action_respond_info("Resetting Z position to zero") }
{% endif %}
_KlickyDebug msg="Attach_Probe Z not homed, setting position as X=Y=Z=0"
SET_KINEMATIC_POSITION Z=0
{% if not enable_z_hop %} # Disables safe_z
_KlickyDebug msg="Attach_Probe z_hop disabled"
{% set safe_z = 0 %}
{% endif %}
{% endif %}
# Prior to saving actual position, check if its necessary to move to a safe Z
# that has enought overhead for the attached probe
{% if printer.gcode_move.gcode_position.z < safe_z %}
_KlickyDebug msg="Attach_Probe toolhead too low, raising it to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm"
{% if verbose %}
{ action_respond_info("moving to a safe Z distance") }
{% endif %}
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
{% if not 'z' in printer.toolhead.homed_axes %} #duplicate??
{% if verbose %}
{ action_respond_info("Resetting Z position to zero, duplicate?") }
{% endif %}
_KlickyDebug msg="Attach_Probe Z not homed, setting position as X=Y=Z=0"
SET_KINEMATIC_POSITION Z=0
{% endif %}
{% if printer.gcode_move.gcode_position.z < safe_z %} #duplicate??
_KlickyDebug msg="Attach_Probe toolhead too low, raising it to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm"
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
_Umbilical_Path
_entry_point function=Attach_Probe_intern
# Probe entry location
_KlickyDebug msg="Attach_Probe moving near the dock with G0 X{docklocation_x|int - attachmove_x|int - attachmove2_x|int} Y{docklocation_y|int - attachmove_y|int - attachmove2_y} F{travel_feedrate}"
G0 X{docklocation_x|int - attachmove_x|int - attachmove2_x|int} Y{docklocation_y|int - attachmove_y|int - attachmove2_y} F{travel_feedrate}
{% if docklocation_z != -128 %}
_KlickyDebug msg="Attach_Probe moving near the dock with G0 Z{docklocation_z|int - attachmove_z|int - attachmove2_z|int} F{dock_feedrate}"
G0 Z{docklocation_z|int - attachmove_z|int - attachmove2_z|int} F{dock_feedrate}
_KlickyDebug msg="Attach_Probe moving near the dock with G0 Z{docklocation_z|int - attachmove_z|int} F{dock_feedrate}"
G0 Z{docklocation_z|int - attachmove_z|int} F{dock_feedrate}
{% endif %}
# if necessary do some actions before moving the toolhead to dock
_DeployKlickyDock
# Drop Probe to Probe location
{% if docklocation_z != -128 %}
_KlickyDebug msg="Attach_Probe moving to the dock with G0 Z{docklocation_z} F{dock_feedrate}"
G0 Z{docklocation_z} F{dock_feedrate}
{% endif %}
_KlickyDebug msg="Attach_Probe moving to the dock with G0 X{docklocation_x|int - attachmove2_x|int} Y{docklocation_y|int - attachmove2_y} F{dock_feedrate}"
G0 X{docklocation_x|int - attachmove2_x|int} Y{docklocation_y|int - attachmove2_y} F{dock_feedrate}
_KlickyDebug msg="Attach_Probe moving to the dock with G0 X{docklocation_x} Y{docklocation_y} F{dock_feedrate}"
G0 X{docklocation_x} Y{docklocation_y} F{dock_feedrate}
# Probe Attached
{% if docklocation_z != -128 %}
_KlickyDebug msg="Attach_Probe moving from the dock to G0 Z{docklocation_z|int - attachmove_z|int} F{z_drop_feedrate}"
G0 Z{docklocation_z|int - attachmove_z|int} F{z_drop_feedrate}
{% endif %}
_KlickyDebug msg="Attach_Probe moving from the dock to G0 X{docklocation_x|int - attachmove_x|int} Y{docklocation_y|int - attachmove_y|int} F{release_feedrate}"
G0 X{docklocation_x|int - attachmove_x|int} Y{docklocation_y|int - attachmove_y|int} F{release_feedrate}
# if necessary do some actions after attaching the probe
_RetractKlickyDock
## Go to Z safe distance
{% if ((printer.gcode_move.gcode_position.z < safe_z) or (docklocation_z != -128 and docklocation_z < safe_z ))%}
_KlickyDebug msg="Attach_Probe moving to a safe Z position: G0 Z{safe_z} F{z_drop_feedrate} from {printer.gcode_move.gcode_position.z}"
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
_Park_Toolhead
_CheckProbe action=attach
_exit_point function=Attach_Probe_intern move={goback}
_KLICKY_STATUS_READY
{% elif probe_lock %}
{% if verbose %}
{ action_respond_info("Probe locked!") }
{% endif %}
# Probe attached, do nothing
_KlickyDebug msg="Attach_Probe probe locked not attaching probe"
_CheckProbe action=query
{% else %}
{% if verbose %}
{ action_respond_info("Probe already attached!") }
{% endif %}
# Probe attached, do nothing
_KlickyDebug msg="Attach_Probe probe already attached, doing nothing"
_CheckProbe action=query
{% endif %}
_exit_point function=Attach_Probe
{% else %}
_KlickyDebug msg="Attach_Probe probe docking bypassed, doing nothing"
{% endif %}
####################
# Dock Probe Routine
[gcode_macro Dock_Probe]
description: Docks Klicky Probe
gcode:
# See if the position should be restored after the dock
{% set goback = params.BACK|default(0) %}
# Get probe attach status
{% set probe_attached = printer["gcode_macro _Probe_Variables"].probe_attached %}
{% set probe_lock = printer["gcode_macro _Probe_Variables"].probe_lock %}
{% set verbose = printer["gcode_macro _User_Variables"].verbose %}
# Get Docking location
{% set dockmove_x = printer["gcode_macro _User_Variables"].dockmove_x|default(0) %}
{% set dockmove_y = printer["gcode_macro _User_Variables"].dockmove_y|default(0) %}
{% set dockmove_z = printer["gcode_macro _User_Variables"].dockmove_z|default(0) %}
{% set docklocation_x = printer["gcode_macro _User_Variables"].docklocation_x %}
{% set docklocation_y = printer["gcode_macro _User_Variables"].docklocation_y %}
{% set docklocation_z = printer["gcode_macro _User_Variables"].docklocation_z %}
{% set attachmove_x = printer["gcode_macro _User_Variables"].attachmove_x|default(0) %}
{% set attachmove_y = printer["gcode_macro _User_Variables"].attachmove_y|default(0) %}
{% set attachmove_z = printer["gcode_macro _User_Variables"].attachmove_z|default(0) %}
# Safe Z for travel
{% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %}
# Set feedrates
{% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% set dock_feedrate = printer["gcode_macro _User_Variables"].dock_speed * 60 %}
{% set release_feedrate = printer["gcode_macro _User_Variables"].release_speed * 60 %}
{% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
{% set bypass_probe_docking = printer["gcode_macro _User_Variables"].bypass_probe_docking|default(False) %}
{% if bypass_probe_docking == True %}
_KlickyDebug msg="Attach_Probe probe docking bypassed, doing nothing"
{% endif %}
{% if bypass_probe_docking != True %}
_entry_point function=Dock_Probe
# If probe not attached and not locked
{% if probe_attached and not probe_lock %}
_KLICKY_STATUS_BUSY
{% if printer.gcode_move.gcode_position.z < safe_z %}
_KlickyDebug msg="Dock_Probe toolhead too low, raising it to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm"
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
_Umbilical_Path
# Probe entry location
_KlickyDebug msg="Dock_Probe moving near the dock with G0 X{docklocation_x|int - attachmove_x|int} Y{docklocation_y|int - attachmove_y|int} F{travel_feedrate}"
G0 X{docklocation_x|int - attachmove_x|int} Y{docklocation_y|int - attachmove_y|int} F{travel_feedrate}
{% if docklocation_z != -128 %}
_KlickyDebug msg="Dock_Probe moving near the dock with G0 Z{docklocation_z|int - attachmove_z|int} F{dock_feedrate}"
G0 Z{docklocation_z|int - attachmove_z|int} F{dock_feedrate}
{% endif %}
# if necessary do some actions before moving the toolhead to dock
_DeployKlickyDock
# Drop Probe to Probe location
_KlickyDebug msg="Dock_Probe moving to the dock with G0 X{docklocation_x} Y{docklocation_y} F{dock_feedrate}"
G0 X{docklocation_x} Y{docklocation_y} F{dock_feedrate}
{% if docklocation_z != -128 %}
_KlickyDebug msg="Attach_Probe moving to the dock with G0 Z{docklocation_z} F{dock_feedrate}"
G0 Z{docklocation_z} F{dock_feedrate}
{% endif %}
# Probe decoupling
{% if docklocation_z != -128 %}
_KlickyDebug msg="Dock_Probe moving from the dock to G0 Z{docklocation_z|int + dockmove_z|int} F{release_feedrate}"
G0 Z{docklocation_z|int + dockmove_z|int} F{release_feedrate}
{% endif %}
_KlickyDebug msg="Dock_Probe moving from the dock to G0 X{docklocation_x|int + dockmove_x|int} Y{docklocation_y|int + dockmove_y|int} F{release_feedrate}"
G0 X{docklocation_x|int + dockmove_x|int} Y{docklocation_y|int + dockmove_y|int} F{release_feedrate}
# if necessary do some actions after attaching the probe
_RetractKlickyDock
#Do an extra move away
_KlickyDebug msg="Dock_Probe moving away from the dock to G0 X{docklocation_x|int + dockmove_x|int - attachmove_x|int} Y{docklocation_y|int + dockmove_y|int - attachmove_y|int} F{release_feedrate}"
G0 X{docklocation_x|int + dockmove_x|int - attachmove_x|int} Y{docklocation_y|int + dockmove_y|int - attachmove_y|int} F{release_feedrate}
## Go to Z safe distance
{% if (printer.gcode_move.gcode_position.z < safe_z) %}
_KlickyDebug msg="Dock_Probe moving to a safe Z position: G0 Z{safe_z} F{z_drop_feedrate} from {printer.gcode_move.gcode_position.z}"
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
_Park_Toolhead
G4 P1000
_CheckProbe action=dock
_KLICKY_STATUS_READY
{% elif probe_lock %}
{% if verbose %}
{ action_respond_info("Probe locked") }
{% endif %}
# Probe docked, do nothing
_KlickyDebug msg="Dock_Probe probe locked not docking probe"
_CheckProbe action=query
{% else %}
{% if verbose %}
{ action_respond_info("Probe already docked") }
{% endif %}
# Probe docked, do nothing
_KlickyDebug msg="Dock_Probe probe already docked, doing nothing"
_CheckProbe action=query
{% endif %}
_exit_point function=Dock_Probe move={goback}
{% else %}
_KlickyDebug msg="Dock_Probe probe docking bypassed, doing nothing"
{% endif %}
#################
# Probe Calibrate
[gcode_macro PROBE_CALIBRATE]
rename_existing: _PROBE_CALIBRATE
description:Calibrate the probes z_offset with klicky automount
gcode:
{% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %}
{% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
{% set max_x = printer["gcode_macro _User_Variables"].max_bed_x|float %}
{% set max_y = printer["gcode_macro _User_Variables"].max_bed_y|float %}
{% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %}
{% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %}
{% set bypass_probe_docking = printer["gcode_macro _User_Variables"].bypass_probe_docking|default(False) %}
{% if not 'xyz' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X, Y and Z Axis First!") }
{% endif %}
_KlickyDebug msg="probe_calibrate Axis homed"
_KlickyDebug msg="probe_calibrate Variables max_x={max_x},max_y={max_y},probe_offset_x={probe_offset_x},probe_offset_y={probe_offset_y}"
# Protect against PROBE CALIBRATE performed from outside the bed
{% if printer['gcode_move'].position.y > (max_y - probe_offset_y)
or printer['gcode_move'].position.y < - probe_offset_y
or printer['gcode_move'].position.x > (max_x - probe_offset_x)
or printer['gcode_move'].position.x < - probe_offset_x %}
{ action_raise_error("Must perform PROBE_CALIBRATE with the probe above the BED, check klicky_variables bed size!") }
{% endif %}
{% if bypass_probe_docking == False %}
_CheckProbe action=query
G90
Attach_Probe back=1
_KLICKY_STATUS_CALIBRATING_Z
_KlickyDebug msg="probe_calibrate calling klipper probe_calibrate"
_PROBE_CALIBRATE {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
M118 moving the toolhead 20 mm from the bed
_KlickyDebug msg="probe_calibrate Moving Z up by 20mm"
TESTZ Z=20
M118 remove manually the probe and continue calibration
_KLICKY_STATUS_READY
{% else %}
_KLICKY_STATUS_CALIBRATING_Z
_KlickyDebug msg="probe_calibrate calling klipper probe_calibrate"
_PROBE_CALIBRATE {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
_KLICKY_STATUS_READY
{% endif %}
################
# Probe Accuracy
[gcode_macro PROBE_ACCURACY]
rename_existing: _PROBE_ACCURACY
description:Probe Z-height accuracy at current XY position with klicky automount
gcode:
{% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %}
{% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
{% set max_x = printer["gcode_macro _User_Variables"].max_bed_x|float %}
{% set max_y = printer["gcode_macro _User_Variables"].max_bed_y|float %}
{% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %}
{% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %}
{% if not 'xyz' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X, Y and Z Axis First!") }
{% endif %}
_KlickyDebug msg="probe_accuracy Axis homed"
_KlickyDebug msg="probe_accuracy Variables max_x={max_x},max_y={max_y},probe_offset_x={probe_offset_x},probe_offset_y={probe_offset_y}"
_entry_point function=PROBE_ACCURACY
# Protect against PROBE_ACCURACY performed from outside the bed
{% if printer['gcode_move'].position.y > (max_y - probe_offset_y)
or printer['gcode_move'].position.y < - probe_offset_y
or printer['gcode_move'].position.x > (max_x - probe_offset_x)
or printer['gcode_move'].position.x < - probe_offset_x %}
{ action_raise_error("Must perform PROBE_ACCURACY with the probe above the BED, check klicky_variables bed size!") }
{% endif%}
_CheckProbe action=query
Attach_Probe back=1
_KlickyDebug msg="probe_accuracy calling klipper probe accuracy"
_PROBE_ACCURACY {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe back=1
_exit_point function=PROBE_ACCURACY move=1
#############################################
# Enable to SET_KINEMATIC_POSITION for Z hop
[force_move]
enable_force_move: True
#################
# Homing Override
[homing_override]
axes: xyz
gcode:
# collect user state variables
_User_Variables
{% set verbose = printer["gcode_macro _User_Variables"].verbose %}
{% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %}
# Safe Z for travel
{% set safe_z = printer["gcode_macro _User_Variables"].safe_z %}
{% set enable_z_hop = printer["gcode_macro _User_Variables"].enable_z_hop %}
{% set kinematic_z = 0 %}
{% set dock_on_zhome = printer["gcode_macro _User_Variables"].dock_on_zhome|default(True) %}
{% set attachmove_x = printer["gcode_macro _User_Variables"].attachmove_x|default(0) %}
{% set attachmove_y = printer["gcode_macro _User_Variables"].attachmove_y|default(0) %}
{% set attachmove_z = printer["gcode_macro _User_Variables"].attachmove_z|default(0) %}
{% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
{% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% set home_backoff_x = printer["gcode_macro _User_Variables"].home_backoff_x|default(0) %}
{% set home_backoff_y = printer["gcode_macro _User_Variables"].home_backoff_y|default(0) %}
{% set override_homing = printer["gcode_macro _User_Variables"].override_homing|default('') %}
#checks if the variable definitions are up to date
_klicky_check_variables_version
_CheckProbe action=query
# reset parameters
{% set home_x, home_y, home_z, leave_probe_attached = False, False, False, False %}
{% if 'PROBE_LOCK' in params%}
{% if verbose %}
{ action_respond_info("PROBE_LOCK = True") }
{% endif %}
{% set leave_probe_attached = True %}
{% endif %}
# which axes have been requested for homing
{% if not 'X' in params
and not 'Y' in params
and not 'Z' in params %}
{% set home_x, home_y, home_z = True, True, True %}
_KlickyDebug msg="homing_override goint to home all axes"
{% else %}
{% if 'X' in params %}
{% set home_x = True %}
_KlickyDebug msg="homing_override goint to home X"
{% endif %}
{% if 'Y' in params %}
{% set home_y = True %}
_KlickyDebug msg="homing_override goint to home Y"
{% endif %}
{% if 'Z' in params %}
{% set home_z = True %}
_KlickyDebug msg="homing_override goint to home Z"
{% endif %}
{% if 'X' in params
and 'Y' in params
and 'Z' in params %}
# reset homing state variables
# if homing all axes
_Homing_Variables reset=1
_KlickyDebug msg="homing_override goint to home all axes"
{% endif %}
{% endif %}
_entry_point function=homing_override
_KLICKY_STATUS_HOMING
# if Z is not homed, do not move the bed if it goes down
{% if 'z' not in printer.toolhead.homed_axes %}
{% if enable_z_hop == False %} # Disables safe_z
_KlickyDebug msg="homing_override z_hop disabled"
#preserve safe_z to use as the SET KINEMATIC Z position, so that the toolhead does not move to pick up the probe
{% set kinematic_z = safe_z %}
{% set safe_z = safe_z %}
{% endif %}
{% endif %}
#On the first G28 after motors losing power, moves the Z to safe_z distance, if z_hop is enabled
{% if 'x' not in printer.toolhead.homed_axes and 'y' not in printer.toolhead.homed_axes and 'z' not in printer.toolhead.homed_axes%}
{% if verbose %}
{ action_respond_info("No axis homed") }
{% endif %}
_KlickyDebug msg="homing_override no axis homed, setting position as X=Y=0 Z={kinematic_z}"
SET_KINEMATIC_POSITION X=0 Y=0 Z={kinematic_z}
M400
_KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm"
{% if verbose %}
{ action_respond_info("moving to a safe Z distance") }
{% endif %}
G0 Z{safe_z} F{z_drop_feedrate}
{% if home_z != True %}
_KlickyDebug msg="homing_override clearing axis homed state if not already homing Z"
M84
{% endif %}
{% else %}
_KlickyDebug msg="All axis homed"
{% set safe_z = printer.gcode_move.gcode_position.z|float %}
_KlickyDebug msg="Setting Safe_z to {printer.gcode_move.gcode_position.z}mm as Z is now above configured safe_z"
{% endif %}
{% if home_z %}
{% if 'x' not in printer.toolhead.homed_axes and 'y' not in printer.toolhead.homed_axes%}
{% if verbose %}
{ action_respond_info("X or Y not homed, forcing full G28") }
{% endif %}
{% set home_x, home_y, home_z = True, True, True %}
{% endif %}
{% endif %}
# if the dock is oriented on the Y, first do Y endstop
{% if ((attachmove_y == 0 and override_homing == '' ) or (override_homing == 'Y'))%}
# Home y
{% if home_y %}
{% if override_homing == 'Y' %}
_KlickyDebug msg="homing_override Y homing first override, due to override_homing = Y"
{% else %}
_KlickyDebug msg="homing_override Y homing first override, due to attachmove_y = 0"
{% endif %}
{% if verbose %}
{ action_respond_info("Homing Y") }
{% endif %}
{% if 'z' in printer.toolhead.homed_axes and printer.gcode_move.gcode_position.z < safe_z %}
_KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm in Y homing seq"
{% if verbose %}
{ action_respond_info("moving to a safe Z distance") }
{% endif %}
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
{% if printer["gcode_macro _HOME_Y"] is defined %}
_KlickyDebug msg="homing_override calling _HOME_Y external script to handle the Y homing"
_HOME_Y
{% else %}
_KlickyDebug msg="homing_override Homing Y G28 Y0"
G28 Y0
# does it need to back away from the home position
{% if home_backoff_y != 0 %}
{% if (printer.configfile.settings.stepper_y.position_endstop > (printer.configfile.settings.stepper_y.position_min|default(0) + printer.configfile.settings.stepper_y.position_max)/2) %}
_KlickyDebug msg="homing_override backing off Y endstop, G0 Y{printer.configfile.settings.stepper_y.position_endstop-home_backoff_y|int} F{travel_feedrate}"
G0 Y{printer.configfile.settings.stepper_y.position_endstop - home_backoff_y|int} F{travel_feedrate}
{% else %}
_KlickyDebug msg="homing_override backing off Y endstop, G0 Y{printer.configfile.settings.stepper_y.position_endstop + home_backoff_y|int} F{travel_feedrate}"
G0 Y{printer.configfile.settings.stepper_y.position_endstop + home_backoff_y|int} F{travel_feedrate}
{%endif %}
{%endif %}
{% endif %}
{% endif %}
{% set home_y = False %}
{% endif %}
# Home x
{% if home_x %}
{% if verbose %}
{ action_respond_info("Homing X") }
{% endif %}
{% if 'z' in printer.toolhead.homed_axes and printer.gcode_move.gcode_position.z < safe_z %}
_KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm in X homing seq"
{% if verbose %}
{ action_respond_info("moving to a safe Z distance") }
{% endif %}
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
{% if printer["gcode_macro _HOME_X"] is defined %}
_KlickyDebug msg="homing_override calling _HOME_X external script to handle the X homing"
_HOME_X
{% else %}
_KlickyDebug msg="homing_override Homing X, G28 X0"
G28 X0
# does it need to back away from the home position
{% if home_backoff_x != 0 %}
{% if (printer.configfile.settings.stepper_x.position_endstop > (printer.configfile.settings.stepper_x.position_min|default(0) + printer.configfile.settings.stepper_x.position_max)/2) %}
_KlickyDebug msg="homing_override backing off X endstop, G0 X{printer.configfile.settings.stepper_x.position_endstop - home_backoff_x|int} F{travel_feedrate}"
G0 X{printer.configfile.settings.stepper_x.position_endstop - home_backoff_x|int} F{travel_feedrate}
{% else %}
_KlickyDebug msg="homing_override backing off X endstop, G0 X{printer.configfile.settings.stepper_x.position_endstop + home_backoff_x|int} F{travel_feedrate}"
G0 X{printer.configfile.settings.stepper_x.position_endstop + home_backoff_x|int} F{travel_feedrate}
{%endif %}
{%endif %}
{% endif %}
{% endif %}
# Home y
{% if home_y %}
{% if verbose %}
{ action_respond_info("Homing Y") }
{% endif %}
{% if 'z' in printer.toolhead.homed_axes and printer.gcode_move.gcode_position.z < safe_z %}
_KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm in Y homing seq"
{% if verbose %}
{ action_respond_info("moving to a safe Z distance") }
{% endif %}
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
{% if printer["gcode_macro _HOME_Y"] is defined %}
_KlickyDebug msg="homing_override calling _HOME_Y external script to handle the Y homing"
_HOME_Y
{% else %}
_KlickyDebug msg="homing_override Homing Y, G28 Y0"
G28 Y0
{% if home_backoff_y != 0 %}
{% if (printer.configfile.settings.stepper_y.position_endstop > (printer.configfile.settings.stepper_y.position_min|default(0) + printer.configfile.settings.stepper_y.position_max)/2) %}
_KlickyDebug msg="homing_override backing off Y endstop, G0 Y{printer.configfile.settings.stepper_y.position_endstop - home_backoff_y|int} F{travel_feedrate}"
G0 Y{printer.configfile.settings.stepper_y.position_endstop - home_backoff_y|int} F{travel_feedrate}
{% else %}
_KlickyDebug msg="homing_override backing off Y endstop, G0 Y{printer.configfile.settings.stepper_y.position_endstop + home_backoff_y|int} F{travel_feedrate}"
G0 Y{printer.configfile.settings.stepper_y.position_endstop + home_backoff_y|int} F{travel_feedrate}
{%endif %}
{%endif %}
{% endif %}
{% endif %}
# Home z
{% if home_z %}
{% if verbose %}
{ action_respond_info("Homing Z") }
{% endif %}
{% if 'z' in printer.toolhead.homed_axes and printer.gcode_move.gcode_position.z < safe_z %}
_KlickyDebug msg="homing_override moving toolhead to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm in Y homing seq"
{% if verbose %}
{ action_respond_info("moving to a safe Z distance") }
{% endif %}
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
# if probe is configured as endstop, attach it, else check if the probe needs to be docked if attached
{% if 'z_virtual_endstop' in printer['configfile'].config["stepper_z"]["endstop_pin"] %}
_KlickyDebug msg="homing_override probe configured as a virtual Z endstop attaching probe"
Attach_Probe
# if PROBE_LOCK parameter is given, Attach Probe and lock until it´s unlocked
{% if leave_probe_attached %}
_Probe_Lock
{% endif %}
{% elif dock_on_zhome == True %}
Dock_Probe
{% endif %}
_Home_Z_
# if probe is configured as endstop, dock it
{% if 'z_virtual_endstop' in printer['configfile'].config["stepper_z"]["endstop_pin"] %}
_KlickyDebug msg="homing_override probe no longer required, docking probe"
Dock_Probe
{% elif dock_on_zhome == False %}
Dock_Probe
{% endif %}
{% endif %}
_CheckProbe action=query
# park the toolhead
_Park_Toolhead
_exit_point function=homing_override
_KLICKY_STATUS_READY
# Umbilical path setup
[gcode_macro _Umbilical_Path]
gcode:
{% set umbilical = printer["gcode_macro _User_Variables"].umbilical %}
{% set umbilical_x = printer["gcode_macro _User_Variables"].umbilical_x %}
{% set umbilical_y = printer["gcode_macro _User_Variables"].umbilical_y %}
{% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %}
{% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% if umbilical %}
# Used to give the umbilical a better path to follow and coil properly if dock is tight in space
_entry_point function=Umbilical_Path
_KlickyDebug msg="_Umbilical_Path moving to G0 X{umbilical_x} Y{umbilical_y} Z{safe_z} F{travel_feedrate}"
G0 X{umbilical_x} Y{umbilical_y} Z{safe_z} F{travel_feedrate}
_exit_point function=Umbilical_Path
{% endif %}
# Home Z Routine
[gcode_macro _Home_Z_]
gcode:
{% set z_endstop_x = printer["gcode_macro _Probe_Variables"].z_endstop_x %}
{% set z_endstop_y = printer["gcode_macro _Probe_Variables"].z_endstop_y %}
{% set safe_z = printer["gcode_macro _User_Variables"].safe_z|float %}
{% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %} {% set z_drop_feedrate = printer["gcode_macro _User_Variables"].z_drop_speed * 60 %}
{% set verbose = printer["gcode_macro _User_Variables"].verbose %}
_entry_point function=Home_Z
# if x and y are not homed yet, raise error
{% if not 'xy' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X and Y Axis First!") }
{% else %}
_KlickyDebug msg="_Home_Z_ XY Axis homed"
{% if not 'z' in printer.toolhead.homed_axes %}
{% if verbose %}
{ action_respond_info("Resetting Z position to zero") }
{% endif %}
_KlickyDebug msg="_Home_Z_ Z not homed, setting position as X=Y=Z=0"
SET_KINEMATIC_POSITION Z=0
{% endif %}
# Move tool to safe homing position and home Z axis
# location of z endstop
_KlickyDebug msg="_Home_Z_ moving to Z endstop position G0 X{z_endstop_x} Y{z_endstop_y} F{travel_feedrate}"
G0 X{z_endstop_x} Y{z_endstop_y} F{travel_feedrate}
_KlickyDebug msg="_Home_Z_ Homing Z G28 Z"
G28 Z0
_KlickyDebug msg="_Home_Z_ toolhead too low, raising it to {safe_z}mm from {printer.gcode_move.gcode_position.z}mm"
G0 Z{safe_z} F{z_drop_feedrate}
{% endif %}
_exit_point function=Home_Z
# Check to see if probe is where it is supposed to be after
# attaching/docking maneuver and set homing error or shutdown
[gcode_macro _CheckProbe]
variable_probe_state: 0
gcode:
Query_Probe
_SetProbeState action={ params.ACTION }
# Due to how templates are evaluated, we have query endstops in one
# macro and call another macro to make decisions based on the result
[gcode_macro _SetProbeState]
gcode:
{% set query_probe_triggered = printer.probe.last_query %}
{% set action = params.ACTION|default('') %}
# If triggered (true), probe not attached
{% if query_probe_triggered %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_attached VALUE={ False }
{% else %}
# If not triggered (false), probe attached
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_attached VALUE={ True }
{% endif %}
{% if action == 'query' %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=probe_state VALUE={ query_probe_triggered }
{% endif %}
# If probe fails to attach/detach
# If not docked
{% if not query_probe_triggered and action == 'dock' %}
{ action_raise_error("Probe dock failed!") }
{% endif %}
# If not attached
{% if query_probe_triggered and action == 'attach' %}
{ action_raise_error("Probe attach failed!") }
{% endif %}
# Park Toolhead Routine
[gcode_macro _Park_Toolhead]
gcode:
{% set park_toolhead = printer["gcode_macro _User_Variables"].park_toolhead %}
{% set parkposition_x = printer["gcode_macro _User_Variables"].parkposition_x %}
{% set parkposition_y = printer["gcode_macro _User_Variables"].parkposition_y %}
{% set parkposition_z = printer["gcode_macro _User_Variables"].parkposition_z %}
{% set travel_feedrate = printer["gcode_macro _User_Variables"].travel_speed * 60 %}
{% set verbose = printer["gcode_macro _User_Variables"].verbose %}
_entry_point function=Park_Toolhead
{% if park_toolhead and 'xyz' in printer.toolhead.homed_axes %}
{% if verbose %}
{ action_respond_info("Parking Toolhead") }
{% endif %}
{% if parkposition_z == -128 %}
_KlickyDebug msg="_Park_Toolhead moving to G0 X{parkposition_x} Y{parkposition_y} F{travel_feedrate}"
G0 X{parkposition_x} Y{parkposition_y} F{travel_feedrate}
{% else %}
_KlickyDebug msg="_Park_Toolhead moving to G0 X{parkposition_x} Y{parkposition_y} Z{parkposition_z} F{travel_feedrate}"
G0 X{parkposition_x} Y{parkposition_y} Z{parkposition_z} F{travel_feedrate}
{% endif %}
{% endif %}
_exit_point function=Park_Toolhead
#################
# Status LEDs
# This enables stealthburner-led status macros to be used in klicky macros if they exist.
# https://github.com/VoronDesign/Voron-Afterburner/blob/sb-beta/Klipper_Macros/stealthburner_leds.cfg
[gcode_macro _klicky_status_ready]
gcode:
{% if printer['gcode_macro status_ready'] is defined %}
_KlickyDebug msg="_klicky_status_ready activating the LED STATUS_READY"
STATUS_READY
{% endif %}
[gcode_macro _klicky_status_busy]
gcode:
{% if printer['gcode_macro status_busy'] is defined %}
_KlickyDebug msg="_klicky_status_busy activating the LED STATUS_BUSY"
STATUS_BUSY
{% endif %}
[gcode_macro _klicky_status_leveling]
gcode:
{% if printer['gcode_macro status_leveling'] is defined %}
_KlickyDebug msg="_klicky_status_leveling activating the LED STATUS_LEVELING"
STATUS_LEVELING
{% endif %}
[gcode_macro _klicky_status_homing]
gcode:
{% if printer['gcode_macro status_homing'] is defined %}
_KlickyDebug msg="_klicky_status_homing activating the LED STATUS_HOMING"
STATUS_HOMING
{% endif %}
[gcode_macro _klicky_status_cleaning]
gcode:
{% if printer['gcode_macro status_cleaning'] is defined %}
_KlickyDebug msg="_klicky_status_cleaning activating the LED STATUS_CLEANING"
STATUS_CLEANING
{% endif %}
[gcode_macro _klicky_status_meshing]
gcode:
{% if printer['gcode_macro status_meshing'] is defined %}
_KlickyDebug msg="_klicky_status_meshing activating the LED STATUS_MESHING"
STATUS_MESHING
{% endif %}
[gcode_macro _klicky_status_calibrating_z]
gcode:
{% if printer['gcode_macro status_calibrating_z'] is defined %}
_KlickyDebug msg="_klicky_status_calibrating_z activating the LED STATUS_CALIBRATING_Z"
STATUS_CALIBRATING_Z
{% endif %}

10
klicky-probe.cfg Normal file
View file

@ -0,0 +1,10 @@
#Simple way to include all the various klicky macros and configurations
# the current home for this configuration is https://github.com/jlas1/Klicky-Probe, please check it
#[include ./klicky-specific.cfg] #place to put other configurations specific to your printer
[include ./klicky-variables.cfg] #Required
[include ./klicky-macros.cfg] #Required
[include ./klicky-bed-mesh-calibrate.cfg] #bed mesh, requires klipper configuration
#[include ./klicky-screws-tilt-calculate.cfg] #help adjust bed screws automatically
[include ./klicky-quad-gantry-level.cfg] #level 4 Z motors
#[include ./klicky-z-tilt-adjust.cfg] #level 2 or 3 Z motors

View file

@ -0,0 +1,31 @@
# This macro was provided by discord user Garrettwp to whom i give my thanks for sharing it with me.
# I have tweaked it a lot.
#
# this macro is based on the great Annex magprobe dockable probe macros "#Originally developed by Mental, modified for better use on K-series printers by RyanG and Trails"
# that macro as since evolved into a klipper plugin that currently is pending inclusion in klipper
# more information here https://github.com/Annex-Engineering/Quickdraw_Probe/tree/main/Klipper_Macros
#
# by standing on the shoulders of giants, lets see if we can see further
# User richardjm revised the macro variables and added some functions, thanks a lot
# This macro home is https://github.com/jlas1/Klicky-Probe
###################
# Quad Gantry Level
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing: _QUAD_GANTRY_LEVEL
description: Conform a moving, twistable gantry to the shape of a stationary bed with klicky automount
gcode:
{% set V = printer["gcode_macro _User_Variables"].verbose %}
{% if V %}
{ action_respond_info("QG Level") }
{% endif %}
_CheckProbe action=query
G90
Attach_Probe
_KLICKY_STATUS_LEVELING
_QUAD_GANTRY_LEVEL {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe

View file

@ -0,0 +1,32 @@
# This macro was provided by discord user Garrettwp to whom i give my thanks for sharing it with me.
# I have tweaked it a lot.
#
# this macro is based on the great Annex magprobe dockable probe macros "#Originally developed by Mental, modified for better use on K-series printers by RyanG and Trails"
# that macro as since evolved into a klipper plugin that currently is pending inclusion in klipper
# more information here https://github.com/Annex-Engineering/Quickdraw_Probe/tree/main/Klipper_Macros
#
# by standing on the shoulders of giants, lets see if we can see further
# User richardjm revised the macro variables and added some functions, thanks a lot
# This macro home is https://github.com/jlas1/Klicky-Probe
###################
## Screws Tilt Adjust
[gcode_macro SCREWS_TILT_CALCULATE]
rename_existing: _SCREWS_TILT_CALCULATE
description:
gcode:
{% set V = printer["gcode_macro _User_Variables"].verbose %}
{% if V %}
{ action_respond_info("Screws Tilt Adjust") }
{% endif %}
_CheckProbe action=query
G90
Attach_Probe
_KLICKY_STATUS_LEVELING
_SCREWS_TILT_CALCULATE {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe

0
klicky-specific.cfg Normal file
View file

107
klicky-variables.cfg Normal file
View file

@ -0,0 +1,107 @@
# This macro was provided by discord user Garrettwp to whom i give my thanks for sharing it with me.
# I have tweaked it a lot.
# They are based on the great Annex magprobe dockable probe macros "#Originally developed by Mental,
# modified for better use on K-series printers by RyanG and Trails", kudos to them.
# That macro as since evolved into a klipper plugin that currently is pending inclusion in klipper,
# more information here, https://github.com/Annex-Engineering/Quickdraw_Probe/tree/main/Klipper_Macros
# User richardjm revised the macro variables and added some functions, thanks a lot
# by standing on the shoulders of giants, lets see if we can see further
#
# the current home for this version is https://github.com/jlas1/Klicky-Probe
# the 1000 values below is to give an error instead of doing something wrong, hopefully, this won't be used is a printer larger than 1 meter
[gcode_macro _User_Variables]
variable_verbose: True # Enable verbose output
variable_debug: False # Enable Debug output
variable_travel_speed: 200 # how fast all other travel moves will be performed when running these macros
variable_move_accel: 1000 # how fast should the toolhead accelerate when moving
variable_dock_speed: 50 # how fast should the toolhead move when docking the probe for the final movement
variable_release_speed: 75 # how fast should the toolhead move to release the hold of the magnets after docking
variable_z_drop_speed: 20 # how fast the z will lower when moving to the z location to clear the probe
variable_safe_z: 25 # Minimum Z for attach/dock and homing functions
# if true it will move the bed away from the nozzle when Z is not homed
variable_enable_z_hop: True # set this to false for beds that fall significantly under gravity (almost to Z max)
variable_max_bed_y: 350 # maximum Bed size avoids doing a probe_accuracy outside the bed
variable_max_bed_x: 350 # maximum Bed size avoids doing a probe_accuracy outside the bed
# if a separate Z endstop switch is in
# use, specify the coordinates of the switch here (Voron).
# Set to 0 to have the probe move to center of bed
variable_z_endstop_x: 232
variable_z_endstop_y: 355
#Check the printer specific documentation on klipper Dock/Undock configuration, these are dummy values
#dock location
variable_docklocation_x: 292 # X Dock position
variable_docklocation_y: 349 # Y Dock position
variable_docklocation_z: -128 # Z dock position (-128 for a gantry/frame mount)
#The following variables are used if the dock is deployed and retracted via a servo motor
variable_enable_dock_servo: False # Set to true if your klicky dock is servo-controlled
variable_servo_name: 'NAME' # The name of the dock servo defined in printer.cfg under [servo]
variable_servo_deploy: 10 # This EXAMPLE is the value used to deploy the servo fully
variable_servo_retract: 11 # This EXAMPLE is the value used to retract the servo fully (initial_angle in [servo] config)
variable_servo_delay: 250 # This is a delay to wait the servo to reach the requested position, be carefull with high values
#Dock move, final toolhead movement to release the probe on the dock
#it's a relative move
Variable_dockmove_x: -100
Variable_dockmove_y: 0
Variable_dockmove_z: 0
#Attach move. final toolhead movement to attach the probe on the mount
#it's a relative move
Variable_attachmove_x: 0
Variable_attachmove_y: 50
Variable_attachmove_z: 0
#Umbilical to help untangle the umbilical in difficult situations
variable_umbilical: False # should we untangle the umbilical
variable_umbilical_x: 15 # X umbilical position
variable_umbilical_y: 15 # Y umbilical position
# location to park the toolhead
variable_park_toolhead: False # Enable toolhead parking
variable_parkposition_x: 50
variable_parkposition_y: 175
variable_parkposition_z: 30
variable_version: 1 # Helps users to update the necessary variables, do not update if the variables above are not updated
#Below this remark, you normally do not need to configure
#Attach move2
Variable_attachmove2_x: 0 # intermediate toolhead movement to attach
Variable_attachmove2_y: 0 # the probe on the dock
Variable_attachmove2_z: 0 # (can be negative)
variable_home_backoff_x: 10 # how many mm to move away from the X endstop after homing X
# this is useful for the voron v0 to enable the toolhead to move out of the way to allow an unstricted Y homing
variable_home_backoff_y: 10 # how many mm to move away from the Y endstop after homing Y
variable_override_homing: '' # configures what axis to home first
# '' = default klicky behavior (tries to avoid the hitting the dock)
# 'X' = forces X to home first
# 'Y' = forces Y to home first
variable_dock_on_zhome: True # docks the probe on Z Homing if not necessary (avoids hitting the bed on some printers
# Do not modify below
gcode:
{% set Mx = printer['configfile'].config["stepper_x"]["position_max"]|float %}
{% set My = printer['configfile'].config["stepper_y"]["position_max"]|float %}
{% set Ox = printer['configfile'].config["probe"]["x_offset"]|float %}
{% set Oy = printer['configfile'].config["probe"]["y_offset"]|float %}
{% set Oz = printer['configfile'].config["probe"]["z_offset"]|float %}
# If x, y coordinates are set for z endstop, assign them
{% if z_endstop_x != 0 or z_endstop_y != 0 %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_x VALUE={ z_endstop_x }
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_y VALUE={ z_endstop_y }
# if no x, y coordinates for z endstop, assume probe is endstop and move toolhead to center of bed
{% else %}
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_x VALUE={ (Mx * 0.5) - Ox }
SET_GCODE_VARIABLE MACRO=_Probe_Variables VARIABLE=z_endstop_y VALUE={ (My * 0.5) - Oy }
{% endif %}

32
klicky-z-tilt-adjust.cfg Normal file
View file

@ -0,0 +1,32 @@
# This macro was provided by discord user Garrettwp to whom i give my thanks for sharing it with me.
# I have tweaked it a lot.
#
# this macro is based on the great Annex magprobe dockable probe macros "#Originally developed by Mental, modified for better use on K-series printers by RyanG and Trails"
# that macro as since evolved into a klipper plugin that currently is pending inclusion in klipper
# more information here https://github.com/Annex-Engineering/Quickdraw_Probe/tree/main/Klipper_Macros
#
# by standing on the shoulders of giants, lets see if we can see further
# User richardjm revised the macro variables and added some functions, thanks a lot
# This macro home is https://github.com/jlas1/Klicky-Probe
###################
## Z Tilt Adjust
[gcode_macro Z_TILT_ADJUST]
rename_existing: _Z_TILT_ADJUST
description:
gcode:
{% set V = printer["gcode_macro _User_Variables"].verbose %}
{% if V %}
{ action_respond_info("Z Tilt Adjust") }
{% endif %}
_CheckProbe action=query
G90
Attach_Probe
_KLICKY_STATUS_LEVELING
_Z_TILT_ADJUST {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe
G28 Z0

View file

@ -88,3 +88,11 @@ origin: https://github.com/mainsail-crew/sonar.git
primary_branch: main
managed_services: sonar
install_script: tools/install.sh
[update_manager z_calibration]
type: git_repo
path: /home/pti/klipper_z_calibration
origin: https://github.com/protoloft/klipper_z_calibration.git
managed_services: klipper

View file

@ -1,4 +1,4 @@
#nDesign VORON2 250/300/350mm SKR 1.3 TMC2209 UART config
#Design VORON2 250/300/350mm SKR 1.3 TMC2209 UART config
## *** THINGS TO CHANGE/CHECK: ***
## MCU paths [mcu] section
@ -61,6 +61,10 @@
## include mainsail config
[include mainsail.cfg]
## enable exclude object
[exclude_object]
## MCU for X/Y/E steppers main MCU
## [X in X] - B Motor
## [Y in Y] - A Motor
@ -97,7 +101,7 @@ square_corner_velocity: 5.0
## Connected to X on mcu_xye (B Motor)
[stepper_x]
step_pin: P2.2
dir_pin: !P2.6
dir_pin: P2.6
enable_pin: !P2.1
rotation_distance: 40
microsteps: 32
@ -134,7 +138,7 @@ stealthchop_threshold: 0
## Connected to Y on mcu_xye (A Motor)
[stepper_y]
step_pin: P0.19
dir_pin: !P0.20
dir_pin: P0.20
enable_pin: !P2.8
rotation_distance: 40
microsteps: 32
@ -352,13 +356,13 @@ pid_kd = 266.452
[probe]
pin: z:P1.24
x_offset: 0
y_offset: 25.0
#z_offset: 2.400
y_offset: 19.75
z_offset: 5
speed: 10.0
samples: 3
samples_result: median
sample_retract_dist: 3.0
samples_tolerance: 0.006
sample_retract_dist: 2.0
samples_tolerance: 0.01
samples_tolerance_retries: 3
#####################################################################
@ -391,7 +395,7 @@ off_below: 0.10
## Controller fan - Z board, HE1 Connector
[heater_fan controller_fan]
pin: z:P2.4
max_power: 0.25
max_power: 0.5
shutdown_speed: 0
kick_start_time: 0.5
heater: heater_bed
@ -400,7 +404,7 @@ heater_temp: 45.0
## Exhaust fan - Z board, HE0 Connector
[heater_fan exhaust_fan]
pin: z:P2.7
max_power: 0.5
max_power: 0.25
shutdown_speed: 0.0
kick_start_time: 5.0
heater: heater_bed
@ -426,14 +430,14 @@ fan_speed: 1.0
[idle_timeout]
timeout: 1800
[safe_z_home]
#[safe_z_home]
## XY Location of the Z Endstop Switch
## Update -10,-10 to the XY coordinates of your endstop pin
## (such as 157,305) after going through Z Endstop Pin
## Location Definition step.
home_xy_position: 232,355
speed:100
z_hop:10
#home_xy_position: 232,355
#speed:100
#z_hop:10
## Use QUAD_GANTRY_LEVEL to level a gantry.
@ -485,6 +489,15 @@ retries: 5
retry_tolerance: 0.0075
max_adjust: 15
[z_calibration]
nozzle_xy_position: 232,355 # <X,Y position for clicking the nozzle on the z endstop - not needed if [safe_z_home] is used>
switch_xy_offsets: -4,-24 # <X,Y offsets from the nozzle position for clicking the probe's switch body on the z endstop>
bed_xy_position: 180,180 # <X,Y position for probing the bed, for instance the center point - not needed if mesh with zero_reference_position is used>
switch_offset: 0.5 # <offset of the switch trigger (read the Switch Offset section!)>
start_gcode: Attach_Probe # <macro name for attaching the probe>
#before_switch_gcode: <macro name for attaching the probe AFTER probing the nozzle>
end_gcode: Dock_Probe # <macro name for docking the probe>
#####################################################################
# Displays
#####################################################################
@ -541,6 +554,8 @@ gcode:
#####################################################################
# Macros
#####################################################################
[include klicky-probe.cfg]
[gcode_macro PARK]
gcode:
{% set th = printer.toolhead %}
@ -605,11 +620,14 @@ gcode:
SET_DISPLAY_TEXT MSG="QGL" # Displays info
#STATUS_LEVELING # Sets SB-leds to leveling-mode
QUAD_GANTRY_LEVEL # Levels the buildplate via QGL
CLEAN_NOZZLE
G28 Z # Homes Z again after QGL
## Uncomment for Klicky auto-z
#CALIBRATE_Z # Calibrates Z-offset with klicky
#SET_DISPLAY_TEXT MSG="Z-offset" # Displays info
SET_DISPLAY_TEXT MSG="Z-offset" # Displays info
CALIBRATE_Z # Calibrates Z-offset with klicky
## Uncomment for bed mesh (2 of 2)
#SET_DISPLAY_TEXT MSG="Bed mesh" # Displays info
@ -620,7 +638,8 @@ gcode:
# Heats up the nozzle up to target via data from slicer
SET_DISPLAY_TEXT MSG="Hotend: {target_extruder}c" # Displays info
#STATUS_HEATING # Sets SB-leds to heating-mode
G1 X{x_wait} Y{y_wait} Z15 F9000 # Goes to center of the bed
G1 Z15 F9000
G1 X{x_wait} Y{y_wait} # Goes to center of the bed
M107 # Turns off partcooling fan
M109 S{target_extruder} # Heats the nozzle to printing temp
@ -851,11 +870,41 @@ gcode:
# Restore previous gcode state (absolute/relative, etc)
RESTORE_GCODE_STATE NAME=TEST_SPEED
[gcode_macro CLEAN_NOZZLE]
variable_start_x: 120
variable_start_y: 355
variable_start_z: 1.5
variable_wipe_dist: -45
variable_wipe_dy: 2
variable_wipe_qty: 10
variable_wipe_spd: 200
variable_raise_distance: 30
gcode:
{% if "xyz" not in printer.toolhead.homed_axes %}
G28
{% endif %}
G90 ; absolute positioning
## Move nozzle to start position
G1 X{start_x} Y{start_y} F6000
G1 Z{start_z} F1500
## Wipe nozzle
{% for wipes in range(1, (wipe_qty + 1)) %}
G1 X{start_x + wipe_dist} Y{start_y - wipes*wipe_dy/wipe_qty} F{wipe_spd * 60}
G1 X{start_x} Y{start_y - wipes*wipe_dy/wipe_qty} F{wipe_spd * 60}
{% endfor %}
## Raise nozzle
G1 Z{raise_distance}
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [stepper_z]
#*# position_endstop = -1.241
#*# position_endstop = -1.3
#*#
#*# [probe]
#*# z_offset = 2.375