-
Notifications
You must be signed in to change notification settings - Fork 0
/
probe.cfg
543 lines (427 loc) · 17.2 KB
/
probe.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
# 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 can be found here https://github.com/Annex-Engineering/Annex-Engineering_Other_Printer_Mods/blob/master/All_Printers/Microswitch_Probe/Klipper_Macros/dockable_probe_macros.cfg
#
# by standing on the shoulders of giants, lets see if we can see further
[gcode_macro User_Variables]
variable_verbose: True # Enable verbose output
variable_travel_speed: 200 # how fast all other travel moves will be performed when running these macros
variable_dock_speed: 50 # how fast should the toolhead move when docking the probe for the final movement
variable_release_speed: 100 # how fast should the toolhead move to release the hold of the magnets after docking
variable_z_drop_speed: 10 # how fast the z will lower when moving to the z location to clear the probe
variable_home_z_height: 15 # Z when homing
# 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: 240.10
# variable_z_endstop_y: 348
variable_z_endstop_x: 0
variable_z_endstop_y: 0
# location to park the toolhead
variable_park_toolhead: False # Enable toolhead parking
variable_parkposition_x: 150
variable_parkposition_y: 150
variable_parkposition_z: 30
#dock location
variable_docklocation_x: 30 # X Dock position
variable_docklocation_y: 338.8 # Y Dock position
variable_docklocation_z: 15 # Z dock position
variable_dockarmslenght: 50 # Dock arms lenght, toolhead movement necessary to clear the dock arms
# 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 docklocation_z is zero, use Home Z height for safety
{% if docklocation_z == 0 %}
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=docklocation_z VALUE={ home_z_height }
{% endif %}
# 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 %}
[gcode_macro Probe_Variables]
variable_probe_attached: False
variable_probe_state: False
variable_probe_lock: False
variable_z_endstop_x: 0
variable_z_endstop_y: 0
gcode:
[gcode_macro Homing_Variables]
gcode:
{% set R = params.RESET|default(0) %}
{% if R %}
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=probe_lock VALUE={ False }
{% endif %}
# Attach probe and lock it
[gcode_macro Attach_Probe_Lock]
gcode:
Attach_Probe
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=probe_lock VALUE={ True }
# Dock probe and lock it
[gcode_macro Dock_Probe_Unlock]
gcode:
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=probe_lock VALUE={ False }
Dock_Probe
# Unlock Probe
[gcode_macro Probe_Unlock]
gcode:
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=probe_lock VALUE={ False }
# Lock Probe
[gcode_macro Probe_Lock]
gcode:
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=probe_lock VALUE={ True }
# Attach Probe Routine
[gcode_macro Attach_Probe]
gcode:
# Get probe attach status
{% set P = printer["gcode_macro Probe_Variables"].probe_attached %}
{% set L = printer["gcode_macro Probe_Variables"].probe_lock %}
{% set V = printer["gcode_macro User_Variables"].verbose %}
# Get Docking location
{% set Dx = printer["gcode_macro User_Variables"].docklocation_x %}
{% set Dy = printer["gcode_macro User_Variables"].docklocation_y %}
{% set Dz = printer["gcode_macro User_Variables"].docklocation_z %}
{% set Da = printer["gcode_macro User_Variables"].dockarmslenght %}
# Safe Z for travel
{% set Hzh = printer["gcode_macro User_Variables"].home_z_height|float %}
#Set speed
{% set St = printer["gcode_macro User_Variables"].travel_speed * 60 %}
#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.toolhead.position.z < Hzh) %}
G1 Z{Hzh} F1200
{% endif %}
M400 # mandatory to save the new safe position
#allows the docking position to be independent of the Z offset, necessary for bed mounted probes
SAVE_GCODE_STATE name=_attachProbe
SET_GCODE_OFFSET Z=0
# 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!") }
# If probe not attached and locked
{% elif not P and not L %}
{% if V %}
{ action_respond_info("Attaching Probe") }
{% endif %}
G90
{% if (not 'z' in printer.toolhead.homed_axes) %}
{% if V %}
{ action_respond_info("Resetting Z position to zero") }
{% endif %}
SET_KINEMATIC_POSITION Z=0
{% endif %}
{% if (printer.toolhead.position.z < Hzh) %}
G1 Z{Hzh} F1200
{% endif %}
# Move toolhead to above probe dock
G1 X{Dx + Da} Y{Dy} Z{Hzh} F{St}
# pickup from Probe location
G1 X{Dx} Y{Dy} F1800
# Probe entry location
G1 X{Dx + Da} Y{Dy} F6000
#Go to Z safe distance
G1 Z{Hzh} F600
Park_Toolhead
CheckProbe action=attach
{% elif L %}
{% if V %}
{ action_respond_info("Probe locked!") }
{% endif %}
# Probe attached, do nothing
CheckProbe action=query
{% else %}
{% if V %}
{ action_respond_info("Probe already attached!") }
{% endif %}
# Probe attached, do nothing
CheckProbe action=query
{% endif %}
#reverts to the original Z offset
RESTORE_GCODE_STATE name=_attachProbe
# Dock Probe Routine
[gcode_macro Dock_Probe]
gcode:
# Get probe attach status
{% set P = printer["gcode_macro Probe_Variables"].probe_attached %}
{% set L = printer["gcode_macro Probe_Variables"].probe_lock %}
{% set V = printer["gcode_macro User_Variables"].verbose %}
# Get Docking location
{% set Dx = printer["gcode_macro User_Variables"].docklocation_x %}
{% set Dy = printer["gcode_macro User_Variables"].docklocation_y %}
{% set Dz = printer["gcode_macro User_Variables"].docklocation_z %}
{% set Da = printer["gcode_macro User_Variables"].dockarmslenght %}
# Safe Z for travel
{% set Hzh = printer["gcode_macro User_Variables"].home_z_height|float %}
# Set speed
{% set St = printer["gcode_macro User_Variables"].travel_speed * 60 %}
{% set Sd = printer["gcode_macro User_Variables"].dock_speed * 60 %}
{% set Sr = printer["gcode_macro User_Variables"].release_speed * 60 %}
{% set Sz = printer["gcode_macro User_Variables"].z_drop_speed * 60 %}
M400 # mandatory to save the new safe position
#allows the docking position to be independent of the Z offset, necessary for bed mounted probes
SAVE_GCODE_STATE name=_dockProbe
SET_GCODE_OFFSET Z=0
{% if not 'xyz' in printer.toolhead.homed_axes %}
{ action_raise_error("Must Home X, Y and Z Axis First!") }
# If probe not attached and not locked
{% elif P and not L %}
{% if V %}
{ action_respond_info("Docking Probe") }
{% endif %}
G90
{% if (printer.toolhead.position.z < Hzh) %}
G1 Z{Hzh} F{Sz}
{% endif %}
# Probe entry location
G1 X{Dx + Da} Y{Dy} Z{Hzh} F{St}
# Drop Probe to Probe location
G1 X{Dx} Y{Dy} F1800
# Probe decoupling
G1 X{Dx} Y{Dy - 30} F{Sr}
Park_Toolhead
CheckProbe action=dock
{% elif L %}
{% if V %}
{ action_respond_info("Probe locked!") }
{% endif %}
# Probe docked, do nothing
CheckProbe action=query
{% else %}
{% if V %}
{ action_respond_info("Probe already docked!") }
{% endif %}
# Probe docked, do nothing
CheckProbe action=query
{% endif %}
#reverts to the original Z offset
RESTORE_GCODE_STATE name=_dockProbe
# Quad Gantry Level
[gcode_macro QUAD_GANTRY_LEVEL]
rename_existing: _QUAD_GANTRY_LEVEL
gcode:
{% set V = printer["gcode_macro User_Variables"].verbose %}
{% if V %}
{ action_respond_info("QG Level") }
{% endif %}
CheckProbe action=query
Attach_Probe
_QUAD_GANTRY_LEVEL {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe
# Bed Mesh Calibrate
[gcode_macro BED_MESH_CALIBRATE]
rename_existing: _BED_MESH_CALIBRATE
gcode:
{% set V = printer["gcode_macro User_Variables"].verbose %}
{% if V %}
{ action_respond_info("Bed Mesh Calibrate") }
{% endif %}
CheckProbe action=query
Attach_Probe
_BED_MESH_CALIBRATE {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
Dock_Probe
# Probe Calibrate
#[gcode_macro PROBE_CALIBRATE]
#rename_existing: _PROBE_CALIBRATE
#gcode:
# {% set Hzh = printer["gcode_macro User_Variables"].home_z_height|float %}
# {% set Sz = printer["gcode_macro User_Variables"].z_drop_speed * 60 %}
# {% set St = printer["gcode_macro User_Variables"].travel_speed %}
# Go to Z safe distance before saving location in order to
# avoid crashing the probe on the bed when coming back
# G1 X150 Y150 Z{Hzh} F{Sz}
# M400 # mandatory to save the new safe position
# SAVE_GCODE_STATE NAME=_original_nozzle_location
# CheckProbe action=query
# Attach_Probe
# Restore nozzle location to probe the right place
# RESTORE_GCODE_STATE NAME=_original_nozzle_location MOVE=1 MOVE_SPEED={St}
# _PROBE_CALIBRATE {% for p in params
# %}{'%s=%s ' % (p, params[p])}{%
# endfor %}
# M400 # mandatory to save the new safe position
#store current nozzle location
# SAVE_GCODE_STATE NAME=_original_nozzle_location
# Dock_Probe
# Restore nozzle location again at the end
# RESTORE_GCODE_STATE NAME=_original_nozzle_location MOVE=1 MOVE_SPEED={St}
# Probe Accuracy
[gcode_macro PROBE_ACCURACY]
rename_existing: _PROBE_ACCURACY
gcode:
{% set Hzh = printer["gcode_macro User_Variables"].home_z_height|float %}
{% set Sz = printer["gcode_macro User_Variables"].z_drop_speed * 60 %}
{% set St = printer["gcode_macro User_Variables"].travel_speed %}
# Go to Z safe distance before saving location in order to
# avoid crashing the probe on the bed when coming back
G1 Z{Hzh} F{Sz}
M400 # mandatory to save the new safe position
SAVE_GCODE_STATE NAME=_original_nozzle_location
CheckProbe action=query
Attach_Probe
# Restore nozzle location to probe the right place
RESTORE_GCODE_STATE NAME=_original_nozzle_location MOVE=1 MOVE_SPEED={St}
_PROBE_ACCURACY {% for p in params
%}{'%s=%s ' % (p, params[p])}{%
endfor %}
#store current nozzle location
SAVE_GCODE_STATE NAME=_original_nozzle_location
Dock_Probe
# Restore nozzle location again at the end
RESTORE_GCODE_STATE NAME=_original_nozzle_location MOVE=1 MOVE_SPEED={St}
# Homeing Override
[homing_override]
axes: yxz
gcode:
# collect user state variables
User_Variables
{% set V = printer["gcode_macro User_Variables"].verbose %}
{% set Hzh = printer["gcode_macro User_Variables"].home_z_height|float %}
{% if (not 'z' in printer.toolhead.homed_axes) %}
SET_KINEMATIC_POSITION Z=0
G90
G0 Z{Hzh} F600
{% endif %}
CheckProbe action=query
# reset parameters
{% set X, Y, Z = False, False, False %}
# which axes have been requested for homing
{% if not 'X' in params
and not 'Y' in params
and not 'Z' in params %}
{% set X, Y, Z = True, True, True %}
{% else %}
{% if 'X' in params %}
{% set X = True %}
{% endif %}
{% if 'Y' in params %}
{% set Y = True %}
{% endif %}
{% if 'Z' in params %}
{% set Z = True %}
{% 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
{% endif %}
{% endif %}
# Home x
{% if X %}
{% if V %}
{ action_respond_info("Homing X") }
{% endif %}
G28 X0
{% endif %}
# Home y
{% if Y %}
{% if V %}
{ action_respond_info("Homing Y") }
{% endif %}
G28 Y0
{% endif %}
# Home z
{% if Z %}
{% if V %}
{ action_respond_info("Homing Z") }
{% endif %}
# if probe is configured as endstop, attach it
{% if printer['configfile'].config["stepper_z"]["endstop_pin"] == 'probe:z_virtual_endstop' %}
Attach_Probe
{% endif %}
Home_Z
# if probe is configured as endstop, dock it
{% if printer['configfile'].config["stepper_z"]["endstop_pin"] == 'probe:z_virtual_endstop' %}
Dock_Probe
{% endif %}
{% endif %}
CheckProbe action=query
# park the toolhead
Park_Toolhead
# Home Z Routine
[gcode_macro Home_Z]
gcode:
{% set Zx = printer["gcode_macro Probe_Variables"].z_endstop_x %}
{% set Zy = printer["gcode_macro Probe_Variables"].z_endstop_y %}
{% set Hzh = printer["gcode_macro User_Variables"].home_z_height|float %}
{% set St = printer["gcode_macro User_Variables"].travel_speed * 60 %}
{% set Sz = printer["gcode_macro User_Variables"].z_drop_speed * 60 %}
# 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 %}
{% if (not 'z' in printer.toolhead.homed_axes) %}
{% if V %}
{ action_respond_info("Resetting Z position to zero") }
{% endif %}
SET_KINEMATIC_POSITION Z=0
{% endif %}
# move tool to safe homing position and home Z axis
# location of z endstop
G1 X{Zx} Y{Zy} Z{Hzh} F{St}
G28 Z0
G1 Z{Hzh} F{Sz}
{% endif %}
# 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={ 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 P = printer.probe.last_query %}
{% set V = printer["gcode_macro User_Variables"].verbose %}
# If triggered (true), probe not attached
{% if P %}
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=probe_attached VALUE={ False }
# If not triggered (false), probe attached
{% else %}
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=probe_attached VALUE={ True }
{% endif %}
{% if params.ACTION == 'query' %}
SET_GCODE_VARIABLE MACRO=Probe_Variables VARIABLE=probe_state VALUE={ P }
{% endif %}
# if probe fails to attach/detach
# if not docked
{% if (not P and params.ACTION == 'dock') %}
{ action_raise_error("Probe dock failed!") }
{% endif %}
# if not attached
{% if P and params.ACTION == 'attach' %}
{ action_raise_error("Probe attach failed!") }
{% endif %}
# Park Toolhead Routine
[gcode_macro Park_Toolhead]
gcode:
{% set P = printer["gcode_macro User_Variables"].park_toolhead %}
{% set Px = printer["gcode_macro User_Variables"].parkposition_x %}
{% set Py = printer["gcode_macro User_Variables"].parkposition_y %}
{% set Pz = printer["gcode_macro User_Variables"].parkposition_z %}
{% set St = printer["gcode_macro User_Variables"].travel_speed * 60 %}
{% set V = printer["gcode_macro User_Variables"].verbose %}
{% if (P and 'xyz' in printer.toolhead.homed_axes) %}
{% if V %}
{ action_respond_info("Parking Toolhead") }
{% endif %}
G90
G1 X{Px} Y{Py} Z{Pz} F{St}
{% endif %}