Compare commits
	
		
			No commits in common. "main" and "prusamini" have entirely different histories.
		
	
	
		
	
		
					 19 changed files with 390 additions and 2735 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,2 +0,0 @@
 | 
				
			||||||
*.bkp
 | 
					 | 
				
			||||||
*.swp
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,46 +0,0 @@
 | 
				
			||||||
[printer v2.4]
 | 
					 | 
				
			||||||
# Define distances and speeds for the extrude panel. CSV list 2 to 4 integers the second
 | 
					 | 
				
			||||||
# value is default
 | 
					 | 
				
			||||||
extrude_distances: 5, 10, 15, 25
 | 
					 | 
				
			||||||
extrude_speeds: 2, 5, 10, 25
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[preheat PLA]
 | 
					 | 
				
			||||||
bed = 50
 | 
					 | 
				
			||||||
extruder = 200
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[preheat PETG]
 | 
					 | 
				
			||||||
bed = 80
 | 
					 | 
				
			||||||
extruder = 240
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[preheat ASA]
 | 
					 | 
				
			||||||
bed = 100
 | 
					 | 
				
			||||||
extruder = 230
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[preheat ABS]
 | 
					 | 
				
			||||||
bed = 110
 | 
					 | 
				
			||||||
extruder = 255
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#~# --- Do not edit below this line. This section is auto generated --- #~#
 | 
					 | 
				
			||||||
#~#
 | 
					 | 
				
			||||||
#~# [main]
 | 
					 | 
				
			||||||
#~# move_speed_xy = 100
 | 
					 | 
				
			||||||
#~# print_sort_dir = date_desc
 | 
					 | 
				
			||||||
#~# 
 | 
					 | 
				
			||||||
#~# [displayed_macros Printer]
 | 
					 | 
				
			||||||
#~# dump_parameters = False
 | 
					 | 
				
			||||||
#~# dump_warnings = False
 | 
					 | 
				
			||||||
#~# get_timelapse_setup = False
 | 
					 | 
				
			||||||
#~# hyperlapse = False
 | 
					 | 
				
			||||||
#~# m601 = False
 | 
					 | 
				
			||||||
#~# m900 = False
 | 
					 | 
				
			||||||
#~# t6 = False
 | 
					 | 
				
			||||||
#~# t7 = False
 | 
					 | 
				
			||||||
#~# t8 = False
 | 
					 | 
				
			||||||
#~# print_layer_change = False
 | 
					 | 
				
			||||||
#~# print_start = False
 | 
					 | 
				
			||||||
#~# notify_bed = False
 | 
					 | 
				
			||||||
#~# notify_extruder = False
 | 
					 | 
				
			||||||
#~# test_stream_delay = False
 | 
					 | 
				
			||||||
#~# timelapse_render = False
 | 
					 | 
				
			||||||
#~# timelapse_take_frame = False
 | 
					 | 
				
			||||||
#~#
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,60 +0,0 @@
 | 
				
			||||||
#### crowsnest.conf
 | 
					 | 
				
			||||||
#### This is a typical default config.
 | 
					 | 
				
			||||||
#### Also used as default in mainsail / MainsailOS
 | 
					 | 
				
			||||||
#### See:
 | 
					 | 
				
			||||||
#### https://github.com/mainsail-crew/crowsnest/blob/master/README.md
 | 
					 | 
				
			||||||
#### for details to configure to your needs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
####                                                            #####
 | 
					 | 
				
			||||||
####      Information about ports and according URL's           #####
 | 
					 | 
				
			||||||
####                                                            #####
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
####                                                            #####
 | 
					 | 
				
			||||||
####    Port 8080 equals /webcam/?action=[stream/snapshot]      #####
 | 
					 | 
				
			||||||
####    Port 8081 equals /webcam2/?action=[stream/snapshot]     #####
 | 
					 | 
				
			||||||
####    Port 8082 equals /webcam3/?action=[stream/snapshot]     #####
 | 
					 | 
				
			||||||
####    Port 8083 equals /webcam4/?action=[stream/snapshot]     #####
 | 
					 | 
				
			||||||
####                                                            #####
 | 
					 | 
				
			||||||
####    Note: These ports are default for most Mainsail         #####
 | 
					 | 
				
			||||||
####    installations. To use any other port would involve      #####
 | 
					 | 
				
			||||||
####    changing the proxy configuration or using directly      #####
 | 
					 | 
				
			||||||
####    http://<ip>:<port>/?action=[stream/snapshot]            #####
 | 
					 | 
				
			||||||
####                                                            #####
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
####    RTSP Stream URL: ( if enabled and supported )           #####
 | 
					 | 
				
			||||||
####    rtsp://<ip>:<rtsp_port>/stream.h264                     #####
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[crowsnest]
 | 
					 | 
				
			||||||
log_path: ~/printer_data/logs/crowsnest.log
 | 
					 | 
				
			||||||
log_level: verbose                      # Valid Options are quiet/verbose/debug
 | 
					 | 
				
			||||||
delete_log: false                       # Deletes log on every restart, if set to true
 | 
					 | 
				
			||||||
no_proxy: false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## LEGACY
 | 
					 | 
				
			||||||
[cam 1]
 | 
					 | 
				
			||||||
mode: ustreamer                         # ustreamer - Provides mjpg and snapshots. (All devices)
 | 
					 | 
				
			||||||
                                        # camera-streamer - Provides webrtc, mjpg and snapshots. (rpi + Raspi OS based only)
 | 
					 | 
				
			||||||
enable_rtsp: false                      # If camera-streamer is used, this enables also usage of an rtsp server
 | 
					 | 
				
			||||||
rtsp_port: 8554                         # Set different ports for each device!
 | 
					 | 
				
			||||||
port: 8080                              # HTTP/MJPG Stream/Snapshot Port
 | 
					 | 
				
			||||||
device: /dev/video0                     # See Log for available ...
 | 
					 | 
				
			||||||
resolution: 640x480                     # widthxheight format
 | 
					 | 
				
			||||||
max_fps: 15                             # If Hardware Supports this it will be forced, otherwise ignored/coerced.
 | 
					 | 
				
			||||||
#custom_flags:                          # You can run the Stream Services with custom flags.
 | 
					 | 
				
			||||||
#v4l2ctl:                               # Add v4l2-ctl parameters to setup your camera, see Log what your cam is capable of.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# ## LIBCAMERA
 | 
					 | 
				
			||||||
# [cam 1]
 | 
					 | 
				
			||||||
# mode: camera-streamer                   # ustreamer - Provides mjpg and snapshots. (All devices)
 | 
					 | 
				
			||||||
# # enable_rtsp: false                      # If camera-streamer is used, this enables also usage of an rtsp server
 | 
					 | 
				
			||||||
# # rtsp_port: 8554                         # Set different ports for each device!
 | 
					 | 
				
			||||||
# # port: 8080                              # HTTP/MJPG Stream/Snapshot Port
 | 
					 | 
				
			||||||
# device: /dev/v4l/by-path/platform-3f801000.csi-video-index0                     # See Log for available ...
 | 
					 | 
				
			||||||
# # resolution: 1920x1080                   # widthxheight format
 | 
					 | 
				
			||||||
# # max_fps: 15                             # If Hardware Supports this it will be forced, otherwise ignored/coerced.
 | 
					 | 
				
			||||||
# #custom_flags:                          # You can run the Stream Services with custom flags.
 | 
					 | 
				
			||||||
# #v4l2ctl:                               # Add v4l2-ctl parameters to setup your camera, see Log what your cam is capable of.
 | 
					 | 
				
			||||||
							
								
								
									
										82
									
								
								ebb36.cfg
									
										
									
									
									
								
							
							
						
						
									
										82
									
								
								ebb36.cfg
									
										
									
									
									
								
							| 
						 | 
					@ -1,82 +0,0 @@
 | 
				
			||||||
# This file contains common pin mappings for the BIGTREETECH EBBCan
 | 
					 | 
				
			||||||
# Canbus board. To use this config, the firmware should be compiled for the
 | 
					 | 
				
			||||||
# STM32G0B1 with "8 MHz crystal" and "USB (on PA11/PA12)" or "CAN bus (on PB0/PB1)".
 | 
					 | 
				
			||||||
# The "EBB Can" micro-controller will be used to control the components on the nozzle.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# See docs/Config_Reference.md for a description of parameters.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[mcu EBBCan]
 | 
					 | 
				
			||||||
# serial: /dev/serial/by-id/usb-Klipper_Klipper_firmware_12345-if00
 | 
					 | 
				
			||||||
canbus_uuid: 8192d675a56e
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[adxl345]
 | 
					 | 
				
			||||||
cs_pin: EBBCan: PB12
 | 
					 | 
				
			||||||
spi_software_sclk_pin: EBBCan: PB10
 | 
					 | 
				
			||||||
spi_software_mosi_pin: EBBCan: PB11
 | 
					 | 
				
			||||||
spi_software_miso_pin: EBBCan: PB2
 | 
					 | 
				
			||||||
axes_map: x,y,z
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[extruder]
 | 
					 | 
				
			||||||
step_pin: EBBCan: PD0
 | 
					 | 
				
			||||||
dir_pin: EBBCan: PD1
 | 
					 | 
				
			||||||
enable_pin: !EBBCan: PD2
 | 
					 | 
				
			||||||
## Update value below when you perform extruder calibration
 | 
					 | 
				
			||||||
## If you ask for 100mm of filament, but in reality it is 98mm:
 | 
					 | 
				
			||||||
## rotation_distance = <previous_rotation_distance> * <actual_extrude_distance> / 100
 | 
					 | 
				
			||||||
## 22.6789511 is a good starting point
 | 
					 | 
				
			||||||
rotation_distance: 22.6789511   #Bondtech 5mm Drive Gears
 | 
					 | 
				
			||||||
## Update Gear Ratio depending on your Extruder Type
 | 
					 | 
				
			||||||
## - 50:17 for Afterburner/Clockwork
 | 
					 | 
				
			||||||
## - 50:10 for Stealthburner/Clockwork2
 | 
					 | 
				
			||||||
## - 80:20 for M4, M3.1
 | 
					 | 
				
			||||||
gear_ratio: 50:10             # SB BMG
 | 
					 | 
				
			||||||
microsteps: 32
 | 
					 | 
				
			||||||
full_steps_per_rotation: 200  # 1.8 deg stepper: 200, 0.9 deg stepper: 400
 | 
					 | 
				
			||||||
nozzle_diameter: 0.400
 | 
					 | 
				
			||||||
filament_diameter: 1.750
 | 
					 | 
				
			||||||
heater_pin: EBBCan: PB13
 | 
					 | 
				
			||||||
sensor_type: ATC Semitec 104NT-4-R025H42G
 | 
					 | 
				
			||||||
sensor_pin: EBBCan: PA3
 | 
					 | 
				
			||||||
max_power: 1.0
 | 
					 | 
				
			||||||
min_extrude_temp: 180
 | 
					 | 
				
			||||||
min_temp: 0
 | 
					 | 
				
			||||||
max_temp: 280 # specified to 300
 | 
					 | 
				
			||||||
## Try to keep pressure_advance below 1.0
 | 
					 | 
				
			||||||
# pressure_advance: 0.05
 | 
					 | 
				
			||||||
## Default is 0.040, leave stock
 | 
					 | 
				
			||||||
pressure_advance_smooth_time: 0.040
 | 
					 | 
				
			||||||
# Maximum length (in mm of raw filament) that a retraction or
 | 
					 | 
				
			||||||
# extrude-only move may have, default: 50
 | 
					 | 
				
			||||||
max_extrude_only_distance: 200
 | 
					 | 
				
			||||||
# Maximum area (in mm^2) of an extrusion cross section (eg,
 | 
					 | 
				
			||||||
# extrusion width multiplied by layer height). This setting prevents
 | 
					 | 
				
			||||||
# excessive amounts of extrusion during relatively small XY moves.
 | 
					 | 
				
			||||||
# If a move requests an extrusion rate that would exceed this value
 | 
					 | 
				
			||||||
# it will cause an error to be returned. The default is: 4.0 *
 | 
					 | 
				
			||||||
# nozzle_diameter^2
 | 
					 | 
				
			||||||
max_extrude_cross_section: 50.0   # default 4 * 0.4 = 0.64
 | 
					 | 
				
			||||||
control: pid
 | 
					 | 
				
			||||||
pid_Kp: 21.527
 | 
					 | 
				
			||||||
pid_Ki: 1.063
 | 
					 | 
				
			||||||
pid_Kd: 108.982
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc2209 extruder]
 | 
					 | 
				
			||||||
uart_pin: EBBCan: PA15
 | 
					 | 
				
			||||||
run_current: 0.650
 | 
					 | 
				
			||||||
stealthchop_threshold: 999999
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[fan]
 | 
					 | 
				
			||||||
pin: EBBCan: PA0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[heater_fan hotend_fan]
 | 
					 | 
				
			||||||
pin: EBBCan: PA1
 | 
					 | 
				
			||||||
heater: extruder
 | 
					 | 
				
			||||||
heater_temp: 50.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[filament_switch_sensor toolhead_sensor]
 | 
					 | 
				
			||||||
pause_on_runout: False
 | 
					 | 
				
			||||||
switch_pin: ^EBBCan: PB3
 | 
					 | 
				
			||||||
# runout_gcode:
 | 
					 | 
				
			||||||
#   M118 toolhead filament removed
 | 
					 | 
				
			||||||
# insert_gcode:
 | 
					 | 
				
			||||||
#   M118 toolhead filament inserted
 | 
					 | 
				
			||||||
							
								
								
									
										7
									
								
								ercf.cfg
									
										
									
									
									
								
							
							
						
						
									
										7
									
								
								ercf.cfg
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +0,0 @@
 | 
				
			||||||
[include ercf/hardware.cfg]
 | 
					 | 
				
			||||||
[include ercf/software.cfg]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[mcu ercf]
 | 
					 | 
				
			||||||
# serial: /dev/serial/by-id/usb-Klipper_samd21g18a_D3EB9B384134555020312E30171117FF-if00
 | 
					 | 
				
			||||||
canbus_uuid: 092fcd32b788
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,77 +0,0 @@
 | 
				
			||||||
## Enraged Rabbit : Carrot Feeder config file for ERCF EASY BRD v1.1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This config sample assume you set the two J6 jumpers on 1-2 and 4-5, i.e. [..].[..]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Carrot Feeder 5mm D-cut shaft
 | 
					 | 
				
			||||||
[manual_stepper gear_stepper]
 | 
					 | 
				
			||||||
step_pin: ercf:gpio7
 | 
					 | 
				
			||||||
dir_pin: !ercf:gpio8
 | 
					 | 
				
			||||||
enable_pin: !ercf:gpio6
 | 
					 | 
				
			||||||
rotation_distance: 22.6789511 # Bondtech 5mm Drive Gears
 | 
					 | 
				
			||||||
gear_ratio: 80:20
 | 
					 | 
				
			||||||
microsteps: 16
 | 
					 | 
				
			||||||
full_steps_per_rotation: 200
 | 
					 | 
				
			||||||
velocity: 35
 | 
					 | 
				
			||||||
accel: 100
 | 
					 | 
				
			||||||
endstop_pin: ercf:gpio13
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc2209 manual_stepper gear_stepper]
 | 
					 | 
				
			||||||
# Adapt accordingly to your setup and desires
 | 
					 | 
				
			||||||
# The default values are tested with the BOM NEMA14 motor
 | 
					 | 
				
			||||||
uart_pin: ercf:gpio9
 | 
					 | 
				
			||||||
interpolate: True
 | 
					 | 
				
			||||||
run_current: 0.6
 | 
					 | 
				
			||||||
hold_current: 0.1
 | 
					 | 
				
			||||||
sense_resistor: 0.110
 | 
					 | 
				
			||||||
stealthchop_threshold: 500
 | 
					 | 
				
			||||||
# diag_pin: ercf:gpio23
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[manual_stepper selector_stepper]
 | 
					 | 
				
			||||||
step_pin: ercf:gpio2
 | 
					 | 
				
			||||||
dir_pin: !ercf:gpio1
 | 
					 | 
				
			||||||
enable_pin: !ercf:gpio3
 | 
					 | 
				
			||||||
microsteps: 16
 | 
					 | 
				
			||||||
rotation_distance: 40
 | 
					 | 
				
			||||||
full_steps_per_rotation: 200
 | 
					 | 
				
			||||||
velocity: 200
 | 
					 | 
				
			||||||
homing_speed: 100
 | 
					 | 
				
			||||||
accel: 600
 | 
					 | 
				
			||||||
# Select the endstop you want depending if you are using sensorless homing
 | 
					 | 
				
			||||||
# endstop_pin: ^ercf:PB9
 | 
					 | 
				
			||||||
endstop_pin: ercf:gpio20
 | 
					 | 
				
			||||||
#endstop_pin: tmc2209_selector_stepper:virtual_endstop
 | 
					 | 
				
			||||||
#endstop_pin: tmc5160_selector_stepper:virtual_endstop
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc2209 manual_stepper selector_stepper]
 | 
					 | 
				
			||||||
uart_pin: ercf:gpio0
 | 
					 | 
				
			||||||
run_current: 0.55
 | 
					 | 
				
			||||||
hold_current: 0.4
 | 
					 | 
				
			||||||
interpolate: True
 | 
					 | 
				
			||||||
sense_resistor: 0.110
 | 
					 | 
				
			||||||
stealthchop_threshold: 5000
 | 
					 | 
				
			||||||
# Uncomment the lines below if you want to use sensorless homing for the selector
 | 
					 | 
				
			||||||
# diag_pin: ^ercf:gpio22  # Set to MCU pin connected to TMC DIAG pin
 | 
					 | 
				
			||||||
# driver_SGTHRS: 75       # 255 is most sensitive value, 0 is least sensitive
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Values are for the MG90S servo
 | 
					 | 
				
			||||||
[servo ercf_servo]
 | 
					 | 
				
			||||||
pin: ercf:gpio21
 | 
					 | 
				
			||||||
maximum_servo_angle: 180
 | 
					 | 
				
			||||||
# minimum_pulse_width: 0.00085
 | 
					 | 
				
			||||||
# maximum_pulse_width: 0.00215
 | 
					 | 
				
			||||||
minimum_pulse_width: 0.001
 | 
					 | 
				
			||||||
maximum_pulse_width: 0.002
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[duplicate_pin_override]
 | 
					 | 
				
			||||||
pins: ercf:gpio15
 | 
					 | 
				
			||||||
# Put there the pin used by the encoder and the filament_motion_sensor
 | 
					 | 
				
			||||||
# It has to be the same pin for those 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[filament_motion_sensor encoder_sensor]
 | 
					 | 
				
			||||||
switch_pin: ^ercf:gpio15
 | 
					 | 
				
			||||||
pause_on_runout: False
 | 
					 | 
				
			||||||
detection_length: 10.0
 | 
					 | 
				
			||||||
extruder: extruder
 | 
					 | 
				
			||||||
# runout_gcode: _ERCF_ENCODER_MOTION_ISSUE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,973 +0,0 @@
 | 
				
			||||||
###############################
 | 
					 | 
				
			||||||
# ERCF module
 | 
					 | 
				
			||||||
###############################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[ercf]
 | 
					 | 
				
			||||||
# Encoder
 | 
					 | 
				
			||||||
encoder_pin: ^ercf:gpio15      # easy brd
 | 
					 | 
				
			||||||
# encoder_resolution: 1.365188 # in mm
 | 
					 | 
				
			||||||
encoder_resolution: 1.349528  # from `ercf_calibrate_encoder`
 | 
					 | 
				
			||||||
# 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 for long moves and 50mm/s for short moves.
 | 
					 | 
				
			||||||
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]
 | 
					 | 
				
			||||||
description: Empty macro to store ERCF variables
 | 
					 | 
				
			||||||
# =======================================================
 | 
					 | 
				
			||||||
# ================== 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) : 27.0
 | 
					 | 
				
			||||||
# LGX on AfterBurner with ERCF V1.1 sensor (hall effect) : 44.0
 | 
					 | 
				
			||||||
# AfterBurner Clockwork with ERCF V1.1 sensor (hall effect) : 36.0
 | 
					 | 
				
			||||||
variable_end_of_bowden_to_sensor: 44 # xk
 | 
					 | 
				
			||||||
# 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 :
 | 
					 | 
				
			||||||
# Galileo Clockwork with ERCF 1.1 sensor (hall effect) & Dragon Normal Flow : 60.5
 | 
					 | 
				
			||||||
# LGX on AfterBurner with ERCF 1.1 sensor (hall effect) & Dragon Normal Flow : 55.6
 | 
					 | 
				
			||||||
# AfterBurner Clockwork with ERCF 1.1 sensor (hall effect) & Dragon Normal Flow : 54.0
 | 
					 | 
				
			||||||
variable_sensor_to_nozzle: 65 # xk
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# ==== 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 = [2.4, 23.2, 44.0, 70.5, 91.2, 112.8] # 6 tools # xk
 | 
					 | 
				
			||||||
# 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: 730 # xk
 | 
					 | 
				
			||||||
# 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: 120 # xk
 | 
					 | 
				
			||||||
# Threshold for the final load check (i.e. the move from the toolhead sensor to the nozzle)
 | 
					 | 
				
			||||||
# Check the _ERCF_GET_LOAD_THRESHOLD command to get the proper value for your setup
 | 
					 | 
				
			||||||
variable_final_load_check_threshold: 10.0
 | 
					 | 
				
			||||||
# 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
 | 
					 | 
				
			||||||
variable_sensorless_selector: 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: 210 # xk                                                        # 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
 | 
					 | 
				
			||||||
variable_gear_stepper_accel: 0                                                              # The acceleration value applied to the gear stepper on moves, standard is to use 0
 | 
					 | 
				
			||||||
variable_extra_servo_dwell_up: 0                                                            # Additional dwell time in ms to apply to dwell prior to turning off the servo
 | 
					 | 
				
			||||||
variable_extra_servo_dwell_down: 0                                                          # Additional dwell time in ms to apply to dwell prior to turning off the servo
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[save_variables]
 | 
					 | 
				
			||||||
filename: /home/pi/printer_data/config/ercf/vars.cfg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
###############################
 | 
					 | 
				
			||||||
# ERCF Calibration macros
 | 
					 | 
				
			||||||
###############################
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_CALIB_SELECTOR]
 | 
					 | 
				
			||||||
description: Calibration of the selector position for a defined Tool
 | 
					 | 
				
			||||||
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]
 | 
					 | 
				
			||||||
description: Complete calibration of all ERCF Tools
 | 
					 | 
				
			||||||
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]
 | 
					 | 
				
			||||||
description: Calibration of a single ERCF Tool
 | 
					 | 
				
			||||||
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={printer["gcode_macro _ERCF_VAR"].gear_stepper_accel|int} 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]
 | 
					 | 
				
			||||||
description: Saving ERCF calibration values
 | 
					 | 
				
			||||||
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]
 | 
					 | 
				
			||||||
description: Filament unload during ERCF calibration
 | 
					 | 
				
			||||||
variable_ratio: 0.0
 | 
					 | 
				
			||||||
variable_ref: 0.0
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% set unload_length = params.LENGTH|default(0.0)|float %}
 | 
					 | 
				
			||||||
    {% if unload_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={(unload_length|float)}
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
            ERCF_UNLOAD LENGTH={(unload_length|float)*(ratio|float)}
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_GET_LOAD_THRESHOLD]
 | 
					 | 
				
			||||||
description: Measure the encoder threshold for the last part of the load
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL_STANDALONE TOOL=0 TUNE=1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[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]
 | 
					 | 
				
			||||||
description: Engage the ERCF gear
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=gear_stepper MOVE=0.5 SPEED=25 ACCEL={printer["gcode_macro _ERCF_VAR"].gear_stepper_accel|int} SYNC=0
 | 
					 | 
				
			||||||
    SET_SERVO SERVO=ercf_servo ANGLE={printer["gcode_macro _ERCF_VAR"].servo_down_angle}
 | 
					 | 
				
			||||||
    G4 P200
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=gear_stepper MOVE=0.0 SPEED=25 ACCEL={printer["gcode_macro _ERCF_VAR"].gear_stepper_accel|int} SYNC=0
 | 
					 | 
				
			||||||
    G4 P100
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=gear_stepper MOVE=-0.5 SPEED=25 ACCEL={printer["gcode_macro _ERCF_VAR"].gear_stepper_accel|int} SYNC=0
 | 
					 | 
				
			||||||
    G4 P{100 + printer["gcode_macro _ERCF_VAR"].extra_servo_dwell_down|int}
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=gear_stepper MOVE=0.0 SPEED=25 ACCEL={printer["gcode_macro _ERCF_VAR"].gear_stepper_accel|int}
 | 
					 | 
				
			||||||
    SET_SERVO SERVO=ercf_servo WIDTH=0.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Pull the top hat up (disengage the bondtech gears)
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_SERVO_UP]
 | 
					 | 
				
			||||||
description: Disengage the ERCF gear
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    SET_SERVO SERVO=ercf_servo ANGLE={printer["gcode_macro _ERCF_VAR"].servo_up_angle}
 | 
					 | 
				
			||||||
    G4 P{250 + printer["gcode_macro _ERCF_VAR"].extra_servo_dwell_up|int}
 | 
					 | 
				
			||||||
    SET_SERVO SERVO=ercf_servo WIDTH=0.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
###############################
 | 
					 | 
				
			||||||
# ERCF motors
 | 
					 | 
				
			||||||
###############################
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_MOTORS_OFF]
 | 
					 | 
				
			||||||
description: Turn off both ERCF motors
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=gear_stepper ENABLE=0
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=selector_stepper ENABLE=0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
###############################
 | 
					 | 
				
			||||||
# 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]
 | 
					 | 
				
			||||||
description: Unlock ERCF operations
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    M118 Unlock the ERCF
 | 
					 | 
				
			||||||
    SET_GCODE_VARIABLE MACRO=_ERCF_PAUSE VARIABLE=is_paused VALUE=0
 | 
					 | 
				
			||||||
    UPDATE_DELAYED_GCODE ID=disable_heater DURATION=0
 | 
					 | 
				
			||||||
    {% if printer['filament_switch_sensor toolhead_sensor'].filament_detected == False %}
 | 
					 | 
				
			||||||
        _ERCF_UNSELECT_TOOL
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        _ERCF_UNSELECT_TOOL FORCED=0
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    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]
 | 
					 | 
				
			||||||
description: Pause the current print and lock the ERCF operations
 | 
					 | 
				
			||||||
variable_is_paused: 0
 | 
					 | 
				
			||||||
variable_extruder_temp: 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
 | 
					 | 
				
			||||||
    PAUSE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
############################################
 | 
					 | 
				
			||||||
# Changing tool macros
 | 
					 | 
				
			||||||
# _ERCF_CHANGE_TOOL_STANDALONE TOOL=XX to change filament outside of a print
 | 
					 | 
				
			||||||
# _ERCF_CHANGE_TOOL_SLICER 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 T0]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro T1]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro T2]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro T3]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro T4]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro T5]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro T6]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro T7]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=7
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro T8]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_CHANGE_TOOL TOOL=8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_CHANGE_TOOL]
 | 
					 | 
				
			||||||
description: Perform a tool swap
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% set initial_tool_string = 'unknown tool' %}
 | 
					 | 
				
			||||||
    {% if printer["gcode_macro _ERCF_SELECT_TOOL"].color_selected|int != -1 %}
 | 
					 | 
				
			||||||
        {% set initial_tool_string = 'T' + printer["gcode_macro _ERCF_SELECT_TOOL"].color_selected|string %}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    M118 Tool swap request, from {initial_tool_string} to T{params.TOOL|int}
 | 
					 | 
				
			||||||
    M117 {initial_tool_string} -> T{params.TOOL|int}
 | 
					 | 
				
			||||||
    {% if printer.idle_timeout.state == "Printing" %}
 | 
					 | 
				
			||||||
        _ERCF_CHANGE_TOOL_SLICER TOOL={params.TOOL|int}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        _ERCF_CHANGE_TOOL_STANDALONE TOOL={params.TOOL|int}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_CHANGE_TOOL_SLICER]
 | 
					 | 
				
			||||||
description: Perform a tool swap during a print
 | 
					 | 
				
			||||||
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}
 | 
					 | 
				
			||||||
        _ERCF_UNLOAD_TOOL
 | 
					 | 
				
			||||||
        _ERCF_LOAD_TOOL TOOL={params.TOOL|int}
 | 
					 | 
				
			||||||
        _ERCF_CHANGE_TOOL_SLICER_END
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_CHANGE_TOOL_SLICER_END]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% if printer["gcode_macro _ERCF_PAUSE"].is_paused|int == 0 %}
 | 
					 | 
				
			||||||
        {% if printer["gcode_macro _ERCF_VAR"].clog_detection|int == 1 %}
 | 
					 | 
				
			||||||
            SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=1
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_CHANGE_TOOL_STANDALONE]
 | 
					 | 
				
			||||||
description: Perform a tool swap out of a print
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
 | 
					 | 
				
			||||||
    {% set tune = params.TUNE|default(0)|int %}
 | 
					 | 
				
			||||||
    {% if printer["gcode_macro ERCF_HOME"].home == -1 %}
 | 
					 | 
				
			||||||
        M118 ERCF not homed, homing it...
 | 
					 | 
				
			||||||
        ERCF_HOME
 | 
					 | 
				
			||||||
        _ERCF_LOAD_TOOL TOOL={params.TOOL|int} TUNE={tune}
 | 
					 | 
				
			||||||
    {% elif printer["gcode_macro _ERCF_SELECT_TOOL"].color_selected|int != 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} TUNE={tune}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
############################################
 | 
					 | 
				
			||||||
# Unloading/Loading Macros
 | 
					 | 
				
			||||||
############################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Load filament from ERCF to nozzle
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_LOAD_TOOL]
 | 
					 | 
				
			||||||
description: Load the filament from the ERCF to the toolhead
 | 
					 | 
				
			||||||
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 %}
 | 
					 | 
				
			||||||
        {% set tune = params.TUNE|default(0)|int %}
 | 
					 | 
				
			||||||
        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 TUNE={tune}
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
            M118 ERCF is currently paused. Please use ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Unload filament from nozzle to ERCF, using built-in tip forming macro
 | 
					 | 
				
			||||||
[gcode_macro ERCF_EJECT]
 | 
					 | 
				
			||||||
description: Eject the filament out of a print and park it into the ERCF
 | 
					 | 
				
			||||||
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"].unload_modifier|float - 60.0}
 | 
					 | 
				
			||||||
                _ERCF_UNSELECT_TOOL
 | 
					 | 
				
			||||||
            {% else %}
 | 
					 | 
				
			||||||
                _ERCF_EJECT_UNKNOW_STATE
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
            _ERCF_EJECT_UNKNOW_STATE
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M118 ERCF is currently paused. Please use ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Unload filament from nozzle to ERCF, using SuperSlicer ramming
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_UNLOAD_TOOL]
 | 
					 | 
				
			||||||
description: Eject the filament during a print and park it into the ERCF
 | 
					 | 
				
			||||||
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} ...
 | 
					 | 
				
			||||||
            G1 E-10.00 F1200.0
 | 
					 | 
				
			||||||
            G1 E-{printer["gcode_macro _ERCF_VAR"].end_of_bowden_to_sensor|float + 20.0} F2000
 | 
					 | 
				
			||||||
            _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' % (printer["gcode_macro _ERCF_SELECT_TOOL"].color_selected|string)]}
 | 
					 | 
				
			||||||
            G4 P100
 | 
					 | 
				
			||||||
            _ERCF_EXTRACT_FROM_EXTRUDER
 | 
					 | 
				
			||||||
            {% set ercf_params = printer.save_variables.variables %}
 | 
					 | 
				
			||||||
            ERCF_UNLOAD LENGTH={ercf_params.ercf_calib_ref|float + printer["gcode_macro _ERCF_VAR"].unload_modifier|float - 60.0}
 | 
					 | 
				
			||||||
            _ERCF_UNSELECT_TOOL
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M118 ERCF is currently paused. Please use ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Unload filament from nozzle to ERCF, using SuperSlicer ramming
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_EXTRACT_FROM_EXTRUDER]
 | 
					 | 
				
			||||||
description: Extract the tip at the parking position from the extruder
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% if printer['filament_switch_sensor toolhead_sensor'].filament_detected == True %}
 | 
					 | 
				
			||||||
        M118 Filament still below the extruder... Trying extraction again...
 | 
					 | 
				
			||||||
        G1 E-5.00 F1200.0
 | 
					 | 
				
			||||||
        G1 E-{printer["gcode_macro _ERCF_VAR"].end_of_bowden_to_sensor|float + 25.0} F2000
 | 
					 | 
				
			||||||
        G4 P100
 | 
					 | 
				
			||||||
        _ERCF_RETRY_EXTRACT_FROM_EXTRUDER
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        G91
 | 
					 | 
				
			||||||
        G92 E0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=gear_stepper MOVE=-20 SPEED=25 ACCEL=0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=gear_stepper MOVE=-10 SPEED=25 ACCEL=0 SYNC=0
 | 
					 | 
				
			||||||
        G1 E10 F2000.0
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Unload filament from nozzle to ERCF, using SuperSlicer ramming
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_RETRY_EXTRACT_FROM_EXTRUDER]
 | 
					 | 
				
			||||||
description: Check if extraction retry went properly or not
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% if printer['filament_switch_sensor toolhead_sensor'].filament_detected == True %}
 | 
					 | 
				
			||||||
        M118 Filament is stuck below the extruder...
 | 
					 | 
				
			||||||
        M118 Calling ERCF_PAUSE
 | 
					 | 
				
			||||||
        _ERCF_PAUSE
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        G91
 | 
					 | 
				
			||||||
        G92 E0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=gear_stepper MOVE=-20 SPEED=25 ACCEL=0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=gear_stepper MOVE=-10 SPEED=25 ACCEL=0 SYNC=0
 | 
					 | 
				
			||||||
        G1 E10 F2000.0
 | 
					 | 
				
			||||||
    {% 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]
 | 
					 | 
				
			||||||
description: Move the selector to the Tool and select it
 | 
					 | 
				
			||||||
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
 | 
					 | 
				
			||||||
            {% if printer["gcode_macro _ERCF_VAR"].sensorless_selector|int == 1 %}
 | 
					 | 
				
			||||||
                ERCF_MOVE_SELECTOR TARGET={printer["gcode_macro _ERCF_VAR"].colorselector[params.TOOL|int]}
 | 
					 | 
				
			||||||
            {% else %}
 | 
					 | 
				
			||||||
                MANUAL_STEPPER STEPPER=selector_stepper MOVE={printer["gcode_macro _ERCF_VAR"].colorselector[params.TOOL|int]}
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
            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 %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M118 ERCF is currently paused. Please use ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Unselect a tool
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_UNSELECT_TOOL]
 | 
					 | 
				
			||||||
description: Unselect current Tool
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% set unselect_color = params.FORCED|default(1)|int %}
 | 
					 | 
				
			||||||
    {% 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 unselect_color == 1 %}
 | 
					 | 
				
			||||||
                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 %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M118 ERCF is currently paused. Please use ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% 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]
 | 
					 | 
				
			||||||
description: Load filament from the toolhead entrance to the nozzle
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% if printer["gcode_macro _ERCF_PAUSE"].is_paused|int == 0 %}
 | 
					 | 
				
			||||||
        {% set tune = params.TUNE|default(0)|int %}
 | 
					 | 
				
			||||||
        {% 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={printer["gcode_macro _ERCF_VAR"].gear_stepper_accel|int} 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 FORCED=0
 | 
					 | 
				
			||||||
            ERCF_FINALIZE_LOAD LENGTH={printer["gcode_macro _ERCF_VAR"].sensor_to_nozzle|float} TUNE={tune}
 | 
					 | 
				
			||||||
            G92 E0
 | 
					 | 
				
			||||||
            G90
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
            M118 Extruder too cold
 | 
					 | 
				
			||||||
            _ERCF_PAUSE
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M118 ERCF is currently paused. Please use ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# StandAlone cooling moves to extract proper filament tip
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_FORM_TIP_STANDALONE]
 | 
					 | 
				
			||||||
description: Generic tip forming macro
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% set COOLING_TUBE_LENGTH = params.COOLING_TUBE_LENGTH|default(15) %} # Dragon ST: 15, Dragon HF: 10, Mosquito: 20
 | 
					 | 
				
			||||||
    {% set COOLING_TUBE_RETRACTION = params.COOLING_TUBE_RETRACTION|default(35) %} # Dragon ST: 35, Dragon HF: 30, Mosquito: 38
 | 
					 | 
				
			||||||
    {% set INITIAL_COOLING_SPEED = params.INITIAL_COOLING_SPEED|default(10) %}
 | 
					 | 
				
			||||||
    {% set FINAL_COOLING_SPEED = params.FINAL_COOLING_SPEED|default(50) %}
 | 
					 | 
				
			||||||
    {% set COOLING_MOVES = params.COOLING_MOVES|default(5) %}
 | 
					 | 
				
			||||||
    {% set TOOLCHANGE_TEMP = params.TOOLCHANGE_TEMP|default(0) %}
 | 
					 | 
				
			||||||
    {% set USE_SKINNYDIP = params.USE_SKINNYDIP|default(0) %}
 | 
					 | 
				
			||||||
    {% set USE_FAST_SKINNYDIP = params.USE_FAST_SKINNYDIP|default(1) %}
 | 
					 | 
				
			||||||
    {% set SKINNYDIP_DISTANCE = params.SKINNYDIP_DISTANCE|default(26) %}
 | 
					 | 
				
			||||||
    {% set DIP_INSERTION_SPEED = params.DIP_INSERTION_SPEED|default(33) %}
 | 
					 | 
				
			||||||
    {% set DIP_EXTRACTION_SPEED = params.DIP_EXTRACTION_SPEED|default(70) %}
 | 
					 | 
				
			||||||
    {% set MELT_ZONE_PAUSE = params.MELT_ZONE_PAUSE|default(0) %}
 | 
					 | 
				
			||||||
    {% set COOLING_ZONE_PAUSE = params.COOLING_ZONE_PAUSE|default(0) %}
 | 
					 | 
				
			||||||
    {% set UNLOADING_SPEED_START = params.UNLOADING_SPEED_START|default(199) %}
 | 
					 | 
				
			||||||
    {% set UNLOADING_SPEED = params.UNLOADING_SPEED|default(20) %}
 | 
					 | 
				
			||||||
    {% set RAMMING_VOLUME = params.RAMMING_VOLUME|default(0) %} # in mm3
 | 
					 | 
				
			||||||
    {% set INITIAL_RETRACT = params.INITIAL_RETRACT|default(0) %} # Use an initial retract or not. Don't use it if you want to ram the filament
 | 
					 | 
				
			||||||
    {% set FINAL_EJECT = params.FINAL_EJECT|default(0) %} # Fully eject the filament afterwards, default is no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    G91
 | 
					 | 
				
			||||||
    G92 E0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SET_PRESSURE_ADVANCE ADVANCE=0
 | 
					 | 
				
			||||||
    {% set OLD_TEMP = printer.extruder.target %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Ramming with SuperSlicer standard setting
 | 
					 | 
				
			||||||
    {% if INITIAL_RETRACT|int == 1 %}
 | 
					 | 
				
			||||||
        G1 E-8.5000 F3000
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {% set RATIO = (RAMMING_VOLUME|float) /23.0 %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    G1 E{0.5784 * RATIO|float} F299 #7
 | 
					 | 
				
			||||||
    G1 E{0.5834 * RATIO|float} F302 #3
 | 
					 | 
				
			||||||
    G1 E{0.5918 * RATIO|float} F306 #6
 | 
					 | 
				
			||||||
    G1 E{0.6169 * RATIO|float} F319 #6
 | 
					 | 
				
			||||||
    G1 E{0.3393 * RATIO|float} F350 #0
 | 
					 | 
				
			||||||
    G1 E{0.3363 * RATIO|float} F350 #0
 | 
					 | 
				
			||||||
    G1 E{0.7577 * RATIO|float} F392 #6
 | 
					 | 
				
			||||||
    G1 E{0.8382 * RATIO|float} F434 #3
 | 
					 | 
				
			||||||
    G1 E{0.7776 * RATIO|float} F469 #9
 | 
					 | 
				
			||||||
    G1 E{0.1293 * RATIO|float} F469 #9
 | 
					 | 
				
			||||||
    G1 E{0.9673 * RATIO|float} F501 #2
 | 
					 | 
				
			||||||
    G1 E{1.0176 * RATIO|float} F527 #2
 | 
					 | 
				
			||||||
    G1 E{0.5956 * RATIO|float} F544 #6
 | 
					 | 
				
			||||||
    G1 E{0.4555 * RATIO|float} F544 #6
 | 
					 | 
				
			||||||
    G1 E{1.0662 * RATIO|float} F552 #4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # set toolchange temperature just prior to filament being extracted from melt zone and wait for set point
 | 
					 | 
				
			||||||
    # (SKINNYDIP--normal mode only)
 | 
					 | 
				
			||||||
    {% if TOOLCHANGE_TEMP|float > 0 and USE_FAST_SKINNYDIP|int == 0 %}
 | 
					 | 
				
			||||||
       M109 S{TOOLCHANGE_TEMP}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Retraction
 | 
					 | 
				
			||||||
    {% set TOTAL_RETRACTION_DISTANCE = COOLING_TUBE_RETRACTION|float + COOLING_TUBE_LENGTH|float / 2 - 15 %}
 | 
					 | 
				
			||||||
    G1 E-15 F{1.0 * UNLOADING_SPEED_START|float * 60}
 | 
					 | 
				
			||||||
    G1 E-{0.7 * TOTAL_RETRACTION_DISTANCE} F{1.0 * UNLOADING_SPEED|float * 60}
 | 
					 | 
				
			||||||
    G1 E-{0.2 * TOTAL_RETRACTION_DISTANCE} F{0.5 * UNLOADING_SPEED|float * 60}
 | 
					 | 
				
			||||||
    G1 E-{0.1 * TOTAL_RETRACTION_DISTANCE} F{0.3 * UNLOADING_SPEED|float * 60}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {% if TOOLCHANGE_TEMP|float > 0 and USE_FAST_SKINNYDIP|int == 1 %}
 | 
					 | 
				
			||||||
       M104 S{TOOLCHANGE_TEMP}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Generate Cooling Moves
 | 
					 | 
				
			||||||
    {% set SPEED_INC = (FINAL_COOLING_SPEED|float - INITIAL_COOLING_SPEED|float) / (2 * COOLING_MOVES|float - 1) %}
 | 
					 | 
				
			||||||
    {% for move in range(COOLING_MOVES|int) %}
 | 
					 | 
				
			||||||
      G1 E{COOLING_TUBE_LENGTH} F{(INITIAL_COOLING_SPEED|float + SPEED_INC*move*2) * 60}
 | 
					 | 
				
			||||||
      G1 E-{COOLING_TUBE_LENGTH} F{(INITIAL_COOLING_SPEED|float + SPEED_INC*(move*2+1)) * 60}
 | 
					 | 
				
			||||||
    {% endfor %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # wait for extruder to reach toolchange temperature after cooling moves complete (SKINNYDIP--fast mode only)
 | 
					 | 
				
			||||||
    {% if TOOLCHANGE_TEMP|float > 0 and USE_FAST_SKINNYDIP|int == 1 %}
 | 
					 | 
				
			||||||
        M109 S{TOOLCHANGE_TEMP}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Generate a skinnydip move
 | 
					 | 
				
			||||||
    {% if USE_SKINNYDIP|int == 1 %}
 | 
					 | 
				
			||||||
      G1 E{SKINNYDIP_DISTANCE} F{DIP_INSERTION_SPEED|float * 60}
 | 
					 | 
				
			||||||
      G4 P{MELT_ZONE_PAUSE}
 | 
					 | 
				
			||||||
      G1 E-{SKINNYDIP_DISTANCE} F{DIP_EXTRACTION_SPEED|float * 60}
 | 
					 | 
				
			||||||
      G4 P{COOLING_ZONE_PAUSE}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {% if TOOLCHANGE_TEMP|float > 0 %}
 | 
					 | 
				
			||||||
      M104 S{OLD_TEMP}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {% if FINAL_EJECT|int == 1 %}
 | 
					 | 
				
			||||||
        G92 E0
 | 
					 | 
				
			||||||
        G1 E-80 F3000
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    G92 E0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Unload from extruder with tip forming sequence
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_UNLOAD_FILAMENT_IN_EXTRUDER_WITH_TIP_FORMING]
 | 
					 | 
				
			||||||
description: Unload filament from the nozzle to the toolhead entrance using generic tip forming macro
 | 
					 | 
				
			||||||
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-10.00 F1200.0
 | 
					 | 
				
			||||||
                G1 E-{printer["gcode_macro _ERCF_VAR"].sensor_to_nozzle|float - 10.00} F2000
 | 
					 | 
				
			||||||
                G1 E-{printer["gcode_macro _ERCF_VAR"].end_of_bowden_to_sensor|float + 20.00} F2000
 | 
					 | 
				
			||||||
                _ERCF_SERVO_DOWN
 | 
					 | 
				
			||||||
                G4 P100
 | 
					 | 
				
			||||||
                _ERCF_EXTRACT_FROM_EXTRUDER
 | 
					 | 
				
			||||||
                M118 Filament removed
 | 
					 | 
				
			||||||
            {% else %}
 | 
					 | 
				
			||||||
                M118 Tool selected, UNSELECT it
 | 
					 | 
				
			||||||
                _ERCF_PAUSE
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
            M118 Extruder too cold
 | 
					 | 
				
			||||||
            _ERCF_PAUSE
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M118 ERCF is currently paused. Please use ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
############################################
 | 
					 | 
				
			||||||
# Endstop check macros
 | 
					 | 
				
			||||||
############################################
 | 
					 | 
				
			||||||
# 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]
 | 
					 | 
				
			||||||
description: Unload filament from an unknown position
 | 
					 | 
				
			||||||
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} UNKNOWN=1
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        _ERCF_SERVO_DOWN
 | 
					 | 
				
			||||||
        ERCF_BUZZ_GEAR_MOTOR
 | 
					 | 
				
			||||||
        _ERCF_EJECT_FROM_BOWDEN
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Eject from the bowden to the ERCF
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_EJECT_FROM_BOWDEN]
 | 
					 | 
				
			||||||
description: Unload filament from the reverse 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]
 | 
					 | 
				
			||||||
description: Home the ERCF
 | 
					 | 
				
			||||||
variable_home: -1
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0
 | 
					 | 
				
			||||||
    SET_GCODE_VARIABLE MACRO=ERCF_HOME VARIABLE=home VALUE=1
 | 
					 | 
				
			||||||
    {% if printer["gcode_macro _ERCF_PAUSE"].is_paused|int == 1 %}
 | 
					 | 
				
			||||||
        ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    M118 Homing ERCF ...
 | 
					 | 
				
			||||||
    QUERY_ENDSTOPS
 | 
					 | 
				
			||||||
    _ERCF_EJECT_UNKNOW_STATE
 | 
					 | 
				
			||||||
    _ERCF_HOME_SELECTOR
 | 
					 | 
				
			||||||
    _ERCF_HOME_ONLY TOOL={params.TOOL|default(0)|int}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_HOME_SELECTOR]
 | 
					 | 
				
			||||||
description: Home the ERCF selector
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    M118 Homing selector
 | 
					 | 
				
			||||||
    _ERCF_UNSELECT_TOOL
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {% 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) %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {% if printer["gcode_macro _ERCF_VAR"].sensorless_selector|int == 1 %}
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=selector_stepper SET_POSITION=0
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=selector_stepper SPEED=60 MOVE=-{selector_length|float} STOP_ON_ENDSTOP=1
 | 
					 | 
				
			||||||
        MANUAL_STEPPER STEPPER=selector_stepper SET_POSITION=0
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        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
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    QUERY_ENDSTOPS
 | 
					 | 
				
			||||||
    M400
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=selector_stepper SPEED=50 MOVE=3.0
 | 
					 | 
				
			||||||
    M400
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Home the ERCF (home the color selector if needed)
 | 
					 | 
				
			||||||
# if everything 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 %}
 | 
					 | 
				
			||||||
        {% set selector_homed = 0 %}
 | 
					 | 
				
			||||||
        {% if printer["gcode_macro _ERCF_VAR"].sensorless_selector|int == 1 %}
 | 
					 | 
				
			||||||
            {% if printer.query_endstops.last_query["manual_stepper gear_stepper"] == 1 %}
 | 
					 | 
				
			||||||
                {% set selector_homed = 1 %}
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
            {% if printer.query_endstops.last_query["manual_stepper selector_stepper"] == 1 %}
 | 
					 | 
				
			||||||
                {% set selector_homed = 1 %}
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
        {% if selector_homed != 1 %}
 | 
					 | 
				
			||||||
            M118 Homing ERCF selector failed, check what is blocking the selector
 | 
					 | 
				
			||||||
            M118 Pausing the ERCF, run "ERCF_UNLOCK" to unlock it ...
 | 
					 | 
				
			||||||
            _ERCF_PAUSE
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
            M118 Homing ERCF ended ...
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M118 Homing ERCF failed, ERCF is paused, run "ERCF_UNLOCK" to unlock it ...
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
###############################################
 | 
					 | 
				
			||||||
# Test Macros
 | 
					 | 
				
			||||||
###############################################
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_DISPLAY_ENCODER_POS]
 | 
					 | 
				
			||||||
description: Display current value of the ERCF encoder
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    M118 Encoder value is {printer['ercf'].encoder_pos|float}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_TEST_MOVE_GEAR]
 | 
					 | 
				
			||||||
description: Move the ERCF gear
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% set move_length = params.LENGTH|default(200.0)|float %}
 | 
					 | 
				
			||||||
    {% set move_speed = params.SPEED|default(50.0)|float %}
 | 
					 | 
				
			||||||
    {% set move_accel = params.ACCEL|default(200.0)|float %}
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=gear_stepper SET_POSITION=0
 | 
					 | 
				
			||||||
    MANUAL_STEPPER STEPPER=gear_stepper MOVE={move_length|float} SPEED={move_speed|float} ACCEL={move_accel|float}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_TEST_SERVO]
 | 
					 | 
				
			||||||
description: Test the servo angle
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    SET_SERVO SERVO=ercf_servo ANGLE={params.VALUE|float}
 | 
					 | 
				
			||||||
    G4 P{250 + printer["gcode_macro _ERCF_VAR"].extra_servo_dwell_up|int}
 | 
					 | 
				
			||||||
    SET_SERVO SERVO=ercf_servo WIDTH=0.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_TEST_GRIP]
 | 
					 | 
				
			||||||
description: Test the ERCF grip for a Tool
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    _ERCF_SERVO_DOWN
 | 
					 | 
				
			||||||
    _ERCF_MOTORS_OFF
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_TEST_LOAD_SEQUENCE]
 | 
					 | 
				
			||||||
description: Test sequence
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% set loop_number = params.LOOP|default(10)|int %}
 | 
					 | 
				
			||||||
    {% set use_rand = params.RAND|default(0)|int %}
 | 
					 | 
				
			||||||
    {% for iteration in range(loop_number|int) %}
 | 
					 | 
				
			||||||
        {% for load in range((printer["gcode_macro _ERCF_VAR"].colorselector|length)|int) %}
 | 
					 | 
				
			||||||
            {% if use_rand|int == 1 %}
 | 
					 | 
				
			||||||
                _ERCF_SELECT_TOOL TOOL={range(0, printer["gcode_macro _ERCF_VAR"].colorselector|length)|random}
 | 
					 | 
				
			||||||
            {% else %}
 | 
					 | 
				
			||||||
                _ERCF_SELECT_TOOL TOOL={load|int}
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            ERCF_LOAD LENGTH=100
 | 
					 | 
				
			||||||
            G4 P50
 | 
					 | 
				
			||||||
            ERCF_UNLOAD LENGTH=100
 | 
					 | 
				
			||||||
            _ERCF_UNSELECT_TOOL
 | 
					 | 
				
			||||||
            G4 P200
 | 
					 | 
				
			||||||
        {% endfor %}
 | 
					 | 
				
			||||||
    {% endfor %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
###############################################
 | 
					 | 
				
			||||||
# Endless spool mode and clog detection
 | 
					 | 
				
			||||||
###############################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_ENCODER_MOTION_ISSUE]
 | 
					 | 
				
			||||||
description: Perform a test when the encoder sense an issue (clog or runout)
 | 
					 | 
				
			||||||
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]
 | 
					 | 
				
			||||||
description: Actions taken if a clog or a runout is detected by the ERCF encoder
 | 
					 | 
				
			||||||
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 %}
 | 
					 | 
				
			||||||
            {% set pre_change_PA = printer.extruder.pressure_advance %}
 | 
					 | 
				
			||||||
            M118 EndlessSpool mode is ON!
 | 
					 | 
				
			||||||
            {% 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 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={printer["gcode_macro _ERCF_VAR"].gear_stepper_accel|int} 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}
 | 
					 | 
				
			||||||
            SET_PRESSURE_ADVANCE ADVANCE={pre_change_PA}
 | 
					 | 
				
			||||||
            _ERCF_CHECK_IF_RESUME
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
            M118 EndlessSpool mode not enabled, please do something
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _ERCF_CHECK_IF_RESUME]
 | 
					 | 
				
			||||||
description: Safety checks before resuming the print after an encoder event
 | 
					 | 
				
			||||||
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 %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M118 ERCF is currently paused. Please use ERCF_UNLOCK
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,15 +0,0 @@
 | 
				
			||||||
[Variables]
 | 
					 | 
				
			||||||
ercf_calib_0 = 1.0
 | 
					 | 
				
			||||||
ercf_calib_1 = 1.0017808674381732
 | 
					 | 
				
			||||||
ercf_calib_10 = 1.0
 | 
					 | 
				
			||||||
ercf_calib_11 = 1.0
 | 
					 | 
				
			||||||
ercf_calib_2 = 1.0007071473230196
 | 
					 | 
				
			||||||
ercf_calib_3 = 0.9996357263944082
 | 
					 | 
				
			||||||
ercf_calib_4 = 1.0050158971500294
 | 
					 | 
				
			||||||
ercf_calib_5 = 0.999635726394
 | 
					 | 
				
			||||||
ercf_calib_6 = 1.0
 | 
					 | 
				
			||||||
ercf_calib_7 = 1.0
 | 
					 | 
				
			||||||
ercf_calib_8 = 1.0
 | 
					 | 
				
			||||||
ercf_calib_9 = 1.0
 | 
					 | 
				
			||||||
ercf_calib_ref = 782.7262400000001
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										36
									
								
								fans.cfg
									
										
									
									
									
								
							
							
						
						
									
										36
									
								
								fans.cfg
									
										
									
									
									
								
							| 
						 | 
					@ -1,36 +0,0 @@
 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
# Fan Control
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [fan_generic nevermore1]
 | 
					 | 
				
			||||||
[heater_fan nevermore1]
 | 
					 | 
				
			||||||
pin: PD12
 | 
					 | 
				
			||||||
kick_start_time: 0.5
 | 
					 | 
				
			||||||
heater: heater_bed
 | 
					 | 
				
			||||||
heater_temp: 40.0
 | 
					 | 
				
			||||||
fan_speed: 0.80
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [fan_generic nevermore2]
 | 
					 | 
				
			||||||
[heater_fan nevermore2]
 | 
					 | 
				
			||||||
pin: PD13
 | 
					 | 
				
			||||||
kick_start_time: 0.5
 | 
					 | 
				
			||||||
heater: heater_bed
 | 
					 | 
				
			||||||
heater_temp: 40.0
 | 
					 | 
				
			||||||
fan_speed: 0.80
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [fan_generic side1]
 | 
					 | 
				
			||||||
[heater_fan side1]
 | 
					 | 
				
			||||||
pin: PD14
 | 
					 | 
				
			||||||
kick_start_time: 0.5
 | 
					 | 
				
			||||||
heater: heater_bed
 | 
					 | 
				
			||||||
heater_temp: 40.0
 | 
					 | 
				
			||||||
fan_speed: 0.40
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [fan_generic side1]
 | 
					 | 
				
			||||||
[heater_fan side2]
 | 
					 | 
				
			||||||
pin: PD15
 | 
					 | 
				
			||||||
kick_start_time: 0.5
 | 
					 | 
				
			||||||
heater: heater_bed
 | 
					 | 
				
			||||||
heater_temp: 40.0
 | 
					 | 
				
			||||||
fan_speed: 0.40
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,9 +0,0 @@
 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
#  include all the macros
 | 
					 | 
				
			||||||
#  large parts taken from alexz and others
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
[include debug.cfg]
 | 
					 | 
				
			||||||
[include helpers.cfg]
 | 
					 | 
				
			||||||
[include print.cfg]
 | 
					 | 
				
			||||||
[include sensorless.cfg]
 | 
					 | 
				
			||||||
[include timelapse.cfg]
 | 
					 | 
				
			||||||
							
								
								
									
										115
									
								
								macros/debug.cfg
									
										
									
									
									
								
							
							
						
						
									
										115
									
								
								macros/debug.cfg
									
										
									
									
									
								
							| 
						 | 
					@ -1,115 +0,0 @@
 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
#  Macros to debug the printer variable
 | 
					 | 
				
			||||||
#  - DUMP_PARAMETERS
 | 
					 | 
				
			||||||
#  - DUMP_CONFIG
 | 
					 | 
				
			||||||
#  - DUMP_WARNINGS
 | 
					 | 
				
			||||||
#  - DUMP_SETTINGS
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro xk]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  M117 xk
 | 
					 | 
				
			||||||
  M118 xk
 | 
					 | 
				
			||||||
  # M117 {quad_gantry_level.applied}
 | 
					 | 
				
			||||||
  # M118 {quad_gantry_level.applied}
 | 
					 | 
				
			||||||
  {% if printer['quad_gantry_level'] is not none %}
 | 
					 | 
				
			||||||
    M117 not none
 | 
					 | 
				
			||||||
    M118 not none
 | 
					 | 
				
			||||||
    {% if printer['quad_gantry_level'].applied %}
 | 
					 | 
				
			||||||
    M117 not none yes
 | 
					 | 
				
			||||||
    M118 not none yes
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    M117 not not none
 | 
					 | 
				
			||||||
    M118 not not none
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  {% if printer['quad_gantry_level'] is defined %}
 | 
					 | 
				
			||||||
    M117 defined
 | 
					 | 
				
			||||||
    M118 defined
 | 
					 | 
				
			||||||
    {% if printer['quad_gantry_level'].applied %}
 | 
					 | 
				
			||||||
    M117 defined yes
 | 
					 | 
				
			||||||
    M118 defined yes
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    M117 not defined
 | 
					 | 
				
			||||||
    M118 not defined
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Use:
 | 
					 | 
				
			||||||
##   - DUMP_PARAMETERS
 | 
					 | 
				
			||||||
##   - DUMP_PARAMETERS S='gcode_macro _USER_VARIABLE'
 | 
					 | 
				
			||||||
[gcode_macro DUMP_PARAMETERS]
 | 
					 | 
				
			||||||
description: Debug: Print all entries of the printer object
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set parameters = [] %}
 | 
					 | 
				
			||||||
  {% for name1 in printer|sort %}
 | 
					 | 
				
			||||||
    {% if 'S' in params %}
 | 
					 | 
				
			||||||
      {% if name1 is in [params.S] %}
 | 
					 | 
				
			||||||
        {% for name2 in printer[name1]|sort %}
 | 
					 | 
				
			||||||
          {% set parameters = parameters.append("printer['%s'].%s = %s" % (name1, name2, printer[name1][name2])) %}
 | 
					 | 
				
			||||||
        {% endfor %}
 | 
					 | 
				
			||||||
      {% endif %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {% if name1 is not in ['configfile'] %}
 | 
					 | 
				
			||||||
        {% for name2 in printer[name1]|sort %}
 | 
					 | 
				
			||||||
          {% set parameters = parameters.append("printer['%s'].%s = %s" % (name1, name2, printer[name1][name2])) %}
 | 
					 | 
				
			||||||
        {% endfor %}
 | 
					 | 
				
			||||||
      {% endif %}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endfor %}
 | 
					 | 
				
			||||||
  {action_respond_info(parameters|join("\n"))}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Use:
 | 
					 | 
				
			||||||
##   - DUMP_CONFIG S='printer'
 | 
					 | 
				
			||||||
[gcode_macro DUMP_CONFIG]
 | 
					 | 
				
			||||||
description: Debug: Print the selected entry of the printer config object
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% if 'S' in params %}
 | 
					 | 
				
			||||||
    {% set parameters = [] %}
 | 
					 | 
				
			||||||
    {% for name1 in printer.configfile.config %}
 | 
					 | 
				
			||||||
      {% if name1 is in [params.S] %}
 | 
					 | 
				
			||||||
        {% for name2 in printer.configfile.config[name1]|sort %}
 | 
					 | 
				
			||||||
          {% set parameters = parameters.append("printer.configfile.config['%s'].%s = %s" % (name1, name2, printer.configfile.config[name1][name2])) %}
 | 
					 | 
				
			||||||
        {% endfor %}
 | 
					 | 
				
			||||||
      {% endif %}
 | 
					 | 
				
			||||||
    {% endfor %}
 | 
					 | 
				
			||||||
    {action_respond_info(parameters|join("\n"))}
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    {action_respond_info("WARNING: parameter S needed call e.g. DUMP_CONFIG S='printer'")}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Use:
 | 
					 | 
				
			||||||
##   - DUMP_WARNINGS
 | 
					 | 
				
			||||||
[gcode_macro DUMP_WARNINGS]
 | 
					 | 
				
			||||||
description: Debug: Print all warning messages from klipper
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set parameters = ["printer.configfile.warnings:"] %}
 | 
					 | 
				
			||||||
  {% for name1 in printer.configfile.warnings %}
 | 
					 | 
				
			||||||
      {% set parameters = parameters.append("%s -> %s -> %s\n%s" % (name1.type, name1.section, name1.option, name1.message)) %}
 | 
					 | 
				
			||||||
  {% endfor %}
 | 
					 | 
				
			||||||
  {action_respond_info(parameters|join("\n"))}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Use:
 | 
					 | 
				
			||||||
##   - DUMP_SETTINGS S='printer'
 | 
					 | 
				
			||||||
[gcode_macro DUMP_SETTINGS]
 | 
					 | 
				
			||||||
description: Debug: Print the selected entry of the printer settings object
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% if 'S' in params %}
 | 
					 | 
				
			||||||
    {% set parameters = [] %}
 | 
					 | 
				
			||||||
    {% for name1 in printer.configfile.settings %}
 | 
					 | 
				
			||||||
      {% if name1 is in [params.S] %}
 | 
					 | 
				
			||||||
        {% for name2 in printer.configfile.settings[name1]|sort %}
 | 
					 | 
				
			||||||
          {% set parameters = parameters.append("printer.configfile.settings['%s'].%s = %s" % (name1, name2, printer.configfile.settings[name1][name2])) %}
 | 
					 | 
				
			||||||
        {% endfor %}
 | 
					 | 
				
			||||||
      {% endif %}
 | 
					 | 
				
			||||||
    {% endfor %}
 | 
					 | 
				
			||||||
    {action_respond_info(parameters|join("\n"))}
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    {action_respond_info("WARNING: parameter S needed call e.g. DUMP_SETTINGS S='printer'")}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
#  Macros needed for several debug activities
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,61 +0,0 @@
 | 
				
			||||||
####################################################################
 | 
					 | 
				
			||||||
# Helper macros
 | 
					 | 
				
			||||||
# - MOVE_SPEED
 | 
					 | 
				
			||||||
# - NOTIFY_BED
 | 
					 | 
				
			||||||
# - NOTIFY_EXTRUDER
 | 
					 | 
				
			||||||
# - ZC - calibrate z and move to front to measure
 | 
					 | 
				
			||||||
# - TZC - Test Z Calibration
 | 
					 | 
				
			||||||
####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro MOVE_SPEED]
 | 
					 | 
				
			||||||
description: move along certain patterns with selected speed
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set F=params.F|default(3000)|int %}
 | 
					 | 
				
			||||||
  {% set N=params.N|default(1)|int %}
 | 
					 | 
				
			||||||
  {% if printer.idle_timeout.state != "Printing" %}
 | 
					 | 
				
			||||||
    {% if "xyz" in printer.toolhead.homed_axes %}
 | 
					 | 
				
			||||||
      M118 moving N={N} with F={F}
 | 
					 | 
				
			||||||
      {% set X0=275 %}
 | 
					 | 
				
			||||||
      {% set X1=25 %}
 | 
					 | 
				
			||||||
      {% set Y0=275 %}
 | 
					 | 
				
			||||||
      {% set Y1=25 %}
 | 
					 | 
				
			||||||
      ; start
 | 
					 | 
				
			||||||
      G0 X{X0} Y{Y0} F3000
 | 
					 | 
				
			||||||
      G0 F{F}
 | 
					 | 
				
			||||||
      {% for i in range(N) %}
 | 
					 | 
				
			||||||
        M118 move {(i+1)}/{N}
 | 
					 | 
				
			||||||
        ; move 1
 | 
					 | 
				
			||||||
        G0 X{X1} Y{Y0}
 | 
					 | 
				
			||||||
        G0 X{X0} Y{Y1}
 | 
					 | 
				
			||||||
        ; move 2
 | 
					 | 
				
			||||||
        G0 X{X0} Y{Y0}
 | 
					 | 
				
			||||||
        G0 X{X1} Y{Y1}
 | 
					 | 
				
			||||||
        ; move 3
 | 
					 | 
				
			||||||
        G0 X{X0} Y{Y1}
 | 
					 | 
				
			||||||
        G0 X{X1} Y{Y0}
 | 
					 | 
				
			||||||
        ; move 4
 | 
					 | 
				
			||||||
        G0 X{X1} Y{Y1}
 | 
					 | 
				
			||||||
        G0 X{X0} Y{Y0}
 | 
					 | 
				
			||||||
      {% endfor %}
 | 
					 | 
				
			||||||
      M118 done
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      M118 Printer not homed
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    M118 Already printing
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro NOTIFY_BED]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set BED=params.BED|default(0)|int %}
 | 
					 | 
				
			||||||
  M117 HEATING BED from {printer.heater_bed.temperature} to {BED}
 | 
					 | 
				
			||||||
  M118 HEATING BED from {printer.heater_bed.temperature} to {BED}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro NOTIFY_EXTRUDER]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set EXTRUDER=params.EXTRUDER|default(0)|int %}
 | 
					 | 
				
			||||||
  M117 HEATING EXTRUDER from {printer.extruder.temperature} to {EXTRUDER}
 | 
					 | 
				
			||||||
  M118 HEATING EXTRUDER from {printer.extruder.temperature} to {EXTRUDER}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										251
									
								
								macros/print.cfg
									
										
									
									
									
								
							
							
						
						
									
										251
									
								
								macros/print.cfg
									
										
									
									
									
								
							| 
						 | 
					@ -1,251 +0,0 @@
 | 
				
			||||||
####################################################################
 | 
					 | 
				
			||||||
# Macros used for printing
 | 
					 | 
				
			||||||
# - BRUSHIE
 | 
					 | 
				
			||||||
# - CANCEL_PRINT
 | 
					 | 
				
			||||||
# - LOAD_FILAMENT
 | 
					 | 
				
			||||||
# - UNLOAD_FILAMENT
 | 
					 | 
				
			||||||
# - M600
 | 
					 | 
				
			||||||
# - M601
 | 
					 | 
				
			||||||
# - M900
 | 
					 | 
				
			||||||
# - PARK
 | 
					 | 
				
			||||||
# - PAUSE
 | 
					 | 
				
			||||||
# - PRINT_START
 | 
					 | 
				
			||||||
# - PRINT_END
 | 
					 | 
				
			||||||
# - PRINT_LAYER_CHANGE
 | 
					 | 
				
			||||||
# - PURGE_NOZZLE
 | 
					 | 
				
			||||||
# - RESUME
 | 
					 | 
				
			||||||
####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# BRUSHIE
 | 
					 | 
				
			||||||
[gcode_macro BRUSHIE]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set x0=250 %}
 | 
					 | 
				
			||||||
  {% set x1=190 %}
 | 
					 | 
				
			||||||
  {% set y0=printer.toolhead.axis_maximum.y - 1 %}
 | 
					 | 
				
			||||||
  {% set z0=2.0 %}
 | 
					 | 
				
			||||||
  # {% set z_hop = printer['gcode_macro _USER_VARIABLE'].z_hop|int %}
 | 
					 | 
				
			||||||
  {% set z_hop = 10 %}
 | 
					 | 
				
			||||||
  {% if "xyz" in printer.toolhead.homed_axes %}
 | 
					 | 
				
			||||||
    G0 Z{z_hop} F1000           # move Z to travel height
 | 
					 | 
				
			||||||
    G0 X{x0} Y{y0} F6000        # move to x0/y0
 | 
					 | 
				
			||||||
    G0 Z{z0}                    # lower
 | 
					 | 
				
			||||||
    G0 X{x1}                    # 1
 | 
					 | 
				
			||||||
    G0 X{x0}                    # 2
 | 
					 | 
				
			||||||
    G0 X{x1}                    # 3
 | 
					 | 
				
			||||||
    G0 Z{z_hop} F300            # move Z to travel height
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    M118 printer not homed
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# CANCEL_PRINT
 | 
					 | 
				
			||||||
[gcode_macro CANCEL_PRINT]
 | 
					 | 
				
			||||||
description: Cancel the actual running print
 | 
					 | 
				
			||||||
rename_existing: _CANCEL_PRINT_BASE
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  CLEAR_PAUSE
 | 
					 | 
				
			||||||
  SDCARD_RESET_FILE
 | 
					 | 
				
			||||||
  TURN_OFF_HEATERS
 | 
					 | 
				
			||||||
  PARK
 | 
					 | 
				
			||||||
  _CANCEL_PRINT_BASE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# LOAD_FILAMENT
 | 
					 | 
				
			||||||
[gcode_macro LOAD_FILAMENT]
 | 
					 | 
				
			||||||
description: extrude 100mm of filament
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  G0 E100 F600 # speed 10*60
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# UNLOAD_FILAMENT
 | 
					 | 
				
			||||||
[gcode_macro UNLOAD_FILAMENT]
 | 
					 | 
				
			||||||
description: retract 100mm of filament
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  G0 E-100 F600 # speed 10*60
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro M600]
 | 
					 | 
				
			||||||
description: Change filament
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  SAVE_GCODE_STATE NAME=M600_state
 | 
					 | 
				
			||||||
  PAUSE
 | 
					 | 
				
			||||||
  M118 M600 change filament
 | 
					 | 
				
			||||||
  RESTORE_GCODE_STATE NAME=M600_state
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro M601]
 | 
					 | 
				
			||||||
description: Pause print
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  PAUSE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro M900]
 | 
					 | 
				
			||||||
description: Set pressure advance
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  SET_PRESSURE_ADVANCE ADVANCE={params.K|default(0)}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# PARK
 | 
					 | 
				
			||||||
[gcode_macro PARK]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set Y=params.Y|default(295) %}
 | 
					 | 
				
			||||||
  {% set X=params.X|default(295) %}
 | 
					 | 
				
			||||||
  {% set Z=params.Z|default(-1) %}
 | 
					 | 
				
			||||||
  {% if "xyz" in printer.toolhead.homed_axes %}
 | 
					 | 
				
			||||||
    # calculate save lift position
 | 
					 | 
				
			||||||
    {% set z_max = printer.toolhead.axis_maximum.z|float %}
 | 
					 | 
				
			||||||
    {% set z_act = printer.toolhead.position.z|float %}
 | 
					 | 
				
			||||||
    {% set z_safe = z_act + 5 %}
 | 
					 | 
				
			||||||
    {% if z_safe > z_max %}
 | 
					 | 
				
			||||||
        {% set z_safe = z_max %}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    {% if Z != - 1 %}
 | 
					 | 
				
			||||||
        {% set z_safe = Z %}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    M118 Parking X{X} Y{Y} Z{z_safe}
 | 
					 | 
				
			||||||
    G0 Z{z_safe} F1200
 | 
					 | 
				
			||||||
    G0 X{X} Y{Y} F6000
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    M118 printer not homed
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# - PAUSE
 | 
					 | 
				
			||||||
[gcode_macro PAUSE]
 | 
					 | 
				
			||||||
rename_existing: _PAUSE_BASE
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% if printer.pause_resume.is_paused|lower == 'false' %}
 | 
					 | 
				
			||||||
    G92 E0
 | 
					 | 
				
			||||||
    {% if printer.extruder.can_extrude %}
 | 
					 | 
				
			||||||
      G1 E-1.0 F1500.0
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    G90                   # use absolute coordinates
 | 
					 | 
				
			||||||
    SAVE_GCODE_STATE NAME=PAUSE_state
 | 
					 | 
				
			||||||
    _PAUSE_BASE
 | 
					 | 
				
			||||||
    PARK Y=5
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    M117 already paused
 | 
					 | 
				
			||||||
    M118 already paused
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# - PRINT_START
 | 
					 | 
				
			||||||
[gcode_macro PRINT_START]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set BED=params.BED|default(100)|int %}
 | 
					 | 
				
			||||||
  {% set EXTRUDER=params.EXTRUDER|default(250)|int %}
 | 
					 | 
				
			||||||
  {% set QGL=params.QGL|default(0)|int %}
 | 
					 | 
				
			||||||
  {% set BMC=params.BMC|default(0)|int %}
 | 
					 | 
				
			||||||
  {% set SHEET=params.SHEET|default("default")|string %}
 | 
					 | 
				
			||||||
  {% set PURGE=params.PURGE|default(0)|int %}
 | 
					 | 
				
			||||||
  {% set Z_ADJUST=params.Z_ADJUST|default(0.0)|float %}
 | 
					 | 
				
			||||||
  {action_respond_info("starting print BED=%d, EXTRUDER=%d, SHEET=%s, BMC=%d, PURGE=%d, Z_AJUST=%f" % (BED, EXTRUDER, SHEET, BMC, PURGE, Z_ADJUST))}
 | 
					 | 
				
			||||||
  {% set EXTRUDER_MIN=120 %}
 | 
					 | 
				
			||||||
  M117 CONFIGURING
 | 
					 | 
				
			||||||
  M118 CONFIGURING
 | 
					 | 
				
			||||||
  SET_GCODE_OFFSET Z=0.0  # reset z offset
 | 
					 | 
				
			||||||
  M140 S{BED}             # start bed heating to bed
 | 
					 | 
				
			||||||
  G92 E0                  # reset extruder
 | 
					 | 
				
			||||||
  G21                     # set units to millimeters
 | 
					 | 
				
			||||||
  G90                     # use absolute coordinates
 | 
					 | 
				
			||||||
  M83                     # use relative distances for extrusion
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  BED_MESH_CLEAR
 | 
					 | 
				
			||||||
  # HOME
 | 
					 | 
				
			||||||
  M117 HOME
 | 
					 | 
				
			||||||
  M118 HOME
 | 
					 | 
				
			||||||
  G28
 | 
					 | 
				
			||||||
  BRUSHIE
 | 
					 | 
				
			||||||
  # QGL
 | 
					 | 
				
			||||||
  {% if QGL or not printer['quad_gantry_level'].applied %}
 | 
					 | 
				
			||||||
    M117 QGL
 | 
					 | 
				
			||||||
    M118 QGL
 | 
					 | 
				
			||||||
    QUAD_GANTRY_LEVEL
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    M117 NO QGL
 | 
					 | 
				
			||||||
    M118 NO QGL
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  # BMC
 | 
					 | 
				
			||||||
  {% if BMC %}
 | 
					 | 
				
			||||||
    M117 BED MESH CALIBRATE
 | 
					 | 
				
			||||||
    M118 BED MESH CALIBRATE
 | 
					 | 
				
			||||||
    BED_MESH_CALIBRATE
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    M117 BED MESH LOAD {SHEET}
 | 
					 | 
				
			||||||
    M118 BED MESH LOAD {SHEET}
 | 
					 | 
				
			||||||
    BED_MESH_PROFILE LOAD={SHEET}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  PARK Z=10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  G92 E0                  # reset extruder
 | 
					 | 
				
			||||||
  G90                     # use absolute coordinates
 | 
					 | 
				
			||||||
  M104 S{EXTRUDER_MIN}        # start extruder heating
 | 
					 | 
				
			||||||
  NOTIFY_BED BED={BED}
 | 
					 | 
				
			||||||
  M190 S{BED}             # set and wait for actual bed temperature
 | 
					 | 
				
			||||||
  # final home z
 | 
					 | 
				
			||||||
  G28 Z
 | 
					 | 
				
			||||||
  PARK Z=10
 | 
					 | 
				
			||||||
  # heat extruder
 | 
					 | 
				
			||||||
  NOTIFY_EXTRUDER EXTRUDER={EXTRUDER}
 | 
					 | 
				
			||||||
  M109 S{EXTRUDER}        # set and wait for extruder temperature
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SET_GCODE_OFFSET Z_ADJUST={params.Z_ADJUST|default(0.0)|float} MOVE=1
 | 
					 | 
				
			||||||
  BRUSHIE
 | 
					 | 
				
			||||||
  {% if PURGE %}
 | 
					 | 
				
			||||||
    PURGE_NOZZLE
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  M117 STARTING
 | 
					 | 
				
			||||||
  M118 STARTING
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# - PRINT_END
 | 
					 | 
				
			||||||
[gcode_macro PRINT_END]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set UNLOAD_AT_END=params.UNLOAD_AT_END|default(0)|int %}
 | 
					 | 
				
			||||||
  M118 finished
 | 
					 | 
				
			||||||
  PARK
 | 
					 | 
				
			||||||
  M400                          ; wait for buffer to clear
 | 
					 | 
				
			||||||
  G92 E0                        ; zero the extruder
 | 
					 | 
				
			||||||
  G1 E-10.0 F3600               ; retract filament
 | 
					 | 
				
			||||||
  TURN_OFF_HEATERS
 | 
					 | 
				
			||||||
  M107                          ; turn off fan
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# - PURGE_NOZZLE
 | 
					 | 
				
			||||||
[gcode_macro PURGE_NOZZLE]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set x0=params.x0|default(100) %}
 | 
					 | 
				
			||||||
  {% set x1=params.x1|default(200) %}
 | 
					 | 
				
			||||||
  {% set y0=params.y0|default(2) %}
 | 
					 | 
				
			||||||
  {% set y1=params.y1|default(3) %}
 | 
					 | 
				
			||||||
  # {% set z_hop = printer['gcode_macro _USER_VARIABLE'].z_hop|int %}
 | 
					 | 
				
			||||||
  {% set z_hop = 10 %}
 | 
					 | 
				
			||||||
  M118 purge nozzle
 | 
					 | 
				
			||||||
  G0 Z{z_hop} F300            # move Z to travel height
 | 
					 | 
				
			||||||
  G0 X{x0} Y{y0} F5000        # move to x0/y0
 | 
					 | 
				
			||||||
  G0 Z0.24 F300               # lower Z to 75%
 | 
					 | 
				
			||||||
  G0 X{x1} E20 F1500          # draw line
 | 
					 | 
				
			||||||
  G0 Y{y1}                    # move to y1
 | 
					 | 
				
			||||||
  G0 X{x0} E10                # draw fine line
 | 
					 | 
				
			||||||
  G0 X{x0-10}                 # move a little further
 | 
					 | 
				
			||||||
  # G0 E-5                      # retract filament
 | 
					 | 
				
			||||||
  G0 Z{z_hop} F300            # move Z to travel height
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# - RESUME
 | 
					 | 
				
			||||||
[gcode_macro RESUME]
 | 
					 | 
				
			||||||
description: Resume the actual running print
 | 
					 | 
				
			||||||
rename_existing: _RESUME_BASE
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    {% if printer.pause_resume.is_paused|lower == 'true' %}
 | 
					 | 
				
			||||||
        RESTORE_GCODE_STATE NAME=PAUSE_state
 | 
					 | 
				
			||||||
        G90
 | 
					 | 
				
			||||||
        _RESUME_BASE
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
        M117 not paused
 | 
					 | 
				
			||||||
        M118 not paused
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro PRINT_LAYER_CHANGE]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set layer=params.LAYER|default(0)|int %}
 | 
					 | 
				
			||||||
  {% set layer_z=params.LAYER_Z|default(0) %}
 | 
					 | 
				
			||||||
  {% set total_layer_count=params.TOTAL_LAYER_COUNT|default(0) %}
 | 
					 | 
				
			||||||
  M117 layer {layer+1}/{total_layer_count} {layer_z}mm
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,76 +0,0 @@
 | 
				
			||||||
[gcode_macro _HOME_X]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    # Always use consistent run_current on A/B steppers during sensorless homing
 | 
					 | 
				
			||||||
    {% set RUN_CURRENT_X = printer.configfile.settings['tmc5160 stepper_x'].run_current|float %}
 | 
					 | 
				
			||||||
    {% set RUN_CURRENT_Y = printer.configfile.settings['tmc5160 stepper_y'].run_current|float %}
 | 
					 | 
				
			||||||
    {% set HOME_CURRENT = 0.5 %}
 | 
					 | 
				
			||||||
    SET_TMC_CURRENT STEPPER=stepper_x CURRENT={HOME_CURRENT}
 | 
					 | 
				
			||||||
    SET_TMC_CURRENT STEPPER=stepper_y CURRENT={HOME_CURRENT}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Home
 | 
					 | 
				
			||||||
    G28 X
 | 
					 | 
				
			||||||
    # Move away
 | 
					 | 
				
			||||||
    G91
 | 
					 | 
				
			||||||
    G1 X-10 F1200
 | 
					 | 
				
			||||||
    G90
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Wait just a moment
 | 
					 | 
				
			||||||
    G4 P500
 | 
					 | 
				
			||||||
    # Set current during print
 | 
					 | 
				
			||||||
    SET_TMC_CURRENT STEPPER=stepper_x CURRENT={RUN_CURRENT_X}
 | 
					 | 
				
			||||||
    SET_TMC_CURRENT STEPPER=stepper_y CURRENT={RUN_CURRENT_Y}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _HOME_Y]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
    # Set current for sensorless homing
 | 
					 | 
				
			||||||
    {% set RUN_CURRENT_X = printer.configfile.settings['tmc5160 stepper_x'].run_current|float %}
 | 
					 | 
				
			||||||
    {% set RUN_CURRENT_Y = printer.configfile.settings['tmc5160 stepper_y'].run_current|float %}
 | 
					 | 
				
			||||||
    {% set HOME_CURRENT = 0.5 %}
 | 
					 | 
				
			||||||
    SET_TMC_CURRENT STEPPER=stepper_x CURRENT={HOME_CURRENT}
 | 
					 | 
				
			||||||
    SET_TMC_CURRENT STEPPER=stepper_y CURRENT={HOME_CURRENT}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Home
 | 
					 | 
				
			||||||
    G28 Y
 | 
					 | 
				
			||||||
    # Move away
 | 
					 | 
				
			||||||
    G91
 | 
					 | 
				
			||||||
    G1 Y-10 F1200
 | 
					 | 
				
			||||||
    G90
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Wait just a moment
 | 
					 | 
				
			||||||
    G4 P500
 | 
					 | 
				
			||||||
    # Set current during print
 | 
					 | 
				
			||||||
    SET_TMC_CURRENT STEPPER=stepper_x CURRENT={RUN_CURRENT_X}
 | 
					 | 
				
			||||||
    SET_TMC_CURRENT STEPPER=stepper_y CURRENT={RUN_CURRENT_Y}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[homing_override]
 | 
					 | 
				
			||||||
axes: xyz
 | 
					 | 
				
			||||||
set_position_z: 0
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set home_all = 'X' not in params and 'Y' not in params or 'Z' in params %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  # set_position_z does home z
 | 
					 | 
				
			||||||
  # but if x and y are not, guess that z is not really either z
 | 
					 | 
				
			||||||
  {% if not "x" in printer.toolhead.homed_axes and not "y" in printer.toolhead.homed_axes %}
 | 
					 | 
				
			||||||
    # move up 5
 | 
					 | 
				
			||||||
    G91
 | 
					 | 
				
			||||||
    G0 Z5
 | 
					 | 
				
			||||||
    G90
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    # or to 5
 | 
					 | 
				
			||||||
    G0 Z5
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  {% if home_all or 'X' in params %}
 | 
					 | 
				
			||||||
    _HOME_X
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  {% if home_all or 'Y' in params %}
 | 
					 | 
				
			||||||
    _HOME_Y
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  {% if home_all or 'Z' in params %}
 | 
					 | 
				
			||||||
    G0 X150 Y150 F6000
 | 
					 | 
				
			||||||
    G28 Z
 | 
					 | 
				
			||||||
    G1 Z10
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,424 +0,0 @@
 | 
				
			||||||
# Timelapse klipper macro definition
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Copyright (C) 2021 Christoph Frei <fryakatkop@gmail.com>
 | 
					 | 
				
			||||||
# Copyright (C) 2021 Alex Zellner <alexander.zellner@googlemail.com>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This file may be distributed under the terms of the GNU GPLv3 license
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Macro version 1.14
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##### DO NOT CHANGE ANY MACRO!!! #####
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##########################################################################
 | 
					 | 
				
			||||||
#                                                                        #
 | 
					 | 
				
			||||||
# GET_TIMELAPSE_SETUP: Print the Timelapse setup to console              #
 | 
					 | 
				
			||||||
#                                                                        #
 | 
					 | 
				
			||||||
##########################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro GET_TIMELAPSE_SETUP]
 | 
					 | 
				
			||||||
description: Print the Timelapse setup
 | 
					 | 
				
			||||||
gcode: 
 | 
					 | 
				
			||||||
  {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %}
 | 
					 | 
				
			||||||
  {% set output_txt = ["Timelapse Setup:"] %}
 | 
					 | 
				
			||||||
  {% set _dummy = output_txt.append("enable: %s" % tl.enable) %}
 | 
					 | 
				
			||||||
  {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %}
 | 
					 | 
				
			||||||
  {% if tl.park.enable %}
 | 
					 | 
				
			||||||
    {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %}
 | 
					 | 
				
			||||||
    {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %}
 | 
					 | 
				
			||||||
    {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %}
 | 
					 | 
				
			||||||
  {% if not tl.extruder.fw_retract %}
 | 
					 | 
				
			||||||
    {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %}
 | 
					 | 
				
			||||||
    {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %}
 | 
					 | 
				
			||||||
  {action_respond_info(output_txt|join("\n"))}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
################################################################################################
 | 
					 | 
				
			||||||
#                                                                                              #
 | 
					 | 
				
			||||||
# Use _SET_TIMELAPSE_SETUP [ENABLE=value] [VERBOSE=value] [PARK_ENABLE=value] [PARK_POS=value] #
 | 
					 | 
				
			||||||
#                          [PARK_TIME=value] [CUSTOM_POS_X=value] [CUSTOM_POS_Y=value]         #
 | 
					 | 
				
			||||||
#                          [CUSTOM_POS_DZ=value][TRAVEL_SPEED=value] [RETRACT_SPEED=value]     #
 | 
					 | 
				
			||||||
#                          [EXTRUDE_SPEED=value] [EXTRUDE_DISTANCE=value]                      #
 | 
					 | 
				
			||||||
#                          [RETRACT_DISTANCE=value] [FW_RETRACT=value]                         #
 | 
					 | 
				
			||||||
#                                                                                              #
 | 
					 | 
				
			||||||
################################################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _SET_TIMELAPSE_SETUP]
 | 
					 | 
				
			||||||
description: Set user parameters for timelapse
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %}
 | 
					 | 
				
			||||||
  ##### get min and max bed size #####
 | 
					 | 
				
			||||||
  {% set min = printer.toolhead.axis_minimum %}
 | 
					 | 
				
			||||||
  {% set max = printer.toolhead.axis_maximum %}
 | 
					 | 
				
			||||||
  {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] 
 | 
					 | 
				
			||||||
                else False %}
 | 
					 | 
				
			||||||
  {% set park = {'min'   : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3),
 | 
					 | 
				
			||||||
                            'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)},
 | 
					 | 
				
			||||||
                 'max'   : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3),
 | 
					 | 
				
			||||||
                            'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)},
 | 
					 | 
				
			||||||
                 'center': {'x': (max.x-(max.x-min.x)/2)|round(3),
 | 
					 | 
				
			||||||
                            'y': (max.y-(max.y-min.y)/2)|round(3)}} %}
 | 
					 | 
				
			||||||
  ##### set new values #####
 | 
					 | 
				
			||||||
  {% if params.ENABLE %}
 | 
					 | 
				
			||||||
    {% if params.ENABLE|lower is in ['true', 'false'] %}
 | 
					 | 
				
			||||||
      SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.VERBOSE %}
 | 
					 | 
				
			||||||
    {% if params.VERBOSE|lower is in ['true', 'false'] %}
 | 
					 | 
				
			||||||
      SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.CUSTOM_POS_X %}
 | 
					 | 
				
			||||||
    {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.CUSTOM_POS_Y %}
 | 
					 | 
				
			||||||
    {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.CUSTOM_POS_DZ %}
 | 
					 | 
				
			||||||
    {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.PARK_ENABLE %}
 | 
					 | 
				
			||||||
    {% if params.PARK_ENABLE|lower is in ['true', 'false'] %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.PARK_POS %}
 | 
					 | 
				
			||||||
    {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %}
 | 
					 | 
				
			||||||
      {% set dic = {'center'      : {'x': park.center.x   , 'y': park.center.y   , 'dz': 1                },
 | 
					 | 
				
			||||||
                    'front_left'  : {'x': park.min.x      , 'y': park.min.y      , 'dz': 0                },
 | 
					 | 
				
			||||||
                    'front_right' : {'x': park.max.x      , 'y': park.min.y      , 'dz': 0                },
 | 
					 | 
				
			||||||
                    'back_left'   : {'x': park.min.x      , 'y': park.max.y      , 'dz': 0                },
 | 
					 | 
				
			||||||
                    'back_right'  : {'x': park.max.x      , 'y': park.max.y      , 'dz': 0                },
 | 
					 | 
				
			||||||
                    'custom'      : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz},
 | 
					 | 
				
			||||||
                    'x_only'      : {'x': tl.park.custom.x, 'y': 'none'          , 'dz': tl.park.custom.dz},
 | 
					 | 
				
			||||||
                    'y_only'      : {'x': 'none'          , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]"
 | 
					 | 
				
			||||||
                          % params.PARK_POS|upper)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.PARK_TIME %}
 | 
					 | 
				
			||||||
    {% if params.PARK_TIME|float >= 0.0 %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}"
 | 
					 | 
				
			||||||
  {% if params.TRAVEL_SPEED %}
 | 
					 | 
				
			||||||
    {% if params.TRAVEL_SPEED|float > 0.0 %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.RETRACT_SPEED %}
 | 
					 | 
				
			||||||
    {% if params.RETRACT_SPEED|float > 0.0 %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.EXTRUDE_SPEED %}
 | 
					 | 
				
			||||||
    {% if params.EXTRUDE_SPEED|float > 0.0 %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}"
 | 
					 | 
				
			||||||
  {% if params.EXTRUDE_DISTANCE %}
 | 
					 | 
				
			||||||
    {% if params.EXTRUDE_DISTANCE|float >= 0.0 %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.RETRACT_DISTANCE %}
 | 
					 | 
				
			||||||
    {% if params.RETRACT_DISTANCE|float >= 0.0 %}
 | 
					 | 
				
			||||||
      {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if params.FW_RETRACT %}
 | 
					 | 
				
			||||||
    {% if params.FW_RETRACT|lower is in ['true', 'false'] %}
 | 
					 | 
				
			||||||
      {% if 'firmware_retraction' in printer.configfile.settings %}
 | 
					 | 
				
			||||||
        {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %}
 | 
					 | 
				
			||||||
      {% else %}
 | 
					 | 
				
			||||||
        {% set _dummy = tl.extruder.update({'fw_retract':False}) %}
 | 
					 | 
				
			||||||
        {% if params.FW_RETRACT|capitalize == 'True' %}
 | 
					 | 
				
			||||||
          {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")}
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
      {% endif %}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}"
 | 
					 | 
				
			||||||
  {% if printer.configfile.settings['gcode_macro pause'] is defined %}
 | 
					 | 
				
			||||||
    {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  {% if printer.configfile.settings['gcode_macro resume'] is defined %}
 | 
					 | 
				
			||||||
    {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##########################################################################
 | 
					 | 
				
			||||||
#                                                                        #
 | 
					 | 
				
			||||||
# TIMELAPSE_TAKE_FRAME: take the next picture                            #
 | 
					 | 
				
			||||||
#                                                                        #
 | 
					 | 
				
			||||||
##########################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
######################### definition #########################
 | 
					 | 
				
			||||||
## enable: enable or disable the next frame. Valid inputs: [True, False]
 | 
					 | 
				
			||||||
## takingframe: internal use. Valid inputs: [True, False]
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## park.enable: enable or disable to park the head while taking a picture. Valid inputs: [True, False]
 | 
					 | 
				
			||||||
## park.pos   : used position for parking. Valid inputs: [center, front_left, front_right, back_left, back_right, custom, x_only, y_only]
 | 
					 | 
				
			||||||
## park.time  : used for the debug macro. Time in s
 | 
					 | 
				
			||||||
## park.custom.x, park.custom.y: coordinates of the custom parkposition. Unit [mm]
 | 
					 | 
				
			||||||
## park.custom.dz              : custom z hop for the picture. Unit [mm]
 | 
					 | 
				
			||||||
## park.coord : internal use
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## extruder.fw_retract: enable disable fw retraction [True,False]
 | 
					 | 
				
			||||||
## extruder.extrude   : filament extruded at the end of park. Unit [mm]
 | 
					 | 
				
			||||||
## extruder.retract   : filament retract at the start of park. Unit [mm]
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## speed.travel : used speed for travel from and to the park positon. Unit: [mm/min]
 | 
					 | 
				
			||||||
## speed.retract: used speed for retract [mm/min]
 | 
					 | 
				
			||||||
## speed.extrude: used speed for extrude [mm/min]
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## verbose: Enable mesage output of TIMELAPSE_TAKE_FRAME
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## restore.absolute.coordinates: internal use
 | 
					 | 
				
			||||||
## restore.absolute.extrude    : internal use
 | 
					 | 
				
			||||||
## restore.speed               : internal use
 | 
					 | 
				
			||||||
## restore.e                   : internal use
 | 
					 | 
				
			||||||
## restore.factor.speed        : internal use
 | 
					 | 
				
			||||||
## restore.factor.extrude      : internal use
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## macro.pause  : internal use
 | 
					 | 
				
			||||||
## macro.resume : internal use
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
## is_paused: internal use
 | 
					 | 
				
			||||||
###############################################################
 | 
					 | 
				
			||||||
[gcode_macro TIMELAPSE_TAKE_FRAME]
 | 
					 | 
				
			||||||
description: Take Timelapse shoot
 | 
					 | 
				
			||||||
variable_enable: False
 | 
					 | 
				
			||||||
variable_takingframe: False
 | 
					 | 
				
			||||||
variable_park: {'enable': False,
 | 
					 | 
				
			||||||
                'pos'   : 'center',
 | 
					 | 
				
			||||||
                'time'  : 0.1,
 | 
					 | 
				
			||||||
                'custom': {'x': 0, 'y': 0, 'dz': 0},
 | 
					 | 
				
			||||||
                'coord' : {'x': 0, 'y': 0, 'dz': 0}}
 | 
					 | 
				
			||||||
variable_extruder: {'fw_retract': False,
 | 
					 | 
				
			||||||
                    'retract': 1.0,
 | 
					 | 
				
			||||||
                    'extrude': 1.0}
 | 
					 | 
				
			||||||
variable_speed: {'travel': 100,
 | 
					 | 
				
			||||||
                 'retract': 15,
 | 
					 | 
				
			||||||
                 'extrude': 15}
 | 
					 | 
				
			||||||
variable_verbose: True
 | 
					 | 
				
			||||||
variable_restore: {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}}
 | 
					 | 
				
			||||||
variable_macro: {'pause': 'PAUSE', 'resume': 'RESUME'}
 | 
					 | 
				
			||||||
variable_is_paused: False
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %}
 | 
					 | 
				
			||||||
  {% if enable %}
 | 
					 | 
				
			||||||
    {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or
 | 
					 | 
				
			||||||
          (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %}
 | 
					 | 
				
			||||||
      {% if park.enable %}
 | 
					 | 
				
			||||||
        {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 
 | 
					 | 
				
			||||||
                      'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 
 | 
					 | 
				
			||||||
                      'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %}
 | 
					 | 
				
			||||||
        {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates,
 | 
					 | 
				
			||||||
                                       'extrude'    : printer.gcode_move.absolute_extrude},
 | 
					 | 
				
			||||||
                          'speed'   : printer.gcode_move.speed,
 | 
					 | 
				
			||||||
                          'e'       : printer.gcode_move.gcode_position.e,
 | 
					 | 
				
			||||||
                          'factor'  : {'speed'  : printer.gcode_move.speed_factor,
 | 
					 | 
				
			||||||
                                       'extrude': printer.gcode_move.extrude_factor}} %}
 | 
					 | 
				
			||||||
        SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}"
 | 
					 | 
				
			||||||
        {% if not printer[printer.toolhead.extruder].can_extrude %}
 | 
					 | 
				
			||||||
          {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %}
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
          {% if extruder.fw_retract %}
 | 
					 | 
				
			||||||
            G10
 | 
					 | 
				
			||||||
          {% else %}
 | 
					 | 
				
			||||||
            M83     ; insure relative extrusion
 | 
					 | 
				
			||||||
            G0 E-{extruder.retract} F{speed.retract * 60}
 | 
					 | 
				
			||||||
          {% endif %}
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
        SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True 
 | 
					 | 
				
			||||||
        {macro.pause}            ; execute the klipper PAUSE command
 | 
					 | 
				
			||||||
        SET_GCODE_OFFSET X=0 Y=0 ; this will insure that the head parks always at the same position in a multi setup
 | 
					 | 
				
			||||||
        G90                      ; insure absolute move
 | 
					 | 
				
			||||||
        {% if "xyz" not in printer.toolhead.homed_axes %}
 | 
					 | 
				
			||||||
          {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %}
 | 
					 | 
				
			||||||
        {% else %}
 | 
					 | 
				
			||||||
          G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60}
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
        SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True
 | 
					 | 
				
			||||||
        UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5
 | 
					 | 
				
			||||||
        M400
 | 
					 | 
				
			||||||
      {% endif %}
 | 
					 | 
				
			||||||
      _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse}
 | 
					 | 
				
			||||||
    {% endif %}    
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro _TIMELAPSE_NEW_FRAME]
 | 
					 | 
				
			||||||
description: action call for timelapse shoot. must be a seperate macro
 | 
					 | 
				
			||||||
gcode:  
 | 
					 | 
				
			||||||
 {action_call_remote_method("timelapse_newframe", 
 | 
					 | 
				
			||||||
                            macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, 
 | 
					 | 
				
			||||||
                            hyperlapse=params.HYPERLAPSE)}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %}
 | 
					 | 
				
			||||||
  {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %}
 | 
					 | 
				
			||||||
  {% if tl.takingframe %}
 | 
					 | 
				
			||||||
    UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    {tl.macro.resume} VELOCITY={tl.speed.travel} ; execute the klipper RESUME command
 | 
					 | 
				
			||||||
    SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False
 | 
					 | 
				
			||||||
    {% if not printer[printer.toolhead.extruder].can_extrude %}
 | 
					 | 
				
			||||||
        {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")}
 | 
					 | 
				
			||||||
    {% else %}
 | 
					 | 
				
			||||||
      {% if tl.extruder.fw_retract %}
 | 
					 | 
				
			||||||
        G11
 | 
					 | 
				
			||||||
      {% else %}
 | 
					 | 
				
			||||||
        G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60}
 | 
					 | 
				
			||||||
        G0 F{tl.restore.speed}
 | 
					 | 
				
			||||||
        {% if tl.restore.absolute.extrude %} 
 | 
					 | 
				
			||||||
          M82
 | 
					 | 
				
			||||||
          G92 E{tl.restore.e}
 | 
					 | 
				
			||||||
        {% endif %}
 | 
					 | 
				
			||||||
      {% endif %}
 | 
					 | 
				
			||||||
    {% endif %}
 | 
					 | 
				
			||||||
    {% if tl.restore.factor.speed   != factor.speed   %} M220 S{(factor.speed*100)|round(0)}   {% endif %}
 | 
					 | 
				
			||||||
    {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %}
 | 
					 | 
				
			||||||
    {% if not tl.restore.absolute.coordinates %} G91 {% endif %}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
####################################################################################################
 | 
					 | 
				
			||||||
#                                                                                                  #
 | 
					 | 
				
			||||||
# HYPERLAPSE: Starts or stops a Hyperlapse video                                                   #
 | 
					 | 
				
			||||||
# Usage: HYPERLAPSE ACTION=START [CYCLE=time] starts a hyperlapse with cycle time (default 30 sec) #
 | 
					 | 
				
			||||||
#        HYPERLAPSE ACTION=STOP stops the hyperlapse recording                                     # 
 | 
					 | 
				
			||||||
#                                                                                                  #
 | 
					 | 
				
			||||||
####################################################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
######################### definition #########################
 | 
					 | 
				
			||||||
## cycle: cycle time in seconds
 | 
					 | 
				
			||||||
## run: internal use [True/False]
 | 
					 | 
				
			||||||
###############################################################
 | 
					 | 
				
			||||||
[gcode_macro HYPERLAPSE]
 | 
					 | 
				
			||||||
description: Start/Stop a hyperlapse recording
 | 
					 | 
				
			||||||
variable_cycle: 0
 | 
					 | 
				
			||||||
variable_run: False
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set cycle = params.CYCLE|default(30)|int %}
 | 
					 | 
				
			||||||
  {% if params.ACTION and params.ACTION|lower == 'start' %}
 | 
					 | 
				
			||||||
    {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)}
 | 
					 | 
				
			||||||
    SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True
 | 
					 | 
				
			||||||
    SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle}
 | 
					 | 
				
			||||||
    UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle}
 | 
					 | 
				
			||||||
    TIMELAPSE_TAKE_FRAME HYPERLAPSE=True
 | 
					 | 
				
			||||||
  {% elif params.ACTION and params.ACTION|lower == 'stop' %}
 | 
					 | 
				
			||||||
    {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %}
 | 
					 | 
				
			||||||
    SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False
 | 
					 | 
				
			||||||
    UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    {action_raise_error("Hyperlapse: No valid input parameter
 | 
					 | 
				
			||||||
                         Use: 
 | 
					 | 
				
			||||||
                         - HYPERLAPSE ACTION=START [CYCLE=time]
 | 
					 | 
				
			||||||
                         - HYPERLAPSE ACTION=STOP")}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[delayed_gcode _HYPERLAPSE_LOOP]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle}
 | 
					 | 
				
			||||||
  TIMELAPSE_TAKE_FRAME HYPERLAPSE=True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##########################################################################
 | 
					 | 
				
			||||||
#                                                                        #
 | 
					 | 
				
			||||||
# TIMELAPSE_RENDER: Render the video at print end                        #
 | 
					 | 
				
			||||||
#                                                                        #
 | 
					 | 
				
			||||||
##########################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
######################### definition #########################
 | 
					 | 
				
			||||||
## render: internal use. Valid inputs: [True, False]
 | 
					 | 
				
			||||||
## run_identifier: internal use. Valid input [0 .. 3]
 | 
					 | 
				
			||||||
###############################################################
 | 
					 | 
				
			||||||
[gcode_macro TIMELAPSE_RENDER]
 | 
					 | 
				
			||||||
description: Render Timelapse video and wait for the result
 | 
					 | 
				
			||||||
variable_render: False
 | 
					 | 
				
			||||||
variable_run_identifier: 0
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {action_respond_info("Timelapse: Rendering started")}
 | 
					 | 
				
			||||||
  {action_call_remote_method("timelapse_render", byrendermacro="True")}
 | 
					 | 
				
			||||||
  SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True
 | 
					 | 
				
			||||||
  {printer.configfile.settings['gcode_macro pause'].rename_existing} ; execute the klipper PAUSE command
 | 
					 | 
				
			||||||
  UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[delayed_gcode _WAIT_TIMELAPSE_RENDER]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %}
 | 
					 | 
				
			||||||
  SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1}
 | 
					 | 
				
			||||||
  {% if printer['gcode_macro TIMELAPSE_RENDER'].render %}
 | 
					 | 
				
			||||||
    M117 Rendering {['-','\\','|','/'][ri]}
 | 
					 | 
				
			||||||
    UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    {action_respond_info("Timelapse: Rendering finished")}
 | 
					 | 
				
			||||||
    M117
 | 
					 | 
				
			||||||
    {printer.configfile.settings['gcode_macro resume'].rename_existing} ; execute the klipper RESUME command
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##########################################################################
 | 
					 | 
				
			||||||
#                                                                        #
 | 
					 | 
				
			||||||
# TEST_STREAM_DELAY: Helper macro to find stream and park delay          #
 | 
					 | 
				
			||||||
#                                                                        #
 | 
					 | 
				
			||||||
##########################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro TEST_STREAM_DELAY]
 | 
					 | 
				
			||||||
description: Helper macro to find stream and park delay
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% set min = printer.toolhead.axis_minimum %}
 | 
					 | 
				
			||||||
  {% set max = printer.toolhead.axis_maximum %}
 | 
					 | 
				
			||||||
  {% set act = printer.toolhead.position %}
 | 
					 | 
				
			||||||
  {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %}
 | 
					 | 
				
			||||||
  {% if act.z > 5.0 %}
 | 
					 | 
				
			||||||
    G0 X{min.x + 5.0} F{tl.speed.travel|int * 60}
 | 
					 | 
				
			||||||
    G0 X{(max.x-min.x)/2}
 | 
					 | 
				
			||||||
    G4 P{tl.park.time|float * 1000}
 | 
					 | 
				
			||||||
    _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE
 | 
					 | 
				
			||||||
    G0 X{max.x - 5.0}
 | 
					 | 
				
			||||||
  {% else %}
 | 
					 | 
				
			||||||
    {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)}
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
							
								
								
									
										105
									
								
								moonraker.conf
									
										
									
									
									
								
							
							
						
						
									
										105
									
								
								moonraker.conf
									
										
									
									
									
								
							| 
						 | 
					@ -1,32 +1,24 @@
 | 
				
			||||||
[server]
 | 
					[server]
 | 
				
			||||||
host: 0.0.0.0
 | 
					host: 0.0.0.0
 | 
				
			||||||
port: 7125
 | 
					port: 7125
 | 
				
			||||||
klippy_uds_address: /home/pi/printer_data/comms/klippy.sock
 | 
					enable_debug_logging: False
 | 
				
			||||||
 | 
					config_path: ~/klipper_config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[authorization]
 | 
					[authorization]
 | 
				
			||||||
force_logins: True
 | 
					enabled: True
 | 
				
			||||||
cors_domains:
 | 
					cors_domains:
 | 
				
			||||||
  *.local
 | 
					    https://my.mainsail.xyz
 | 
				
			||||||
  *.lan
 | 
					    http://my.mainsail.xyz
 | 
				
			||||||
  *.nom
 | 
					    http://*.local
 | 
				
			||||||
  *://app.fluidd.xyz
 | 
					    http://*.lan
 | 
				
			||||||
  *://my.mainsail.xyz
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
trusted_clients:
 | 
					trusted_clients:
 | 
				
			||||||
  10.0.0.0/8
 | 
					    10.0.0.0/8
 | 
				
			||||||
  127.0.0.0/8
 | 
					    127.0.0.0/8
 | 
				
			||||||
  169.254.0.0/16
 | 
					    169.254.0.0/16
 | 
				
			||||||
  172.16.0.0/12
 | 
					    172.16.0.0/12
 | 
				
			||||||
  192.168.0.0/16
 | 
					    192.168.0.0/16
 | 
				
			||||||
  FE80::/10
 | 
					    FE80::/10
 | 
				
			||||||
  ::1/128
 | 
					    ::1/128
 | 
				
			||||||
 | 
					 | 
				
			||||||
[file_manager]
 | 
					 | 
				
			||||||
enable_object_processing: True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[data_store]
 | 
					 | 
				
			||||||
temperature_store_size: 600
 | 
					 | 
				
			||||||
gcode_store_size: 1000
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# enables partial support of Octoprint API
 | 
					# enables partial support of Octoprint API
 | 
				
			||||||
[octoprint_compat]
 | 
					[octoprint_compat]
 | 
				
			||||||
| 
						 | 
					@ -36,71 +28,8 @@ gcode_store_size: 1000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# this enables moonraker's update manager
 | 
					# this enables moonraker's update manager
 | 
				
			||||||
[update_manager]
 | 
					[update_manager]
 | 
				
			||||||
enable_auto_refresh: True
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[update_manager client fluidd]
 | 
					[update_manager client mainsail]
 | 
				
			||||||
type: web
 | 
					type: web
 | 
				
			||||||
repo: fluidd-core/fluidd
 | 
					repo: meteyou/mainsail
 | 
				
			||||||
path: ~/fluidd
 | 
					path: ~/mainsail
 | 
				
			||||||
 | 
					 | 
				
			||||||
# [update_manager client mainsail]
 | 
					 | 
				
			||||||
# type: web
 | 
					 | 
				
			||||||
# channel: beta
 | 
					 | 
				
			||||||
# repo: mainsail-crew/mainsail
 | 
					 | 
				
			||||||
# path: ~/mainsail
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [update_manager klipper]
 | 
					 | 
				
			||||||
# type: git_repo
 | 
					 | 
				
			||||||
# origin: https://github.com/Klipper3d/klipper.git
 | 
					 | 
				
			||||||
# path: ~/klipper
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[update_manager KlipperScreen]
 | 
					 | 
				
			||||||
type: git_repo
 | 
					 | 
				
			||||||
path: ~/KlipperScreen
 | 
					 | 
				
			||||||
origin: https://github.com/jordanruthe/KlipperScreen.git
 | 
					 | 
				
			||||||
env: ~/.KlipperScreen-env/bin/python
 | 
					 | 
				
			||||||
requirements: scripts/KlipperScreen-requirements.txt
 | 
					 | 
				
			||||||
install_script: scripts/KlipperScreen-install.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [update_manager timelapse]
 | 
					 | 
				
			||||||
# type: git_repo
 | 
					 | 
				
			||||||
# primary_branch: main
 | 
					 | 
				
			||||||
# is_system_service: false
 | 
					 | 
				
			||||||
# path: ~/moonraker-timelapse
 | 
					 | 
				
			||||||
# origin: https://github.com/mainsail-crew/moonraker-timelapse.git
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [update_manager ercf]
 | 
					 | 
				
			||||||
# type: git_repo
 | 
					 | 
				
			||||||
# primary_branch: main
 | 
					 | 
				
			||||||
# is_system_service: false
 | 
					 | 
				
			||||||
# path: ~/EnragedRabbitProject
 | 
					 | 
				
			||||||
# origin: https://github.com/EtteGit/EnragedRabbitProject.git
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[power voron-v2.4]
 | 
					 | 
				
			||||||
# type: tplink_smartplug
 | 
					 | 
				
			||||||
# address: 192.168.11.91
 | 
					 | 
				
			||||||
type: tasmota
 | 
					 | 
				
			||||||
address: pcu-eg-office-voronberry.nom
 | 
					 | 
				
			||||||
# password: mypassword
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [timelapse]
 | 
					 | 
				
			||||||
##   Following basic configuration is default to most images and don't need
 | 
					 | 
				
			||||||
##   to be changed in most scenarios. Only uncomment and change it if your
 | 
					 | 
				
			||||||
##   Image differ from standard installations. In most common scenarios
 | 
					 | 
				
			||||||
##   a User only need [timelapse] in there configuration.
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##   Directory where the generated video will be saved
 | 
					 | 
				
			||||||
# output_path: ~/timelapse/
 | 
					 | 
				
			||||||
##   Directory where the temporary frames are saved
 | 
					 | 
				
			||||||
# frame_path: /tmp/timelapse/
 | 
					 | 
				
			||||||
##   Directory where ffmpeg is installed
 | 
					 | 
				
			||||||
#ffmpeg_binary_path: /usr/bin/ffmpeg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Crowsnest update_manager entry
 | 
					 | 
				
			||||||
[update_manager crowsnest]
 | 
					 | 
				
			||||||
type: git_repo
 | 
					 | 
				
			||||||
path: ~/crowsnest
 | 
					 | 
				
			||||||
origin: https://github.com/mainsail-crew/crowsnest.git
 | 
					 | 
				
			||||||
primary_branch: legacy/v3
 | 
					 | 
				
			||||||
managed_services: crowsnest
 | 
					 | 
				
			||||||
install_script: tools/install.sh
 | 
					 | 
				
			||||||
							
								
								
									
										27
									
								
								neopixel.cfg
									
										
									
									
									
								
							
							
						
						
									
										27
									
								
								neopixel.cfg
									
										
									
									
									
								
							| 
						 | 
					@ -1,27 +0,0 @@
 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
# LED Control
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[neopixel caselight]
 | 
					 | 
				
			||||||
pin: PB6            # Octopus BL_Touch
 | 
					 | 
				
			||||||
chain_count: 44
 | 
					 | 
				
			||||||
initial_RED: 0.6
 | 
					 | 
				
			||||||
initial_GREEN: 0.5
 | 
					 | 
				
			||||||
initial_BLUE: 0.4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[neopixel toolhead]
 | 
					 | 
				
			||||||
# pin: PB6            # Octopus BL_Touch
 | 
					 | 
				
			||||||
# pin: PB0            # Octopus LED
 | 
					 | 
				
			||||||
pin: EBBCan: PD3
 | 
					 | 
				
			||||||
chain_count: 3
 | 
					 | 
				
			||||||
color_order: GRBW
 | 
					 | 
				
			||||||
initial_RED: 0.3
 | 
					 | 
				
			||||||
initial_GREEN: 0.3
 | 
					 | 
				
			||||||
initial_BLUE: 0.3
 | 
					 | 
				
			||||||
initial_WHITE: 0.2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[delayed_gcode toolhead_leds]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  SET_LED LED=toolhead INDEX=1 RED=0.0 BLUE=0.5 GREEN=0.0 WHITE=0.0
 | 
					 | 
				
			||||||
initial_duration: 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										739
									
								
								printer.cfg
									
										
									
									
									
								
							
							
						
						
									
										739
									
								
								printer.cfg
									
										
									
									
									
								
							| 
						 | 
					@ -1,398 +1,405 @@
 | 
				
			||||||
# This file contains common pin mappings for the BigTreeTech OctoPus V1.
 | 
					# This file contains common configurations and pin mappings for the Prusa
 | 
				
			||||||
# To use this config, the firmware should be compiled for the STM32F446 with a "32KiB bootloader"
 | 
					# Mini+, which uses the Prusa Buddy board.
 | 
				
			||||||
# Enable "extra low-level configuration options" and select the "12MHz crystal" as clock reference
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# after running "make", copy the generated "klipper/out/klipper.bin" file to a
 | 
					# To use this config, the firmware should be compiled for the STM32F407. When
 | 
				
			||||||
# file named "firmware.bin" on an SD card and then restart the OctoPus with that SD card.
 | 
					# running "make menuconfig", enable "extra low-level configuration setup",
 | 
				
			||||||
 | 
					# select the "128KiB + 512 byte offset" bootloader, and USB communication.
 | 
				
			||||||
 | 
					# Connect the printer to your Raspberry Pi using the printer's micro-USB port.
 | 
				
			||||||
 | 
					# If you prefer to remove Prusa's stock bootloader entirely, select the
 | 
				
			||||||
 | 
					# "No bootloader" option.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# When flashing for the first time, you will need to break the "appendix"
 | 
				
			||||||
 | 
					# on the Buddy board, then put the device into DFU mode by moving the jumper
 | 
				
			||||||
 | 
					# on the 3-pin header (older boards) or shorting the 2-pin header (newer boards)
 | 
				
			||||||
 | 
					# and resetting, and finally use "make flash" to install Klipper. Once Klipper is
 | 
				
			||||||
 | 
					# installed, you no longer need the jumper - just use "make flash" which will
 | 
				
			||||||
 | 
					# automatically put the device into DFU mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Note that if you were previously running Prusa firmware, you must fully
 | 
				
			||||||
 | 
					# power cycle the board after flashing. Otherwise, Klipper will be unable to
 | 
				
			||||||
 | 
					# communicate with the TMC2209s due to the abrupt change in the baud rate,
 | 
				
			||||||
 | 
					# and will show this error: "Unable to read tmc uart register IFCNT".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# See docs/Config_Reference.md for a description of parameters.
 | 
					# See docs/Config_Reference.md for a description of parameters.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Voron Design VORON2 250/300/350mm BigTreeTech OctoPus V1 TMC2209 UART config
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## *** THINGS TO CHANGE/CHECK: ***
 | 
					 | 
				
			||||||
## MCU paths                                    [mcu] section
 | 
					 | 
				
			||||||
## Thermistor types                             [extruder] and [heater_bed] sections - See 'sensor types' list at end of file
 | 
					 | 
				
			||||||
## Z Endstop Switch location                    [safe_z_home] section
 | 
					 | 
				
			||||||
## Homing end position                          [gcode_macro G32] section
 | 
					 | 
				
			||||||
## Z Endstop Switch  offset for Z0              [stepper_z] section
 | 
					 | 
				
			||||||
## Probe points                                 [quad_gantry_level] section
 | 
					 | 
				
			||||||
## Min & Max gantry corner postions             [quad_gantry_level] section
 | 
					 | 
				
			||||||
## PID tune                                     [extruder] and [heater_bed] sections
 | 
					 | 
				
			||||||
## Fine tune E steps                            [extruder] section
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[mcu]
 | 
					 | 
				
			||||||
## [X in MOTOR0] - B Motor
 | 
					 | 
				
			||||||
## [Y in MOTOR1] - A Motor
 | 
					 | 
				
			||||||
## [E in MOTOR6] - Extruder
 | 
					 | 
				
			||||||
## Obtain definition by "ls -l /dev/serial/by-id/" then unplug to verify
 | 
					 | 
				
			||||||
##--------------------------------------------------------------------
 | 
					 | 
				
			||||||
# serial: /dev/serial/by-id/usb-Klipper_stm32f446xx_1E0030000E5053424E363620-if00 # octopus
 | 
					 | 
				
			||||||
serial: /dev/serial/by-id/usb-Klipper_stm32f446xx_410015000250534E4E313120-if00 # octopus pro
 | 
					 | 
				
			||||||
# serial: /dev/serial0
 | 
					 | 
				
			||||||
# restart_method: command
 | 
					 | 
				
			||||||
##--------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[printer]
 | 
					 | 
				
			||||||
kinematics: corexy
 | 
					 | 
				
			||||||
max_velocity: 600
 | 
					 | 
				
			||||||
## regular
 | 
					 | 
				
			||||||
max_accel: 4000
 | 
					 | 
				
			||||||
max_accel_to_decel: 2000
 | 
					 | 
				
			||||||
## resonance testing
 | 
					 | 
				
			||||||
# max_accel: 10000
 | 
					 | 
				
			||||||
# max_accel_to_decel: 5000
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
max_z_velocity: 30            # Max 15 for 12V TMC Drivers, can increase for 24V
 | 
					 | 
				
			||||||
max_z_accel: 500
 | 
					 | 
				
			||||||
square_corner_velocity: 5.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[virtual_sdcard]
 | 
					 | 
				
			||||||
path: /home/pi/printer_data/gcodes
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[pause_resume]
 | 
					[pause_resume]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[display_status]
 | 
					[display_status]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[exclude_object]
 | 
					[virtual_sdcard]
 | 
				
			||||||
 | 
					path: ~/gcode_files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# enable M118 and RESPOND
 | 
					######################################################################
 | 
				
			||||||
[respond]
 | 
					# Macros
 | 
				
			||||||
# default_type: echo
 | 
					######################################################################
 | 
				
			||||||
# default_type: echo
 | 
					 | 
				
			||||||
#   Sets the default prefix of the "M118" and "RESPOND" output to one
 | 
					 | 
				
			||||||
#   of the following:
 | 
					 | 
				
			||||||
#       echo: "echo: " (This is the default)
 | 
					 | 
				
			||||||
#       command: "// "
 | 
					 | 
				
			||||||
#       error: "!! "
 | 
					 | 
				
			||||||
default_prefix: >> 
 | 
					 | 
				
			||||||
#      Directly sets the default prefix. If present, this value will
 | 
					 | 
				
			||||||
#      override the "default_type".
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
# includes
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[include ebb36.cfg]
 | 
					# custom slicer START_PRINT and END_PRINT macros
 | 
				
			||||||
[include macros/_init.cfg]
 | 
					[gcode_macro START_PRINT]
 | 
				
			||||||
[include neopixel.cfg]
 | 
					description: start printing
 | 
				
			||||||
[include fans.cfg]
 | 
					gcode:
 | 
				
			||||||
[include resonance_test.cfg]
 | 
					    {% set BED_TEMP = params.BED_TEMP|default(60)|float %}
 | 
				
			||||||
 | 
					    {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %}
 | 
				
			||||||
 | 
					    M140 S{BED_TEMP}            # Start bed heating
 | 
				
			||||||
 | 
					    M109 S{EXTRUDER_TEMP}       # Start extruder heating
 | 
				
			||||||
 | 
					    G90                         # Use absolute coordinates
 | 
				
			||||||
 | 
					    SET_GCODE_OFFSET Z=0.0      # Reset the G-Code Z offset (adjust Z offset if needed)
 | 
				
			||||||
 | 
					    G28                         # Home the printer
 | 
				
			||||||
 | 
					    G1 Z5 F3000                 # Move the nozzle near the bed
 | 
				
			||||||
 | 
					    G1 Z0.15 F300               # Move the nozzle very close to the bed
 | 
				
			||||||
 | 
					    M190 S{BED_TEMP}            # Wait for bed to reach temperature
 | 
				
			||||||
 | 
					    M109 S{EXTRUDER_TEMP}       # Set and wait for nozzle to reach temperature
 | 
				
			||||||
 | 
					    CLEAN_NOZZLE                # clean the nozzle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro END_PRINT]
 | 
				
			||||||
 | 
					description: end printing
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    M140 S0                     # Turn off bed
 | 
				
			||||||
 | 
					    M104 S0                     # Turn off extruder
 | 
				
			||||||
 | 
					    M106 S0                     # Turn off fan
 | 
				
			||||||
 | 
					    G91                         # Use relativ coordinates
 | 
				
			||||||
 | 
					    G1 X-2 Y-2 E-3 F300         # Move nozzle away from print while retracting
 | 
				
			||||||
 | 
					    G1 Z10 F3000                # Raise nozzle by 10mm
 | 
				
			||||||
 | 
					    G90                         # Use absolute coordinates
 | 
				
			||||||
 | 
					    M84                         # Disable steppers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#####################################################################
 | 
					# [gcode_macro PARK]
 | 
				
			||||||
# X/Y Stepper Settings
 | 
					# description: park the print head
 | 
				
			||||||
#####################################################################
 | 
					# rename_existing: G27
 | 
				
			||||||
 | 
					# gcode:
 | 
				
			||||||
 | 
					#     {% set x = params.X|default(140) %}         #edit to your park position
 | 
				
			||||||
 | 
					#     {% set y = params.Y|default(20) %}          #edit to your park position
 | 
				
			||||||
 | 
					#     {% set z = params.Z|default(10)|float %}    #edit to your park position
 | 
				
			||||||
 | 
					#     {% set e = params.E|default(1) %}           #edit to your retract length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## X Stepper on MOTOR0(B Motor)
 | 
					[gcode_macro PAUSE]
 | 
				
			||||||
[stepper_x]
 | 
					description: Pause the actual running print
 | 
				
			||||||
step_pin: PF13
 | 
					rename_existing: PAUSE_BASE
 | 
				
			||||||
dir_pin: !PF12
 | 
					gcode:
 | 
				
			||||||
enable_pin: !PF14
 | 
					    ##### set defaults #####
 | 
				
			||||||
rotation_distance: 40
 | 
					    {% set x = params.X|default(140) %}      #edit to your park position
 | 
				
			||||||
homing_speed: 20
 | 
					    {% set y = params.Y|default(20) %}      #edit to your park position
 | 
				
			||||||
microsteps: 32
 | 
					    {% set z = params.Z|default(10)|float %} #edit to your park position
 | 
				
			||||||
full_steps_per_rotation: 400  # 200: 1.8 deg stepper, 400: 0.9 deg stepper
 | 
					    {% set e = params.E|default(1) %}        #edit to your retract length
 | 
				
			||||||
# endstop_pin: PG6              # octopus
 | 
					    ##### calculate save lift position #####
 | 
				
			||||||
endstop_pin: tmc5160_stepper_x:virtual_endstop
 | 
					    {% set max_z = printer.toolhead.axis_maximum.z|float %}
 | 
				
			||||||
position_min: 0
 | 
					    {% set act_z = printer.toolhead.position.z|float %}
 | 
				
			||||||
position_endstop: 300
 | 
					    {% set lift_z = z|abs %}
 | 
				
			||||||
position_max: 300
 | 
					    {% if act_z < (max_z - lift_z) %}
 | 
				
			||||||
# homing_retract_dist: 5
 | 
					        {% set z_safe = lift_z %}
 | 
				
			||||||
homing_retract_dist: 0
 | 
					 | 
				
			||||||
homing_positive_dir: true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc5160 stepper_x]
 | 
					 | 
				
			||||||
cs_pin: PC4
 | 
					 | 
				
			||||||
spi_software_miso_pin: PA6
 | 
					 | 
				
			||||||
spi_software_mosi_pin: PA7
 | 
					 | 
				
			||||||
spi_software_sclk_pin: PA5
 | 
					 | 
				
			||||||
interpolate: False
 | 
					 | 
				
			||||||
run_current: 1.0
 | 
					 | 
				
			||||||
sense_resistor: 0.110
 | 
					 | 
				
			||||||
stealthchop_threshold: 0
 | 
					 | 
				
			||||||
diag0_pin: ^!PG6
 | 
					 | 
				
			||||||
driver_SGT: 1               # -64 most sensitive, 63 least sensitive
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Y Stepper on MOTOR1 (A Motor)
 | 
					 | 
				
			||||||
[stepper_y]
 | 
					 | 
				
			||||||
step_pin: PG0
 | 
					 | 
				
			||||||
dir_pin: !PG1
 | 
					 | 
				
			||||||
enable_pin: !PF15
 | 
					 | 
				
			||||||
rotation_distance: 40
 | 
					 | 
				
			||||||
homing_speed: 20
 | 
					 | 
				
			||||||
microsteps: 32
 | 
					 | 
				
			||||||
full_steps_per_rotation: 400  # 200: 1.8 deg stepper, 400: 0.9 deg stepper
 | 
					 | 
				
			||||||
# endstop_pin: PG9              # octopus
 | 
					 | 
				
			||||||
endstop_pin: tmc5160_stepper_y:virtual_endstop
 | 
					 | 
				
			||||||
position_min: 0
 | 
					 | 
				
			||||||
position_endstop: 303
 | 
					 | 
				
			||||||
position_max: 303
 | 
					 | 
				
			||||||
# homing_retract_dist: 5
 | 
					 | 
				
			||||||
homing_retract_dist: 0
 | 
					 | 
				
			||||||
homing_positive_dir: true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc5160 stepper_y]
 | 
					 | 
				
			||||||
cs_pin: PD11
 | 
					 | 
				
			||||||
spi_software_miso_pin: PA6
 | 
					 | 
				
			||||||
spi_software_mosi_pin: PA7
 | 
					 | 
				
			||||||
spi_software_sclk_pin: PA5
 | 
					 | 
				
			||||||
interpolate: False
 | 
					 | 
				
			||||||
run_current: 1.0
 | 
					 | 
				
			||||||
sense_resistor: 0.110
 | 
					 | 
				
			||||||
stealthchop_threshold: 0
 | 
					 | 
				
			||||||
diag0_pin: ^!PG9
 | 
					 | 
				
			||||||
driver_SGT: 1               # -64 most sensitive, 63 least sensitive
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
# Z Stepper Settings
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Z0 Stepper - Front Left on MOTOR2_1
 | 
					 | 
				
			||||||
[stepper_z]
 | 
					 | 
				
			||||||
step_pin: PF11
 | 
					 | 
				
			||||||
dir_pin: PG3
 | 
					 | 
				
			||||||
enable_pin: !PG5
 | 
					 | 
				
			||||||
rotation_distance: 40
 | 
					 | 
				
			||||||
gear_ratio: 80:16
 | 
					 | 
				
			||||||
microsteps: 32
 | 
					 | 
				
			||||||
endstop_pin: probe:z_virtual_endstop
 | 
					 | 
				
			||||||
position_max: 240
 | 
					 | 
				
			||||||
position_min: -3
 | 
					 | 
				
			||||||
homing_speed: 5.0             # speed: mm/sec, feedrate: mm/min
 | 
					 | 
				
			||||||
homing_retract_speed: 10
 | 
					 | 
				
			||||||
second_homing_speed: 2
 | 
					 | 
				
			||||||
homing_retract_dist: 5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc2209 stepper_z]
 | 
					 | 
				
			||||||
uart_pin: PC6
 | 
					 | 
				
			||||||
interpolate: False
 | 
					 | 
				
			||||||
run_current: 0.8
 | 
					 | 
				
			||||||
sense_resistor: 0.110
 | 
					 | 
				
			||||||
stealthchop_threshold: 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Z1 Stepper - Rear Left on MOTOR3
 | 
					 | 
				
			||||||
[stepper_z1]
 | 
					 | 
				
			||||||
step_pin: PG4
 | 
					 | 
				
			||||||
dir_pin: !PC1
 | 
					 | 
				
			||||||
enable_pin: !PA0
 | 
					 | 
				
			||||||
rotation_distance: 40
 | 
					 | 
				
			||||||
gear_ratio: 80:16
 | 
					 | 
				
			||||||
microsteps: 32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc2209 stepper_z1]
 | 
					 | 
				
			||||||
uart_pin: PC7
 | 
					 | 
				
			||||||
interpolate: False
 | 
					 | 
				
			||||||
run_current: 0.8
 | 
					 | 
				
			||||||
sense_resistor: 0.110
 | 
					 | 
				
			||||||
stealthchop_threshold: 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Z2 Stepper - Rear Right on MOTOR4
 | 
					 | 
				
			||||||
[stepper_z2]
 | 
					 | 
				
			||||||
step_pin: PF9
 | 
					 | 
				
			||||||
dir_pin: PF10
 | 
					 | 
				
			||||||
enable_pin: !PG2
 | 
					 | 
				
			||||||
rotation_distance: 40
 | 
					 | 
				
			||||||
gear_ratio: 80:16
 | 
					 | 
				
			||||||
microsteps: 32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc2209 stepper_z2]
 | 
					 | 
				
			||||||
uart_pin: PF2
 | 
					 | 
				
			||||||
interpolate: False
 | 
					 | 
				
			||||||
run_current: 0.8
 | 
					 | 
				
			||||||
sense_resistor: 0.110
 | 
					 | 
				
			||||||
stealthchop_threshold: 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Z3 Stepper - Front Right on MOTOR5
 | 
					 | 
				
			||||||
[stepper_z3]
 | 
					 | 
				
			||||||
step_pin: PC13
 | 
					 | 
				
			||||||
dir_pin: !PF0
 | 
					 | 
				
			||||||
enable_pin: !PF1
 | 
					 | 
				
			||||||
rotation_distance: 40
 | 
					 | 
				
			||||||
gear_ratio: 80:16
 | 
					 | 
				
			||||||
microsteps: 32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[tmc2209 stepper_z3]
 | 
					 | 
				
			||||||
uart_pin: PE4
 | 
					 | 
				
			||||||
interpolate: False
 | 
					 | 
				
			||||||
run_current: 0.8
 | 
					 | 
				
			||||||
sense_resistor: 0.110
 | 
					 | 
				
			||||||
stealthchop_threshold: 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
# Bed Heater
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[heater_bed]
 | 
					 | 
				
			||||||
## SSR Pin - BED_OUT
 | 
					 | 
				
			||||||
heater_pin: PA1
 | 
					 | 
				
			||||||
sensor_type: Generic 3950
 | 
					 | 
				
			||||||
sensor_pin: PF3
 | 
					 | 
				
			||||||
## Adjust Max Power so your heater doesn't warp your bed
 | 
					 | 
				
			||||||
max_power: 0.8          # 0.4W per cm2, 360W for 300 build
 | 
					 | 
				
			||||||
min_temp: 0
 | 
					 | 
				
			||||||
max_temp: 120
 | 
					 | 
				
			||||||
#control: pid
 | 
					 | 
				
			||||||
#pid_kp: 58.437
 | 
					 | 
				
			||||||
#pid_ki: 2.347
 | 
					 | 
				
			||||||
#pid_kd: 363.769
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
# Enclosure Temp Sensor Section
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
[thermistor chamber]
 | 
					 | 
				
			||||||
temperature1: 25
 | 
					 | 
				
			||||||
resistance1: 10000
 | 
					 | 
				
			||||||
beta: 3950
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[temperature_sensor MCU]
 | 
					 | 
				
			||||||
sensor_type: temperature_mcu
 | 
					 | 
				
			||||||
sensor_mcu: mcu
 | 
					 | 
				
			||||||
min_temp: 0
 | 
					 | 
				
			||||||
max_temp: 100
 | 
					 | 
				
			||||||
# gcode_id: C
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## replaced, there is no thermistor on the stealthburner pcb
 | 
					 | 
				
			||||||
# [temperature_sensor chamber]
 | 
					 | 
				
			||||||
# sensor_type: chamber
 | 
					 | 
				
			||||||
# sensor_pin: PF5
 | 
					 | 
				
			||||||
# min_temp: 0
 | 
					 | 
				
			||||||
# max_temp: 100
 | 
					 | 
				
			||||||
# gcode_id: C
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[temperature_sensor RPI]
 | 
					 | 
				
			||||||
sensor_type: temperature_host
 | 
					 | 
				
			||||||
min_temp: 0
 | 
					 | 
				
			||||||
max_temp: 100
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[idle_timeout]
 | 
					 | 
				
			||||||
timeout: 1800
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# [safe_z_home]
 | 
					 | 
				
			||||||
# home_xy_position: 150, 150
 | 
					 | 
				
			||||||
# z_hop: 5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
# Probe
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[probe]
 | 
					 | 
				
			||||||
## Voron-Tap
 | 
					 | 
				
			||||||
# pin: ^PG11
 | 
					 | 
				
			||||||
pin: EBBCan: PB9
 | 
					 | 
				
			||||||
x_offset: 0
 | 
					 | 
				
			||||||
y_offset: 0
 | 
					 | 
				
			||||||
#z_offset: 0
 | 
					 | 
				
			||||||
speed: 5.0
 | 
					 | 
				
			||||||
lift_speed: 10
 | 
					 | 
				
			||||||
samples: 3
 | 
					 | 
				
			||||||
samples_result: median
 | 
					 | 
				
			||||||
sample_retract_dist: 3
 | 
					 | 
				
			||||||
samples_tolerance: 0.01
 | 
					 | 
				
			||||||
samples_tolerance_retries: 5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
activate_gcode:
 | 
					 | 
				
			||||||
    # impatient
 | 
					 | 
				
			||||||
    {% set PROBE_TEMP = 120 %}
 | 
					 | 
				
			||||||
    # {% set PROBE_TEMP = 250 %}
 | 
					 | 
				
			||||||
    {% set MAX_TEMP = PROBE_TEMP + 5 %}
 | 
					 | 
				
			||||||
    {% set ACTUAL_TEMP = printer.extruder.temperature %}
 | 
					 | 
				
			||||||
    {% set TARGET_TEMP = printer.extruder.target %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {% if TARGET_TEMP > PROBE_TEMP %}
 | 
					 | 
				
			||||||
        { action_respond_info('Extruder temperature target of %.1fC is too high, lowering to %.1fC' % (TARGET_TEMP, PROBE_TEMP)) }
 | 
					 | 
				
			||||||
        M109 S{ PROBE_TEMP }
 | 
					 | 
				
			||||||
    {% else %}
 | 
					    {% else %}
 | 
				
			||||||
        # Temperature target is already low enough, but nozzle may still be too hot.
 | 
					        {% set z_safe = max_z - act_z %}
 | 
				
			||||||
        {% if ACTUAL_TEMP > MAX_TEMP %}
 | 
					    {% endif %}
 | 
				
			||||||
            { action_respond_info('Extruder temperature %.1fC is still too high, waiting until below %.1fC' % (ACTUAL_TEMP, MAX_TEMP)) }
 | 
					    ##### end of definitions #####
 | 
				
			||||||
            TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={ MAX_TEMP }
 | 
					    PAUSE_BASE
 | 
				
			||||||
        {% endif %}
 | 
					    G91
 | 
				
			||||||
 | 
					    {% if printer.extruder.can_extrude|lower == 'true' %}
 | 
				
			||||||
 | 
					      G1 E-{e} F2100
 | 
				
			||||||
 | 
					    {% else %}
 | 
				
			||||||
 | 
					      {action_respond_info("Extruder not hot enough")}
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					    {% if "xyz" in printer.toolhead.homed_axes %}    
 | 
				
			||||||
 | 
					      G1 Z{z_safe}
 | 
				
			||||||
 | 
					      G90
 | 
				
			||||||
 | 
					      G1 X{x} Y{y} F6000
 | 
				
			||||||
 | 
					    {% else %}
 | 
				
			||||||
 | 
					      {action_respond_info("Printer not homed")}
 | 
				
			||||||
    {% endif %}
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro RESUME]
 | 
				
			||||||
 | 
					description: Resume the actual running print
 | 
				
			||||||
 | 
					rename_existing: RESUME_BASE
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    ##### set defaults #####
 | 
				
			||||||
 | 
					    {% set e = params.E|default(1) %} #edit to your retract length
 | 
				
			||||||
 | 
					    #### get VELOCITY parameter if specified ####
 | 
				
			||||||
 | 
					    {% if 'VELOCITY' in params|upper %}
 | 
				
			||||||
 | 
					      {% set get_params = ('VELOCITY=' + params.VELOCITY)  %}
 | 
				
			||||||
 | 
					    {%else %}
 | 
				
			||||||
 | 
					      {% set get_params = "" %}
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					    ##### end of definitions #####
 | 
				
			||||||
 | 
					    G91
 | 
				
			||||||
 | 
					    {% if printer.extruder.can_extrude|lower == 'true' %}
 | 
				
			||||||
 | 
					      G1 E{e} F2100
 | 
				
			||||||
 | 
					    {% else %}
 | 
				
			||||||
 | 
					      {action_respond_info("Extruder not hot enough")}
 | 
				
			||||||
 | 
					    {% endif %}  
 | 
				
			||||||
 | 
					    RESUME_BASE {get_params}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro CANCEL_PRINT]
 | 
				
			||||||
 | 
					description: Cancel the actual running print
 | 
				
			||||||
 | 
					rename_existing: CANCEL_PRINT_BASE
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    TURN_OFF_HEATERS
 | 
				
			||||||
 | 
					    CANCEL_PRINT_BASE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro CLEAN_NOZZLE]]
 | 
				
			||||||
 | 
					description: clean the nozzle
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    {% set BED_TEMP = params.BED_TEMP|default(60)|float %}
 | 
				
			||||||
 | 
					    {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %}
 | 
				
			||||||
 | 
					    {% set X1 = params.X1|default(120)|float %}
 | 
				
			||||||
 | 
					    {% set X2 = params.X2|default(40)|float %}
 | 
				
			||||||
 | 
					    {% set MANUAL = params.MANUAL|default(0) %}
 | 
				
			||||||
 | 
					    SAVE_GCODE_STATE NAME=clean_nozzle_state
 | 
				
			||||||
 | 
					    {% if MANUAL %}
 | 
				
			||||||
 | 
					        G28                     # home
 | 
				
			||||||
 | 
					        M104 S{EXTRUDER_TEMP}   # start heating extruder
 | 
				
			||||||
 | 
					        M140 S{BED_TEMP}        # start heating bed
 | 
				
			||||||
 | 
					        M109 S{EXTRUDER_TEMP}   # wait for extruder to reach temperature
 | 
				
			||||||
 | 
					        M190 S{BED_TEMP}        # wait for bed to reach temperature
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					    G90                         # absolute positioning
 | 
				
			||||||
 | 
					    G92 E0
 | 
				
			||||||
 | 
					    G0 F1500
 | 
				
			||||||
 | 
					    G0 X{X1} Y0 Z5
 | 
				
			||||||
 | 
					    G0 X{X1} Y0 Z0
 | 
				
			||||||
 | 
					    G0 X{X2} Y0 Z0 E10
 | 
				
			||||||
 | 
					    RESTORE_GCODE_STATE NAME=clean_nozzle_state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro M600]
 | 
				
			||||||
 | 
					description: Change filament
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    {% set X = params.X|default(50)|float %}
 | 
				
			||||||
 | 
					    {% set Y = params.Y|default(0)|float %}
 | 
				
			||||||
 | 
					    {% set Z = params.Z|default(10)|float %}
 | 
				
			||||||
 | 
					    SAVE_GCODE_STATE NAME=M600_state
 | 
				
			||||||
 | 
					    PAUSE
 | 
				
			||||||
 | 
					    G91
 | 
				
			||||||
 | 
					    G1 E-.8 F2700
 | 
				
			||||||
 | 
					    G1 Z{Z}
 | 
				
			||||||
 | 
					    G90
 | 
				
			||||||
 | 
					    G1 X{X} Y{Y} F3000
 | 
				
			||||||
 | 
					    G91
 | 
				
			||||||
 | 
					    G1 E-50 F1000
 | 
				
			||||||
 | 
					    RESTORE_GCODE_STATE NAME=M600_state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Remove unused gcodes
 | 
				
			||||||
 | 
					[gcode_macro G29]
 | 
				
			||||||
 | 
					description: Bed Leveling
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    G4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro M201]
 | 
				
			||||||
 | 
					description: Set Print Max Acceleration
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    G4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro M203]
 | 
				
			||||||
 | 
					description: Set Max Feedrate
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    G4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro M205]
 | 
				
			||||||
 | 
					description: Set Advanced Settings
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    G4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[gcode_macro M900]
 | 
				
			||||||
 | 
					description: Linear Advance Factor
 | 
				
			||||||
 | 
					gcode:
 | 
				
			||||||
 | 
					    G4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[stepper_x]
 | 
				
			||||||
 | 
					step_pin: PD1
 | 
				
			||||||
 | 
					dir_pin: PD0
 | 
				
			||||||
 | 
					enable_pin: !PD3
 | 
				
			||||||
 | 
					microsteps: 16
 | 
				
			||||||
 | 
					rotation_distance: 32  # 200 * 16 / 100
 | 
				
			||||||
 | 
					endstop_pin: tmc2209_stepper_x:virtual_endstop
 | 
				
			||||||
 | 
					position_endstop: 180.4
 | 
				
			||||||
 | 
					position_min: -2
 | 
				
			||||||
 | 
					position_max: 180.4
 | 
				
			||||||
 | 
					homing_speed: 50
 | 
				
			||||||
 | 
					homing_retract_dist: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[stepper_y]
 | 
				
			||||||
 | 
					step_pin: PD13
 | 
				
			||||||
 | 
					dir_pin: PD12
 | 
				
			||||||
 | 
					enable_pin: !PD14
 | 
				
			||||||
 | 
					microsteps: 16
 | 
				
			||||||
 | 
					rotation_distance: 32  # 200 * 16 / 100
 | 
				
			||||||
 | 
					endstop_pin: tmc2209_stepper_y:virtual_endstop
 | 
				
			||||||
 | 
					position_endstop: -3
 | 
				
			||||||
 | 
					position_min: -3
 | 
				
			||||||
 | 
					position_max: 180
 | 
				
			||||||
 | 
					homing_speed: 50
 | 
				
			||||||
 | 
					homing_retract_dist: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[stepper_z]
 | 
				
			||||||
 | 
					step_pin: PD4
 | 
				
			||||||
 | 
					dir_pin: !PD15
 | 
				
			||||||
 | 
					enable_pin: !PD2
 | 
				
			||||||
 | 
					microsteps: 16
 | 
				
			||||||
 | 
					rotation_distance: 4
 | 
				
			||||||
 | 
					endstop_pin: probe:z_virtual_endstop
 | 
				
			||||||
 | 
					position_min: -3
 | 
				
			||||||
 | 
					position_max: 185
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[extruder]
 | 
				
			||||||
 | 
					step_pin: PD9
 | 
				
			||||||
 | 
					dir_pin: !PD8
 | 
				
			||||||
 | 
					enable_pin: !PD10
 | 
				
			||||||
 | 
					microsteps: 16
 | 
				
			||||||
 | 
					rotation_distance: 26.2564  # (200 * 16 * 48/18) / 325
 | 
				
			||||||
 | 
					gear_ratio: 48:18
 | 
				
			||||||
 | 
					nozzle_diameter: 0.400
 | 
				
			||||||
 | 
					filament_diameter: 1.750
 | 
				
			||||||
 | 
					heater_pin: PB1
 | 
				
			||||||
 | 
					sensor_type: ATC Semitec 104GT-2
 | 
				
			||||||
 | 
					sensor_pin: PC0
 | 
				
			||||||
 | 
					#control: pid
 | 
				
			||||||
 | 
					# Prusa's firmware defaults.
 | 
				
			||||||
 | 
					#pid_Kp: 7
 | 
				
			||||||
 | 
					#pid_Ki: 0.5
 | 
				
			||||||
 | 
					#pid_Kd: 45
 | 
				
			||||||
 | 
					min_temp: 10
 | 
				
			||||||
 | 
					max_temp: 305
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[tmc2209 stepper_x]
 | 
				
			||||||
 | 
					uart_pin: PD5
 | 
				
			||||||
 | 
					uart_address: 1
 | 
				
			||||||
 | 
					diag_pin: ^PE2
 | 
				
			||||||
 | 
					driver_SGTHRS: 130
 | 
				
			||||||
 | 
					run_current: 0.35
 | 
				
			||||||
 | 
					sense_resistor: 0.22
 | 
				
			||||||
 | 
					stealthchop_threshold: 999999
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[tmc2209 stepper_y]
 | 
				
			||||||
 | 
					uart_pin: PD5
 | 
				
			||||||
 | 
					uart_address: 3
 | 
				
			||||||
 | 
					diag_pin: ^PE1
 | 
				
			||||||
 | 
					driver_SGTHRS: 130
 | 
				
			||||||
 | 
					run_current: 0.35
 | 
				
			||||||
 | 
					sense_resistor: 0.22
 | 
				
			||||||
 | 
					stealthchop_threshold: 999999
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[tmc2209 stepper_z]
 | 
				
			||||||
 | 
					uart_pin: PD5
 | 
				
			||||||
 | 
					uart_address: 0
 | 
				
			||||||
 | 
					diag_pin: ^PE3
 | 
				
			||||||
 | 
					driver_SGTHRS: 100
 | 
				
			||||||
 | 
					run_current: 0.35
 | 
				
			||||||
 | 
					sense_resistor: 0.22
 | 
				
			||||||
 | 
					stealthchop_threshold: 999999
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[tmc2209 extruder]
 | 
				
			||||||
 | 
					uart_pin: PD5
 | 
				
			||||||
 | 
					uart_address: 2
 | 
				
			||||||
 | 
					diag_pin: ^PA15
 | 
				
			||||||
 | 
					driver_SGTHRS: 100
 | 
				
			||||||
 | 
					run_current: 0.4
 | 
				
			||||||
 | 
					sense_resistor: 0.22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[heater_bed]
 | 
				
			||||||
 | 
					heater_pin: PB0
 | 
				
			||||||
 | 
					sensor_type: EPCOS 100K B57560G104F
 | 
				
			||||||
 | 
					sensor_pin: PA4
 | 
				
			||||||
 | 
					#control: pid
 | 
				
			||||||
 | 
					# Prusa's firmware defaults.
 | 
				
			||||||
 | 
					#pid_Kp: 120
 | 
				
			||||||
 | 
					#pid_Ki: 1.5
 | 
				
			||||||
 | 
					#pid_Kd: 600
 | 
				
			||||||
 | 
					min_temp: 10
 | 
				
			||||||
 | 
					max_temp: 110
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Hotend fan.
 | 
				
			||||||
 | 
					# The stock firmware uses control ranges of PWM 0-50%, RPM 1000-8000.
 | 
				
			||||||
 | 
					# Change fan_speed below to match your preference. Measured speeds:
 | 
				
			||||||
 | 
					#   fan_speed 0.5:  50% PWM = 4000RPM (Prusa stock default speed)
 | 
				
			||||||
 | 
					#   fan_speed 1.0: 100% PWM = 8000RPM (safe but loud)
 | 
				
			||||||
 | 
					[heater_fan hotend_fan]
 | 
				
			||||||
 | 
					pin: PE9
 | 
				
			||||||
 | 
					tachometer_pin: PE14
 | 
				
			||||||
 | 
					fan_speed: 0.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Part cooling fan.
 | 
				
			||||||
 | 
					# The stock firmware uses control ranges of PWM 10-50%, RPM 500-5000.
 | 
				
			||||||
 | 
					# To match stock firmware, set the Klipper fan speed to 50%. This speed
 | 
				
			||||||
 | 
					# can be safely increased to 100% for better part cooling. Measured speeds:
 | 
				
			||||||
 | 
					#    50% PWM = 2500RPM (Prusa stock default speed)
 | 
				
			||||||
 | 
					#   100% PWM = 5000RPM (better cooling, still quiet)
 | 
				
			||||||
 | 
					[fan]
 | 
				
			||||||
 | 
					pin: PE11
 | 
				
			||||||
 | 
					tachometer_pin: PE10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The SuperPINDA has built-in temperature compensation and no thermistor output,
 | 
				
			||||||
 | 
					# so no compensation table is needed here.
 | 
				
			||||||
 | 
					[probe]
 | 
				
			||||||
 | 
					pin: PA8
 | 
				
			||||||
 | 
					x_offset: -29
 | 
				
			||||||
 | 
					y_offset: -3
 | 
				
			||||||
 | 
					#z_offset: 0  # set this to your Live Z Offset, but negated (invert the sign)
 | 
				
			||||||
 | 
					speed: 6.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[safe_z_home]
 | 
				
			||||||
 | 
					home_xy_position: 147.4,21.1
 | 
				
			||||||
 | 
					z_hop: 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[bed_mesh]
 | 
					[bed_mesh]
 | 
				
			||||||
speed: 500
 | 
					speed: 100
 | 
				
			||||||
horizontal_move_z: 10
 | 
					horizontal_move_z: 5
 | 
				
			||||||
# x, y   -->  x + probe.x_offset,  y + probe.y_offset
 | 
					mesh_min: 10,10
 | 
				
			||||||
mesh_min: 35, 35
 | 
					mesh_max: 141,167
 | 
				
			||||||
# x, y --> x + probe.x_offset, y + probe.y_offset
 | 
					probe_count: 4,4
 | 
				
			||||||
mesh_max: 265, 265
 | 
					 | 
				
			||||||
# fade_start: 1
 | 
					 | 
				
			||||||
# fade_end: 10
 | 
					 | 
				
			||||||
# fade_target: 0
 | 
					 | 
				
			||||||
algorithm: bicubic
 | 
					 | 
				
			||||||
# relative_reference_index = ((x points * y points) - 1) / 2
 | 
					 | 
				
			||||||
# 3x3: 4, 5x5: 12, 7x7: 24, 9x9: 40
 | 
					 | 
				
			||||||
# probe_count: 3,3
 | 
					 | 
				
			||||||
# relative_reference_index: 4
 | 
					 | 
				
			||||||
# probe_count: 5,5
 | 
					 | 
				
			||||||
# relative_reference_index: 12
 | 
					 | 
				
			||||||
# probe_count: 7,7
 | 
					 | 
				
			||||||
# relative_reference_index: 24
 | 
					 | 
				
			||||||
probe_count: 9,9
 | 
					 | 
				
			||||||
# relative_reference_index: 40
 | 
					 | 
				
			||||||
zero_reference_position: 145.00, 145.00
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[quad_gantry_level]
 | 
					[filament_switch_sensor filament_sensor]
 | 
				
			||||||
speed: 500
 | 
					switch_pin: ^PB4
 | 
				
			||||||
horizontal_move_z: 10
 | 
					pause_on_runout: True
 | 
				
			||||||
gantry_corners:
 | 
					
 | 
				
			||||||
  -60,-10
 | 
					[mcu]
 | 
				
			||||||
  360,370
 | 
					serial: /dev/serial/by-id/usb-Klipper_stm32f407xx_2B0024001547393432343038-if00
 | 
				
			||||||
points:
 | 
					restart_method: command
 | 
				
			||||||
  40,40
 | 
					
 | 
				
			||||||
  40,260
 | 
					[printer]
 | 
				
			||||||
  260,260
 | 
					kinematics: cartesian
 | 
				
			||||||
  260,40
 | 
					# Prusa firmware defaults.
 | 
				
			||||||
retries: 5
 | 
					max_velocity: 180
 | 
				
			||||||
retry_tolerance: 0.0075
 | 
					max_accel: 1250
 | 
				
			||||||
max_adjust: 10
 | 
					max_z_velocity: 12
 | 
				
			||||||
 | 
					max_z_accel: 400
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[display]
 | 
				
			||||||
 | 
					lcd_type: st7789v
 | 
				
			||||||
 | 
					spi_bus: spi2a
 | 
				
			||||||
 | 
					rst_pin: PC8
 | 
				
			||||||
 | 
					cs_pin: PC9
 | 
				
			||||||
 | 
					rs_pin: PD11
 | 
				
			||||||
 | 
					encoder_pins: ^PE13, ^PE15
 | 
				
			||||||
 | 
					click_pin: ^!PE12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#*# <---------------------- SAVE_CONFIG ---------------------->
 | 
					#*# <---------------------- SAVE_CONFIG ---------------------->
 | 
				
			||||||
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
 | 
					#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
 | 
				
			||||||
#*#
 | 
					#*#
 | 
				
			||||||
 | 
					#*# [extruder]
 | 
				
			||||||
 | 
					#*# control = pid
 | 
				
			||||||
 | 
					#*# pid_kp = 21.307
 | 
				
			||||||
 | 
					#*# pid_ki = 0.911
 | 
				
			||||||
 | 
					#*# pid_kd = 124.644
 | 
				
			||||||
 | 
					#*#
 | 
				
			||||||
#*# [heater_bed]
 | 
					#*# [heater_bed]
 | 
				
			||||||
#*# control = pid
 | 
					#*# control = pid
 | 
				
			||||||
#*# pid_kp = 37.870
 | 
					#*# pid_kp = 57.528
 | 
				
			||||||
#*# pid_ki = 1.244
 | 
					#*# pid_ki = 1.059
 | 
				
			||||||
#*# pid_kd = 288.283
 | 
					#*# pid_kd = 780.942
 | 
				
			||||||
#*#
 | 
					 | 
				
			||||||
#*# [extruder]
 | 
					 | 
				
			||||||
#*#
 | 
					#*#
 | 
				
			||||||
#*# [probe]
 | 
					#*# [probe]
 | 
				
			||||||
#*# z_offset = -0.880
 | 
					#*# z_offset = 1.480
 | 
				
			||||||
#*#
 | 
					 | 
				
			||||||
#*# [input_shaper]
 | 
					 | 
				
			||||||
#*# shaper_type_x = 3hump_ei
 | 
					 | 
				
			||||||
#*# shaper_freq_x = 89.2
 | 
					 | 
				
			||||||
#*# shaper_type_y = mzv
 | 
					 | 
				
			||||||
#*# shaper_freq_y = 30.6
 | 
					 | 
				
			||||||
#*#
 | 
					#*#
 | 
				
			||||||
#*# [bed_mesh default]
 | 
					#*# [bed_mesh default]
 | 
				
			||||||
#*# version = 1
 | 
					#*# version = 1
 | 
				
			||||||
#*# points =
 | 
					#*# points =
 | 
				
			||||||
#*# 	  -0.000973, 0.016527, 0.007777, 0.001527, 0.016527, -0.005973, 0.014027, 0.015277, 0.007777
 | 
					#*#       -0.058750, -0.003750, 0.102500, 0.057500
 | 
				
			||||||
#*# 	  -0.003473, 0.012777, 0.009027, -0.005973, 0.011527, 0.000277, 0.021527, 0.002777, 0.012777
 | 
					#*#       -0.086250, -0.037500, -0.027500, 0.007500
 | 
				
			||||||
#*# 	  0.004027, 0.007777, 0.012777, 0.020277, 0.024027, 0.024027, 0.020277, 0.017777, 0.014027
 | 
					#*#       -0.022500, -0.057500, -0.070000, -0.011250
 | 
				
			||||||
#*# 	  -0.005973, -0.008473, -0.002223, -0.003473, 0.019027, -0.003473, -0.003473, -0.002223, -0.003473
 | 
					#*#       -0.066250, -0.102500, -0.045000, -0.071250
 | 
				
			||||||
#*# 	  -0.000973, -0.007223, -0.004723, 0.011527, -0.004723, -0.000973, 0.022777, 0.009027, -0.005973
 | 
					 | 
				
			||||||
#*# 	  0.001527, 0.015277, 0.036527, 0.015277, 0.014027, 0.012777, 0.021527, 0.016527, 0.019027
 | 
					 | 
				
			||||||
#*# 	  -0.010973, 0.012777, -0.005973, -0.000973, 0.000277, -0.007223, 0.000277, -0.002223, -0.012223
 | 
					 | 
				
			||||||
#*# 	  -0.007223, 0.005277, 0.006527, 0.015277, 0.011527, 0.024027, 0.011527, -0.012223, 0.001527
 | 
					 | 
				
			||||||
#*# 	  -0.003473, -0.003473, 0.009027, -0.008473, 0.009027, 0.007777, 0.009027, -0.007223, -0.009723
 | 
					 | 
				
			||||||
#*# x_count = 9
 | 
					 | 
				
			||||||
#*# y_count = 9
 | 
					 | 
				
			||||||
#*# mesh_x_pps = 2
 | 
					 | 
				
			||||||
#*# mesh_y_pps = 2
 | 
					 | 
				
			||||||
#*# algo = bicubic
 | 
					 | 
				
			||||||
#*# tension = 0.2
 | 
					#*# tension = 0.2
 | 
				
			||||||
#*# min_x = 35.0
 | 
					#*# min_x = 10.0
 | 
				
			||||||
#*# max_x = 265.0
 | 
					#*# algo = lagrange
 | 
				
			||||||
#*# min_y = 35.0
 | 
					#*# y_count = 4
 | 
				
			||||||
#*# max_y = 265.0
 | 
					#*# mesh_y_pps = 2
 | 
				
			||||||
 | 
					#*# min_y = 10.0
 | 
				
			||||||
 | 
					#*# x_count = 4
 | 
				
			||||||
 | 
					#*# max_y = 166.99
 | 
				
			||||||
 | 
					#*# mesh_x_pps = 2
 | 
				
			||||||
 | 
					#*# max_x = 140.98
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,20 +0,0 @@
 | 
				
			||||||
## EBB36
 | 
					 | 
				
			||||||
[adxl345]
 | 
					 | 
				
			||||||
cs_pin: EBBCan:PB12
 | 
					 | 
				
			||||||
spi_software_sclk_pin: EBBCan:PB10
 | 
					 | 
				
			||||||
spi_software_mosi_pin: EBBCan:PB11
 | 
					 | 
				
			||||||
spi_software_miso_pin: EBBCan:PB2
 | 
					 | 
				
			||||||
axes_map: x,y,z
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[resonance_tester]
 | 
					 | 
				
			||||||
accel_chip: adxl345
 | 
					 | 
				
			||||||
probe_points:
 | 
					 | 
				
			||||||
    150,150,20  # an example
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[gcode_macro TR]
 | 
					 | 
				
			||||||
gcode:
 | 
					 | 
				
			||||||
  {% if not "xyz" in printer.toolhead.homed_axes %}
 | 
					 | 
				
			||||||
    G28
 | 
					 | 
				
			||||||
  {% endif %}
 | 
					 | 
				
			||||||
  TEST_RESONANCES AXIS=X
 | 
					 | 
				
			||||||
  TEST_RESONANCES AXIS=Y
 | 
					 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue