-
Notifications
You must be signed in to change notification settings - Fork 4
/
ercf_software.cfg
780 lines (700 loc) · 30.7 KB
/
ercf_software.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
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
###############################
# ERCF module
###############################
[ercf]
# Encoder
encoder_pin: ^ercf:PA6
encoder_resolution: 1.380072 # in mm
# Speeds and accels
# Long moves are faster than the small ones
# 100mm/s should be "quiet" with the NEMA14 motor or a NEMA17 pancake, but you can go lower if your really want it to be low noise
# Tested without any issue at 200mm/s, but it's noisy. I'm running mine at 170mm/s
long_moves_speed: 100 # mm/s. Default value is 100mm/s.
long_moves_accel: 400 # mm/s². Default value is 400mm/s²
short_moves_speed: 25 # mm/s. Default value is 25mm/s.
short_moves_accel: 400 # mm/s². Default value is 400mm/s²
[gcode_macro ERCF_VAR]
# =======================================================
# ================== VALUES TO ADJUST ===================
# =======================================================
#
# ==== Toolhead specific values ====
#
# Distance between the end of the reverse bowden and the toolhead sensor. Value is toolhead specific.
# Tested values :
# Galileo Clockwork with ERCF V1.1 sensor (hall effect) : 35.0
variable_end_of_bowden_to_sensor: 27.0
# Length from the sensor to the nozzle melt pool.
# Reduce this value if there are blobs of filament on each load, before the purge on the tower.
# Increase this value if there are big gaps on the purge tower (i.e. if it takes time for the filament to get pushed out after a swap)
# Tested values :
# Dragon Normal Flow : 60.5
variable_sensor_to_nozzle: 60.5
#
# ==== Values to tune ====
#
# Tool position for the selector. This has to be tuned manually. Please scale this array to the number of tools you have
variable_colorselector = [1.1, 21.6, 42.4, 70.4, 92.0, 112.0] #, 139.2, 160.8, 181.6]
# Base value for the loading length used by the auto-calibration macro
# Please use a value SMALLER than the real reverse bowden length (like 50mm less)
variable_min_bowden_length: 710.0
# Servo angle for the Up position (i.e. tool disengaged). Refer to the manual to know how to properly tune this value
# Default values:
# MG90S servo : 30
# SAVOX SH0255MG : 140
variable_servo_up_angle: 20
# Servo angle for the Down position (i.e. tool engaged). Refer to the manual to know how to properly tune this value
# Default values:
# MG90S servo : 140
# SAVOX SH0255MG : 30
variable_servo_down_angle: 110
# Options to use or not
# Beware that the clog detection and endless spool mode are in BETA mode for now
# Use at your own risk (beware of the involved macros and the pause(s) and resume ones)
# Put 0 to disable, 1 to enable
variable_clog_detection: 0
variable_endless_spool_mode: 0
# =======================================================
# ============ END OF VALUES TO ADJUST ==================
# =======================================================
# You shouldn't have to change anything below this point
# Things that you shouldn't have to change
variable_unload_modifier: 9.0 # Modifier to adjust the ERCF park position (where the filament ends when doing an unload)
variable_min_temp_extruder: 180 # Temp used during the auto-calibration macro, to ensure we can move the extruder (but not really extruding)
variable_extruder_eject_temp: 240 # Temp used during filament ejection (in the ERCF_HOME macro, if a filament is detected in the toolhead)
variable_timeout_pause: 72000 # Time out used by the ERCF_PAUSE
variable_disable_heater: 600 # Delay after which the hotend heater is disabled in the ERCF_PAUSE state
gcode:
[save_variables]
filename: /home/pi/klipper_config/ercf_vars.cfg
###############################
# ERCF Calibration macros
###############################
[gcode_macro ERCF_CALIB_SELECTOR]
gcode:
ERCF_SERVO_UP
{% set move_length=(20.0 + (params.TOOL|int + 1)*21.0 + ((params.TOOL|int + 1)/3)*5.0) %}
M118 Measuring the selector position for tool {params.TOOL}
ERCF_GET_SELECTOR_POS REF={move_length|int}
ERCF_MOTORS_OFF
[gcode_macro ERCF_CALIBRATE]
gcode:
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
M118 Start the complete auto calibration...
M118 First home the ERCF
ERCF_HOME
{% for chan in range(printer["gcode_macro ERCF_VAR"].colorselector|length) %}
ERCF_CALIBRATE_SINGLE TOOL={chan|int}
{% endfor %}
M118 End of the complete auto calibration!
M118 Please reload the firmware for the calibration to be active!
[gcode_macro ERCF_CALIBRATE_SINGLE]
gcode:
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
{% if params.TOOL|int >= 0 and params.TOOL|int < printer["gcode_macro ERCF_VAR"].colorselector|length %}
{% if printer["gcode_macro ERCF_HOME"].home == -1 %}
M118 First home the ERCF
ERCF_HOME
{% endif %}
ERCF_SELECT_TOOL TOOL={params.TOOL}
ERCF_SET_STEPS RATIO=1.0
{% if params.TOOL|int == 0 %}
{% if printer['extruder'].temperature < printer["gcode_macro ERCF_VAR"].min_temp_extruder %}
M109 S{printer["gcode_macro ERCF_VAR"].min_temp_extruder|int}
{% endif %}
M118 Calibrating reference tool {params.TOOL}
ERCF_LOAD LENGTH={printer["gcode_macro ERCF_VAR"].min_bowden_length}
ERCF_HOME_EXTRUDER TOTAL_LENGTH=400 STEP_LENGTH=0.5
ERCF_CALIB_SAVE_VAR TOOL={params.TOOL}
G91
G92 E0
MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=gear_stepper MOVE=-{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float} SPEED=25 ACCEL=0 SYNC=0
G1 E-{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float} F1500.0
ERCF_CALIB_UNLOAD
ERCF_BUZZ_GEAR_MOTOR
ERCF_IS_FILAMENT_STUCK_IN_ERCF
ERCF_UNSELECT_TOOL
{% else %}
M118 Calibrating tool {params.TOOL}
ERCF_LOAD LENGTH={printer["gcode_macro ERCF_VAR"].min_bowden_length|float - 100.0}
ERCF_CALIB_SAVE_VAR tool={params.TOOL}
ERCF_CALIB_UNLOAD LENGTH={printer["gcode_macro ERCF_VAR"].min_bowden_length|float - 100.0 + 27.0}
{% endif %}
{% else %}
M118 Tool out of range
{% endif %}
[gcode_macro ERCF_CALIB_SAVE_VAR]
gcode:
{% if params.TOOL|int == 0 %}
M118 Tool {params.TOOL} calibration value is {printer['ercf'].encoder_pos|float}
SAVE_VARIABLE VARIABLE=ercf_calib_ref VALUE={printer['ercf'].encoder_pos|float} # this is the reference value
SAVE_VARIABLE VARIABLE=ercf_calib_{params.TOOL|int} VALUE=1.0
SET_GCODE_VARIABLE MACRO=ERCF_CALIB_UNLOAD VARIABLE=ref VALUE={printer['ercf'].encoder_pos|float}
SET_GCODE_VARIABLE MACRO=ERCF_CALIB_UNLOAD VARIABLE=ratio VALUE=1.0
{% else %}
{% set ratio = (printer["gcode_macro ERCF_VAR"].min_bowden_length|float - 100.0) / printer['ercf'].encoder_pos|float %}
M118 Tool {params.TOOL} ratio is {ratio|float}
SAVE_VARIABLE VARIABLE=ercf_calib_{params.TOOL|int} VALUE={ratio|float}
SET_GCODE_VARIABLE MACRO=ERCF_CALIB_UNLOAD VARIABLE=ratio VALUE={ratio|float}
{% endif %}
[gcode_macro ERCF_CALIB_UNLOAD]
variable_ratio: 0.0
variable_ref: 0.0
default_parameter_LENGTH: 0.0
gcode:
{% if LENGTH|float == 0.0 %}
ERCF_UNLOAD LENGTH={(ref|float)*(ratio|float) - printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float + 27.0}
{% else %}
{% if ratio|float < 1.0 %} # No correction move is done in case of "over targeting", hence the correction ratio is not applied during this unload sequence
ERCF_UNLOAD LENGTH={(LENGTH|float)}
{% else %}
ERCF_UNLOAD LENGTH={(LENGTH|float)*(ratio|float)}
{% endif %}
{% endif %}
[respond]
default_type: command
###############################
# ERCF servo
###############################
# Push the top hat down (enable the bondtech gears) while "buzzing" the gear motor to ensure proper BMG gear meshing
[gcode_macro ERCF_SERVO_DOWN]
gcode:
MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=gear_stepper MOVE=0.5 SPEED=25 ACCEL=0 SYNC=0
SET_SERVO SERVO=ercf_servo ANGLE={printer["gcode_macro ERCF_VAR"].servo_down_angle}
G4 P300
MANUAL_STEPPER STEPPER=gear_stepper MOVE=0.0 SPEED=25 ACCEL=0 SYNC=0
G4 P100
MANUAL_STEPPER STEPPER=gear_stepper MOVE=-0.5 SPEED=25 ACCEL=0 SYNC=0
G4 P300
MANUAL_STEPPER STEPPER=gear_stepper MOVE=0.0 SPEED=25 ACCEL=0
SET_SERVO SERVO=ercf_servo WIDTH=0.0
# Pull the top hat up (disengage the bondtech gears)
[gcode_macro ERCF_SERVO_UP]
gcode:
SET_SERVO SERVO=ercf_servo ANGLE={printer["gcode_macro ERCF_VAR"].servo_up_angle}
G4 P250
SET_SERVO SERVO=ercf_servo WIDTH=0.0
###############################
# ERCF motors
###############################
[gcode_macro ERCF_MOTORS_ON]
gcode:
MANUAL_STEPPER STEPPER=gear_stepper ENABLE=1
MANUAL_STEPPER STEPPER=selector_stepper ENABLE=1
[gcode_macro ERCF_MOTORS_OFF]
gcode:
MANUAL_STEPPER STEPPER=gear_stepper ENABLE=0
MANUAL_STEPPER STEPPER=selector_stepper ENABLE=0
###############################
# ERCF endstop status
###############################
# Display the last queried status
[gcode_macro ERCF_ENDSTOPS_STATUS]
gcode:
M118 Endstops status :
M118 Extruder : {printer.query_endstops.last_query["manual_stepper gear_stepper"]}
M118 ERCF home : {printer.query_endstops.last_query["manual_stepper selector_stepper"]}
# Query and display the status
[gcode_macro ERCF_INFO]
gcode:
QUERY_ENDSTOPS
ERCF_ENDSTOPS_STATUS
###############################
# PAUSE MACROS
# ERCF_PAUSE is called when an human intervention is needed
# use ERCF_UNLOCK to start the manual intervention
# and use RESUME when the intervention is over to resume the current print
###############################
# Stop the delayed stop of the heater
[gcode_macro ERCF_UNLOCK]
gcode:
M118 Unlock the ERCF
SET_GCODE_VARIABLE MACRO=ERCF_PAUSE VARIABLE=is_paused VALUE=0
SET_GCODE_VARIABLE MACRO=ERCF_PAUSE VARIABLE=is_changing_filament VALUE=0
UPDATE_DELAYED_GCODE ID=disable_heater DURATION=0
ERCF_UNSELECT_TOOL
M104 S{printer["gcode_macro ERCF_PAUSE"].extruder_temp}
RESTORE_GCODE_STATE NAME=ERCF_state
M118 Refer to the manual before resuming the print
[delayed_gcode disable_heater]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int != 0 %}
M118 Disable extruder heater
M104 S0
{% endif %}
# Pause the ERCF, park the extruder at the parking position
# Save the current state and start the delayed stop of the heated
# modify the timeout of the printer accordingly to timeout_pause
[gcode_macro ERCF_PAUSE]
variable_is_paused: 0
variable_extruder_temp: 0
variable_is_changing_filament: 0
gcode:
SET_GCODE_VARIABLE MACRO=ERCF_PAUSE VARIABLE=extruder_temp VALUE={printer.extruder.target}
SET_GCODE_VARIABLE MACRO=ERCF_PAUSE VARIABLE=is_paused VALUE=1
SET_IDLE_TIMEOUT TIMEOUT={printer["gcode_macro ERCF_VAR"].timeout_pause}
UPDATE_DELAYED_GCODE ID=disable_heater DURATION={printer["gcode_macro ERCF_VAR"].disable_heater}
M118 An issue with the ERCF has been detected and the ERCF has been PAUSED
M118 When you intervene to fix the issue, first call the "ERCF_UNLOCK" Gcode
M118 Refer to the manual before resuming the print
SAVE_GCODE_STATE NAME=ERCF_state
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
{% if printer["gcode_macro ERCF_PAUSE"].is_changing_filament|int != 0 %}
G91
G1 Z-3
G90
{% endif %}
PAUSE
############################################
# Changing tool macros
# ERCF_CHANGE_TOOL_STANDALONE TOOL=XX to change filament outside of a print
# ERCF_CHANGE_TOOL_SUSIE TOOL=XX will be called automatically (from the ACTIVATE_EXTRUDER gcode from SuperSlicer), don't use that for "manual" filament swap
# if the new extruder is different from the current extruder :
# eject the filament if needed
# load the new one
###########################################
[gcode_macro ACTIVATE_EXTRUDER]
rename_existing: CHANGE_TOOL
gcode:
{% if EXTRUDER == "extruder" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=0
{% elif EXTRUDER == "extruder1" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=1
{% elif EXTRUDER == "extruder2" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=2
{% elif EXTRUDER == "extruder3" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=3
{% elif EXTRUDER == "extruder4" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=4
{% elif EXTRUDER == "extruder5" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=5
{% elif EXTRUDER == "extruder6" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=6
{% elif EXTRUDER == "extruder7" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=7
{% elif EXTRUDER == "extruder8" %}
ERCF_CHANGE_TOOL_SUSIE TOOL=8
{% endif %}
[gcode_macro ERCF_CHANGE_TOOL_SUSIE]
gcode:
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
{% if printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int != params.TOOL|int %}
# Add a variable 'SwapCounter' in your PRINT_START macro to display this info
# {% set newcounter = (printer["gcode_macro PRINT_START"].swapcounter|int + 1) %}
# SET_GCODE_VARIABLE MACRO=PRINT_START VARIABLE=swapcounter VALUE={newcounter}
# M118 Swap {newcounter|int}
M117 Change Tool T{params.TOOL|int}
G91
SET_GCODE_VARIABLE MACRO=ERCF_PAUSE VARIABLE=is_changing_filament VALUE=1
G1 Z3
G90
ERCF_UNLOAD_TOOL
ERCF_LOAD_TOOL TOOL={params.TOOL|int}
G91
G1 Z-3
G90
SET_GCODE_VARIABLE MACRO=ERCF_PAUSE VARIABLE=is_changing_filament VALUE=0
ERCF_CHANGE_TOOL_SUSIE_END
{% endif %}
[gcode_macro ERCF_CHANGE_TOOL_SUSIE_END]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
{% if printer["gcode_macro PRINT_START"].clog_detection|int == 1 %}
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=1
{% endif %}
{% endif %}
[gcode_macro ERCF_CHANGE_TOOL_STANDALONE]
gcode:
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
{% if printer["gcode_macro ERCF_HOME"].home == -1 %}
M118 ERCF not homed, homing it...
ERCF_HOME
M117 Change Tool T{params.TOOL|int}
ERCF_LOAD_TOOL TOOL={params.TOOL|int}
{% elif printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int != params.TOOL|int %}
M117 Change Tool T{params.TOOL|int}
{% if printer['filament_switch_sensor toolhead_sensor'].filament_detected == True %}
M118 Unloading current filament
{% if printer['extruder'].temperature < 178 %}
M118 Preheat Nozzle
M109 S{printer["gcode_macro ERCF_VAR"].extruder_eject_temp}
{% endif %}
ERCF_EJECT
{% endif %}
ERCF_LOAD_TOOL TOOL={params.TOOL|int}
{% endif %}
############################################
# Unloading/Loading Macros
############################################
# Load filament from ERCF to nozzle
[gcode_macro ERCF_LOAD_TOOL]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
{% if printer["gcode_macro ERCF_HOME"].home == -1 %}
M118 ERCF not homed, homing it...
ERCF_HOME
{% endif %}
M118 Loading tool {params.TOOL|int} ...
ERCF_SELECT_TOOL TOOL={params.TOOL|int}
{% set ercf_params = printer.save_variables.variables %}
ERCF_SET_STEPS RATIO={ercf_params['ercf_calib_%s' % (params.TOOL|string)]}
M118 Loading filament from ERCF to extruder ...
{% set ercf_params = printer.save_variables.variables %}
ERCF_LOAD LENGTH={ercf_params.ercf_calib_ref|float - printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float}
ERCF_LOAD_FILAMENT_IN_EXTRUDER
{% endif %}
# Unload filament from nozzle to ERCF, using built-in tip forming macro
[gcode_macro ERCF_EJECT]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
{% if printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int != -1 %}
M118 Unloading tool {printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int} ...
{% if printer['filament_switch_sensor toolhead_sensor'].filament_detected == True %}
ERCF_UNLOAD_FILAMENT_IN_EXTRUDER_WITH_TIP_FORMING
{% set ercf_params = printer.save_variables.variables %}
ERCF_SET_STEPS RATIO={ercf_params['ercf_calib_%s' % (printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|string)]}
ERCF_UNLOAD LENGTH={ercf_params.ercf_calib_ref|float - printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float + printer["gcode_macro ERCF_VAR"].unload_modifier|float}
ERCF_BUZZ_GEAR_MOTOR
ERCF_IS_FILAMENT_STUCK_IN_ERCF
ERCF_UNSELECT_TOOL
{% else %}
ERCF_EJECT_UNKNOW_STATE
{% endif %}
{% else %}
ERCF_EJECT_UNKNOW_STATE
{% endif %}
{% endif %}
# Unload filament from nozzle to ERCF, using SuperSlicer ramming
[gcode_macro ERCF_UNLOAD_TOOL]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
{% if printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int != -1 %}
M118 Unload tool {printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int} ...
ERCF_HOME_EXTRUDER
ERCF_SELECT_TOOL TOOL={printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int}
{% set ercf_params = printer.save_variables.variables %}
ERCF_SET_STEPS RATIO={ercf_params['ercf_calib_%s' % (params.TOOL|string)]}
G91
G92 E0
MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=gear_stepper MOVE=-{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float} SPEED=25 ACCEL=0 SYNC=0
G1 E-{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float} F1500.0
{% set ercf_params = printer.save_variables.variables %}
ERCF_UNLOAD LENGTH={ercf_params.ercf_calib_ref|float - printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float + printer["gcode_macro ERCF_VAR"].unload_modifier|float}
ERCF_BUZZ_GEAR_MOTOR
ERCF_IS_FILAMENT_STUCK_IN_ERCF
ERCF_UNSELECT_TOOL
{% endif %}
{% endif %}
############################################
# Select/Unselect a tool
# move the selector (if needed) to the requested tool
############################################
# Select a tool. move the idler and then move the color selector (if needed)
[gcode_macro ERCF_SELECT_TOOL]
variable_tool_selected: -1
variable_color_selected: -1
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
{% if printer["gcode_macro ERCF_HOME"].home != -1 %}
M118 Select Tool {params.TOOL} ...
ERCF_SERVO_UP
MANUAL_STEPPER STEPPER=selector_stepper MOVE={printer["gcode_macro ERCF_VAR"].colorselector[params.TOOL|int]}
SET_GCODE_VARIABLE MACRO=ERCF_SELECT_TOOL VARIABLE=tool_selected VALUE={params.TOOL}
SET_GCODE_VARIABLE MACRO=ERCF_SELECT_TOOL VARIABLE=color_selected VALUE={params.TOOL}
ERCF_SERVO_DOWN
M118 Tool {params.TOOL} Enabled
{% else %}
M118 Could not select tool, ERCF is not homed
{% endif %}
{% endif %}
# Unselect a tool
[gcode_macro ERCF_UNSELECT_TOOL]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
{% if printer["gcode_macro ERCF_HOME"].home != -1 %}
ERCF_SERVO_UP
SET_GCODE_VARIABLE MACRO=ERCF_SELECT_TOOL VARIABLE=tool_selected VALUE=-1
{% if printer['filament_switch_sensor toolhead_sensor'].filament_detected == False %}
SET_GCODE_VARIABLE MACRO=ERCF_SELECT_TOOL VARIABLE=color_selected VALUE=-1
{% endif %}
ERCF_SET_STEPS RATIO=1.0
{% else %}
M118 Could not unselect tool, ERCF is not homed
{% endif %}
{% endif %}
############################################
# Loading/Unloading part FROM/TO EXTRUDER TO/FROM NOZZLE
############################################
# Load the filament into the extruder
# Call ERCF_PAUSE if the filament is not detected by the toolhead sensor
[gcode_macro ERCF_LOAD_FILAMENT_IN_EXTRUDER]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
{% if printer.extruder.temperature > printer["gcode_macro ERCF_VAR"].min_temp_extruder %}
M118 Loading Filament...
G91
G92 E0
MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=gear_stepper MOVE={printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float - 7} SPEED=25 ACCEL=0 SYNC=0
G1 E{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float - 7} F1500.0
G4 P100
ERCF_HOME_EXTRUDER TOTAL_LENGTH=30.0 STEP_LENGTH=0.5
ERCF_UNSELECT_TOOL
G1 E15 F1800
G1 E{printer["gcode_macro ERCF_VAR"].sensor_to_nozzle - 20} F1800
G1 E5 F600
G92 E0
G90
M118 Load Complete
{% else %}
M118 Extruder too cold
ERCF_PAUSE
{% endif %}
{% endif %}
# StandAlone cooling moves to extract proper filament tip
[gcode_macro ERCF_FORM_TIP_STANDALONE]
gcode:
G91
G92 E0
G1 E-9.05 F1200
G1 E0.68 F165
G1 E0.70 F168
G1 E0.73 F177
G1 E0.78 F189
G1 E0.82 F197
G1 E0.84 F204
G1 E0.90 F216
G1 E0.97 F234
G1 E1.02 F246
G1 E1.04 F250
G1 E-15.00 F6000.0
G1 E-24.50 F5400.0
G1 E-7.00 F2700.0
G1 E-3.50 F1620.0
G1 E20.00 F900.0
G1 E-13 F500.0
G1 E13 F400.0
G1 E-11 F500.0
G1 E11 F400.0
G1 E-2.00 F50.0
G92 E0
# Unload from extruder with tip forming sequence
[gcode_macro ERCF_UNLOAD_FILAMENT_IN_EXTRUDER_WITH_TIP_FORMING]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
{% if printer.extruder.temperature > printer["gcode_macro ERCF_VAR"].min_temp_extruder %}
{% if printer["gcode_macro ERCF_SELECT_TOOL"].tool_selected|int == -1 %}
M118 Forming filament tip and Unloading Filament...
G91
ERCF_FORM_TIP_STANDALONE
G1 E-4.00 F1200.0
G1 E-15.00 F2000
ERCF_HOME_EXTRUDER
ERCF_SERVO_DOWN
G91
G92 E0
MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=gear_stepper MOVE=-{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float} SPEED=25 ACCEL=0 SYNC=0
G1 E-{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float} F1500.0
M118 Filament removed
{% else %}
M118 Tool selected, UNSELECT it
ERCF_PAUSE
{% endif %}
{% else %}
M118 Extruder too cold
ERCF_PAUSE
{% endif %}
{% endif %}
############################################
# Endstop check macros
############################################
# Call ERCF_PAUSE if the filament is not detected by the toolhead sensor
[gcode_macro ERCF_IS_FILAMENT_IN_EXTRUDER]
gcode:
{% if printer['filament_switch_sensor toolhead_sensor'].filament_detected == True %}
M118 Filament is in extruder
{% else %}
M118 Filament not in extruder
ERCF_PAUSE
{% endif %}
# Call ERCF_PAUSE if the filament is stuck in the ERCF
[gcode_macro ERCF_IS_FILAMENT_STUCK_IN_ERCF]
gcode:
{% if printer.ercf.encoder_pos|float != 0 %}
M118 Filament stuck in ERCF
ERCF_PAUSE
{% else %}
M118 Filament not in ERCF
{% endif %}
############################################
# Macros called during homing to try to eject the filament if loaded
############################################
# Eject from extruder gear to the ERCF
[gcode_macro ERCF_EJECT_UNKNOW_STATE]
gcode:
M118 Eject Filament if loaded ...
{% if printer['filament_switch_sensor toolhead_sensor'].filament_detected == True %}
M118 Filament in extruder, trying to eject it ..
{% if printer['extruder'].temperature < 178 %}
M118 Preheat Nozzle
M109 S{printer["gcode_macro ERCF_VAR"].extruder_eject_temp}
{% endif %}
ERCF_UNLOAD_FILAMENT_IN_EXTRUDER_WITH_TIP_FORMING
ERCF_UNLOAD LENGTH={printer["gcode_macro ERCF_VAR"].min_bowden_length - 50}
{% else %}
ERCF_SERVO_DOWN
{% endif %}
ERCF_BUZZ_GEAR_MOTOR
G4 P200
ERCF_EJECT_FROM_BOWDEN
# Eject from the bowden to the ERCF
[gcode_macro ERCF_EJECT_FROM_BOWDEN]
gcode:
{% if printer.ercf.encoder_pos|float != 0 %}
ERCF_UNLOAD HOMING=1
M118 Filament ejected !
{% else %}
M118 Filament already ejected !
{% endif %}
ERCF_SERVO_UP
############################################
# Homing macros
# ERCF_HOME must be called before using the ERCF
############################################
# Home the ERCF
# eject filament if loaded with ERCF_EJECT_UNKNOW_STATE
# next home the ERCF with ERCF_HOME_ONLY
[gcode_macro ERCF_HOME]
variable_home: -1
gcode:
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
SET_GCODE_VARIABLE MACRO=ERCF_HOME VARIABLE=home VALUE=1
M118 Homing ERCF ...
QUERY_ENDSTOPS
ERCF_EJECT_UNKNOW_STATE
ERCF_HOME_ONLY
[gcode_macro ERCF_HOME_SELECTOR]
gcode:
M118 Homing selector
ERCF_SERVO_UP
{% set number_of_chan=printer["gcode_macro ERCF_VAR"].colorselector|length %}
{% set selector_length=(20.0 + number_of_chan*21.0 + (number_of_chan/3)*5.0) %}
MANUAL_STEPPER STEPPER=selector_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=selector_stepper SPEED=100 MOVE=-{selector_length|float} STOP_ON_ENDSTOP=1
MANUAL_STEPPER STEPPER=selector_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=selector_stepper SPEED=100 MOVE=5.0
MANUAL_STEPPER STEPPER=selector_stepper SPEED=10 MOVE=-10.0 STOP_ON_ENDSTOP=1
MANUAL_STEPPER STEPPER=selector_stepper SET_POSITION=0
SET_GCODE_VARIABLE MACRO=ERCF_SELECT_TOOL VARIABLE=tool_selected VALUE=-1
SET_GCODE_VARIABLE MACRO=ERCF_SELECT_TOOL VARIABLE=color_selected VALUE=-1
# Home the ERCF:
# 1) home the color selector (if needed)
# 2) try to load filament 0 to ERCF and then unload it. Used to verify the ERCF gear
# if all is ok, the ERCF is ready to be used
[gcode_macro ERCF_HOME_ONLY]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
ERCF_HOME_SELECTOR
M118 Test load filament 1
ERCF_SELECT_TOOL TOOL=0
ERCF_SET_STEPS RATIO=1.0
M118 Loading filament to ERCF...
ERCF_LOAD LENGTH=50
G4 P50
ERCF_UNLOAD LENGTH=73
ERCF_UNSELECT_TOOL
SET_GCODE_VARIABLE MACRO=ERCF_HOME VARIABLE=home VALUE=1
M118 Homing ERCF ended ...
{% else %}
M118 Homing ERCF failed, ERCF is paused, run "ERCF_UNLOCK" to unlock it ...
{% endif %}
###############################################
# Test Macros
###############################################
[gcode_macro ERCF_TEST_MOVE_GEAR]
default_parameter_LENGTH: 200.0
default_parameter_SPEED: 50.0
default_parameter_ACCEL: 200.0
gcode:
MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=gear_stepper MOVE={LENGTH|float} SPEED={SPEED|float} ACCEL={ACCEL|float}
# Push the servo down (enable the bondtech gears)
[gcode_macro ERCF_TEST_SERVO]
gcode:
SET_SERVO SERVO=ercf_servo ANGLE={params.VALUE|float}
G4 P250
SET_SERVO SERVO=ercf_servo WIDTH=0.0
[gcode_macro ERCF_TEST_GRIP]
gcode:
ERCF_SERVO_DOWN
ERCF_MOTORS_OFF
###############################################
# Endless spool mode and clog detection
###############################################
[gcode_macro ERCF_ENCODER_MOTION_ISSUE]
gcode:
M118 Issue on tool {printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int}
M118 Checking if this is a clog or a runout...
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
ERCF_SERVO_DOWN
ERCF_BUZZ_GEAR_MOTOR
ERCF_SERVO_UP
ERCF_CLOG_OR_RUNOUT
[gcode_macro ERCF_CLOG_OR_RUNOUT]
gcode:
{% if printer.ercf.encoder_pos|float != 0 %}
M118 Clog detected, please check the ERCF and the printer
{% else %}
M118 Runout detected !
{% if printer["gcode_macro ERCF_VAR"].endless_spool_mode|int == 1 %}
{% if printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int >= (printer["gcode_macro ERCF_VAR"].colorselector|length -1) %}
{% set nexttool = 0 %}
{% else %}
{% set nexttool = (printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|int + 1) %}
{% endif %}
M118 Loading tool {nexttool|int}
SAVE_GCODE_STATE NAME=ERCF_Pre_Brush_init
# Adapt the example below to your own setup
# The goal is just to clean the nozzle after the change
# In my case I have a purge bucket with a brush
# G0 X45 Y300 F18000
# G0 X45 Y310 Z1 F3000
# Custom unload sequence
M118 Forming filament tip and Unloading Filament...
G91
ERCF_FORM_TIP_STANDALONE
ERCF_HOME_EXTRUDER TOTAL_LENGTH={printer["gcode_macro ERCF_VAR"].sensor_to_nozzle} STEP_LENGTH=2.0
ERCF_SERVO_DOWN
G91
G92 E0
MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
MANUAL_STEPPER STEPPER=gear_stepper MOVE=-{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float} SPEED=25 ACCEL=0 SYNC=0
G1 E-{printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float} F1500.0
{% set ercf_params = printer.save_variables.variables %}
ERCF_SET_STEPS RATIO={ercf_params['ercf_calib_%s' % (printer["gcode_macro ERCF_SELECT_TOOL"].color_selected|string)]}
ERCF_UNLOAD LENGTH={ercf_params.ercf_calib_ref|float - printer["gcode_macro ERCF_VAR"].end_of_bowden_to_sensor|float + printer["gcode_macro ERCF_VAR"].unload_modifier|float}
ERCF_UNSELECT_TOOL
ERCF_LOAD_TOOL TOOL={nexttool|int}
ERCF_CHECK_IF_RESUME
{% else %}
M118 EndlessSpool mode not enabled, please do something
{% endif %}
{% endif %}
[gcode_macro ERCF_CHECK_IF_RESUME]
gcode:
{% if printer["gcode_macro ERCF_PAUSE"].is_paused|int == 0 %}
# Adapt the example below to your own setup
# The goal is just to clean the nozzle after the change
# In my case I have a purge bucket with a brush
# BRUSH_PURGE LENGTH=50
# BRUSH_CLEAN
RESTORE_GCODE_STATE NAME=ERCF_Pre_Brush_init
RESUME
{% if printer["gcode_macro ERCF_VAR"].clog_detection|int == 1 %}
SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=1
{% endif %}
{% endif %}