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
View file

@ -1,2 +0,0 @@
*.bkp
*.swp

View file

@ -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
#~#

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 %}

View file

@ -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

View file

@ -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

View file

@ -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]

View file

@ -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
#####################################################################

View file

@ -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}

View file

@ -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

View file

@ -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 %}

View file

@ -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 %}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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