This commit is contained in:
Sz77
2024-07-26 15:31:31 +00:00
committed by GitHub
12 changed files with 1245 additions and 51 deletions

View File

@@ -0,0 +1,92 @@
################################################################################
# Board: SKR Mini E3 v3.0
# Printer: Flying Bear Ghost 5
# Config by Sz77
# special thanks to ODUCCEU for the base config
################################################################################
# WARNING! DO NOT EDIT THIS FILE!
# To override settings from this file, you can copy and paste the relevant
# sections into your printer.cfg and change it there.
################################################################################
# Documentation
# https://www.klipper3d.org/Config_Reference.html
################################################################################
# Pin Aliases
################################################################################
[board_pins mks_rn_13]
aliases:
## Steppers ####################################################################
X_STEP_PIN=PB13, X_DIR_PIN=PB12, X_ENABLE_PIN=PB14, X_STOP_PIN=PC0,
Y_STEP_PIN=PB10, Y_DIR_PIN=PB2, Y_ENABLE_PIN=PB11, Y_STOP_PIN=PC1,
Z_STEP_PIN=PB0, Z_DIR_PIN=PC5, Z_ENABLE_PIN=PB1, Z_STOP_PIN=PC2,
E0_STEP_PIN=PB3, E0_DIR_PIN=PB4, E0_ENABLE_PIN=PD1,
## Heaters #####################################################################
E_HEATER_PIN=PC8, E_SENSOR_PIN=PA0,
BED_HEATER_PIN=PC9, BED_SENSOR_PIN=PC4,
## Fans ########################################################################
HEATER_FAN_PIN=PC7,
PARTCOOLING_FAN_PIN=PC6,
FUN2_FAN_PIN=PB15,
## Controls ####################################################################
EXP1_1=PB5, EXP1_3=PA9, EXP1_5=PA10, EXP1_7=PB8, EXP1_9=<GND>,
EXP1_2=PA15, EXP1_4=<RST>, EXP1_6=PB9, EXP1_8=PD6, EXP1_10=<5V>,
## BLTouch #####################################################################
BLTOUCH_SENSOR_PIN=PC2, # MT_DET2
BLTOUCH_CONTROL_PIN=PA1, # SERVO
## TMC2209 UART ################################################################
TMC_UART_PIN=PC11, TMC_TX_PIN=PC10,
################################################################################
# MCU
################################################################################
[mcu]
serial: /dev/serial/by-id/usb-Klipper_stm32g0b1xx_570032000C50415833323420-if00
restart_method: command
################################################################################
# Sensors
################################################################################
[temperature_sensor board]
sensor_type: temperature_mcu
min_temp: 0
max_temp: 120
[temperature_sensor raspberry_pi]
sensor_type: temperature_host
min_temp: 0
max_temp: 100
[filament_switch_sensor filament_sensor]
event_delay: 3.0
pause_delay: 0.5
switch_pin: PC15
pause_on_runout: True
runout_gcode:
PARK_MACRO
M117 Out of Filament
insert_gcode:
M117 Resuming
RESUME_MACRO
################################################################################
# Beeper
################################################################################
[output_pin _BEEPER_pin]
pin: PB5
pwm: True
value: 0
shutdown_value: 0
cycle_time: 0.001
################################################################################

View File

@@ -0,0 +1,42 @@
#### 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] #####
#### #####
#####################################################################
#### RTSP Stream URL: ( if enabled and supported ) #####
#### rtsp://<ip>:<rtsp_port>/stream.h264 #####
#####################################################################
[crowsnest]
log_path: /home/pi/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
[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.

View File

@@ -0,0 +1,113 @@
################################################################################
# Board: MKS Robin Nano v1.1 (Flying Bear Reborn 2.0) / MKS Robin Nano v1.3 / MKS Robin Nano-S v1.3
# Printer: Flying Bear Ghost 5
# Config by ODUCCEU
################################################################################
# Documentation
# https://www.klipper3d.org/Config_Reference.html
# Rename this file to 'printer.cfg'.
# Enable proper 'Control board' in 'Included configs' section.
# It is recommended that you follow these steps to properly calibrate your printer:
# 1) Sanity check and PID Tuning: https://www.klipper3d.org/Config_checks.html
# 2) Skew Correction: https://www.klipper3d.org/skew_correction.html
# 3) Resonance Compensation: https://www.klipper3d.org/Resonance_Compensation.html
# 4) Pressure Advance: https://www.klipper3d.org/Pressure_Advance.html
################################################################################
# Included configs
################################################################################
# Duplicate parameters in included config files will override each other.
# In this case, each next included file overwrites the previous one in the list.
# 'printer.cfg' takes precedence over other included files.
# Try to avoid changing the default files by adding or changing parameters in 'printer.cfg' below.
# This does not apply to commented out parameters.
## Control board ###############################################################
# THERE CAN BE ONLY ONE!
[include board/BIGTREETECH-SKR-mini-E3.cfg] # MKS Robin Nano v1.1 https://github.com/oducceu/klipper_configs/blob/master/images/mks-rn-11.jpg
# [include board/mks-rn-13.cfg] # MKS Robin Nano v1.3 https://github.com/oducceu/klipper_configs/blob/master/images/mks-rn-13.png
# [include board/mks-rn-s-13.cfg] # MKS Robin Nano-S v1.3 https://github.com/oducceu/klipper_configs/blob/master/images/mks-rn-s-13.png
# [include board/mks-rn-s-13-E-on-5.cfg] # MKS Robin Nano-S v1.3 with extruder plugged to E1 https://github.com/oducceu/klipper_configs/blob/master/images/mks-rn-s-13-E-on-5.png
## Base configuration ##########################################################
[include printer/fb-ghost5.cfg]
## Drivers #####################################################################
# [include printer/tmc2225.cfg]
[include printer/tmc2209_uart_mks_rn.cfg] # enable if using TMC drivers via UART on MKS Robin Nano
## Base macros #################################################################
[include macros/macros.cfg]
## Additional hardware #########################################################
[include printer/fb-ghost5-bltouch.cfg] # disable 'position_endstop' in [stepper_z] section
# [include printer/rpi_mcu.cfg] # enable ONLY after setting Pi as MCU https://www.klipper3d.org/RPi_microcontroller.html
# [include printer/accelerometer.cfg] # requires "rpi.cfg"
[include mainsail.cfg]
################################################################################
# X, Y, Z
################################################################################
[stepper_x]
homing_speed: 150
[stepper_y]
homing_speed: 150
[stepper_z]
#position_endstop: 0.5 # disable if using BLTouch to use 'probe:z_virtual_endstop'
################################################################################
# E0, HB
################################################################################
[extruder]
rotation_distance: 7.600 # CAUTION! Calibrate using https://www.klipper3d.org/Rotation_Distance.html
nozzle_diameter: 0.400
pressure_advance: 0.000 # CAUTION! Calibrate using https://www.klipper3d.org/Pressure_Advance.html
control: pid # CAUTION! Calibrate using PID_CALIBRATE https://www.klipper3d.org/G-Codes.html#extended-g-code-commands
pid_Kp: 30.891
pid_Ki: 2.542
pid_Kd: 93.830
# min_extrude_temp: 0 # allow Cold Extrusion for extruder steps calibration
[heater_bed]
control: pid # CAUTION! Calibrate using PID_CALIBRATE https://www.klipper3d.org/G-Codes.html#extended-g-code-commands
pid_Kp: 63.104
pid_Ki: 2.350
pid_Kd: 423.586
################################################################################
# Printer
################################################################################
[mcu]
# serial: /dev/ttyAMA0 # enable if connected via UART1 on Pi3/PiZ
# serial: /dev/ttyAMA1 # enable if connected via UART5 on Pi4
[printer]
max_velocity: 300
max_accel: 3000
#max_accel_to_decel: 2000
################################################################################
# Bed leveling
################################################################################
[bed_screws]
screw5: 127.5,105
screw5_name: center virtual screw
################################################################################
# Resonance compensation
################################################################################
[input_shaper]
################################################################################

View File

@@ -0,0 +1,294 @@
## Client klipper macro definitions
##
## Copyright (C) 2022 Alex Zellner <alexander.zellner@googlemail.com>
##
## This file may be distributed under the terms of the GNU GPLv3 license
##
## !!! This file is read-only. Maybe the used editor indicates that. !!!
##
## Customization:
## 1) copy the gcode_macro _CLIENT_VARIABLE (see below) to your printer.cfg
## 2) remove the comment mark (#) from all lines
## 3) change any value in there to your needs
##
## Use the PAUSE macro direct in your M600:
## e.g. with a different park position front left and a minimal height of 50
## [gcode_macro M600]
## description: Filament change
## gcode: PAUSE X=10 Y=10 Z_MIN=50
## Z_MIN will park the toolhead at a minimum of 50 mm above to bed to make it easier for you to swap filament.
##
## Client variable macro for your printer.cfg
#[gcode_macro _CLIENT_VARIABLE]
#variable_use_custom_pos : False ; use custom park coordinates for x,y [True/False]
#variable_custom_park_x : 0.0 ; custom x position; value must be within your defined min and max of X
#variable_custom_park_y : 0.0 ; custom y position; value must be within your defined min and max of Y
#variable_custom_park_dz : 2.0 ; custom dz value; the value in mm to lift the nozzle when move to park position
#variable_retract : 1.0 ; the value to retract while PAUSE
#variable_cancel_retract : 5.0 ; the value to retract while CANCEL_PRINT
#variable_speed_retract : 35.0 ; retract speed in mm/s
#variable_unretract : 1.0 ; the value to unretract while RESUME
#variable_speed_unretract : 35.0 ; unretract speed in mm/s
#variable_speed_hop : 15.0 ; z move speed in mm/s
#variable_speed_move : 100.0 ; move speed in mm/s
#variable_park_at_cancel : False ; allow to move the toolhead to park while execute CANCEL_PRINT [True/False]
#variable_park_at_cancel_x : None ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True
#variable_park_at_cancel_y : None ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True
## !!! Caution [firmware_retraction] must be defined in the printer.cfg if you set use_fw_retract: True !!!
#variable_use_fw_retract : False ; use fw_retraction instead of the manual version [True/False]
#variable_idle_timeout : 0 ; time in sec until idle_timeout kicks in. Value 0 means that no value will be set or restored
#variable_runout_sensor : "" ; If a sensor is defined, it will be used to cancel the execution of RESUME in case no filament is detected.
## Specify the config name of the runout sensor e.g "filament_switch_sensor runout". Hint use the same as in your printer.cfg
## !!! Custom macros, please use with care and review the section of the corresponding macro.
## These macros are for simple operations like setting a status LED. Please make sure your macro does not interfere with the basic macro functions.
## Only single line commands are supported, please create a macro if you need more than one command.
#variable_user_pause_macro : "" ; Everything inside the "" will be executed after the klipper base pause (PAUSE_BASE) function
#variable_user_resume_macro: "" ; Everything inside the "" will be executed before the klipper base resume (RESUME_BASE) function
#variable_user_cancel_macro: "" ; Everything inside the "" will be executed before the klipper base cancel (CANCEL_PRINT_BASE) function
#gcode:
[virtual_sdcard]
path: ~/printer_data/gcodes
on_error_gcode: CANCEL_PRINT
[pause_resume]
#recover_velocity: 50.
# When capture/restore is enabled, the speed at which to return to
# the captured position (in mm/s). Default is 50.0 mm/s.
[display_status]
[respond]
[gcode_macro CANCEL_PRINT]
description: Cancel the actual running print
rename_existing: CANCEL_PRINT_BASE
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set allow_park = client.park_at_cancel|default(false)|lower == 'true' %}
{% set retract = client.cancel_retract|default(5.0)|abs %}
##### define park position #####
{% set park_x = "" if (client.park_at_cancel_x|default(none) is none)
else "X=" ~ client.park_at_cancel_x %}
{% set park_y = "" if (client.park_at_cancel_y|default(none) is none)
else "Y=" ~ client.park_at_cancel_y %}
{% set custom_park = park_x|length > 0 or park_y|length > 0 %}
##### end of definitions #####
# restore idle_timeout time if needed
{% if printer['gcode_macro RESUME'].restore_idle_timeout > 0 %}
SET_IDLE_TIMEOUT TIMEOUT={printer['gcode_macro RESUME'].restore_idle_timeout}
{% endif %}
{% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %}
_CLIENT_RETRACT LENGTH={retract}
TURN_OFF_HEATERS
M106 S0
{client.user_cancel_macro|default("")}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False
# clear pause_next_layer and pause_at_layer as preparation for next print
SET_PAUSE_NEXT_LAYER ENABLE=0
SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0
CANCEL_PRINT_BASE
[gcode_macro PAUSE]
description: Pause the actual running print
rename_existing: PAUSE_BASE
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set idle_timeout = client.idle_timeout|default(0) %}
{% set temp = printer[printer.toolhead.extruder].target if printer.toolhead.extruder != '' else 0 %}
{% set restore = False if printer.toolhead.extruder == ''
else True if params.RESTORE|default(1)|int == 1 else False %}
##### end of definitions #####
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{{'restore': restore, 'temp': temp}}"
# set a new idle_timeout value
{% if idle_timeout > 0 %}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=restore_idle_timeout VALUE={printer.configfile.settings.idle_timeout.timeout}
SET_IDLE_TIMEOUT TIMEOUT={idle_timeout}
{% endif %}
PAUSE_BASE
{client.user_pause_macro|default("")}
_TOOLHEAD_PARK_PAUSE_CANCEL {rawparams}
[gcode_macro RESUME]
description: Resume the actual running print
rename_existing: RESUME_BASE
variable_last_extruder_temp: {'restore': False, 'temp': 0}
variable_restore_idle_timeout: 0
variable_idle_state: False
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set velocity = printer.configfile.settings.pause_resume.recover_velocity %}
{% set sp_move = client.speed_move|default(velocity) %}
{% set runout_resume = True if client.runout_sensor|default("") == "" # no runout
else True if not printer[client.runout_sensor].enabled # sensor is disabled
else printer[client.runout_sensor].filament_detected %} # sensor status
{% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config
else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder
{% set do_resume = False %}
{% set prompt_txt = [] %}
##### end of definitions #####
#### Printer comming from timeout idle state ####
{% if printer.idle_timeout.state|upper == "IDLE" or idle_state %}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False
{% if last_extruder_temp.restore %}
# we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise
RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }'
M109 S{last_extruder_temp.temp}
{% set do_resume = True %}
{% elif can_extrude %}
{% set do_resume = True %}
{% else %}
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}'
{% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %}
{% endif %}
#### Printer comming out of regular PAUSE state ####
{% elif can_extrude %}
{% set do_resume = True %}
{% else %}
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}'
{% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %}
{% endif %}
{% if runout_resume %}
{% if do_resume %}
{% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time
{client.user_resume_macro|default("")}
_CLIENT_EXTRUDE
RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)}
{% endif %}
{% else %}
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]}'
{% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]) %}
{% endif %}
##### Generate User Information box in case of abort #####
{% if not (runout_resume and do_resume) %}
RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!"
{% for element in prompt_txt %}
RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}'
{% endfor %}
RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info"
RESPOND TYPE=command MSG="action:prompt_show"
{% endif %}
# Usage: SET_PAUSE_NEXT_LAYER [ENABLE=[0|1]] [MACRO=<name>]
[gcode_macro SET_PAUSE_NEXT_LAYER]
description: Enable a pause if the next layer is reached
gcode:
{% set pause_next_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_next_layer %}
{% set ENABLE = params.ENABLE|default(1)|int != 0 %}
{% set MACRO = params.MACRO|default(pause_next_layer.call, True) %}
SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_next_layer VALUE="{{ 'enable': ENABLE, 'call': MACRO }}"
# Usage: SET_PAUSE_AT_LAYER [ENABLE=[0|1]] [LAYER=<number>] [MACRO=<name>]
[gcode_macro SET_PAUSE_AT_LAYER]
description: Enable/disable a pause if a given layer number is reached
gcode:
{% set pause_at_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_at_layer %}
{% set ENABLE = params.ENABLE|int != 0 if params.ENABLE is defined
else params.LAYER is defined %}
{% set LAYER = params.LAYER|default(pause_at_layer.layer)|int %}
{% set MACRO = params.MACRO|default(pause_at_layer.call, True) %}
SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_at_layer VALUE="{{ 'enable': ENABLE, 'layer': LAYER, 'call': MACRO }}"
# Usage: SET_PRINT_STATS_INFO [TOTAL_LAYER=<total_layer_count>] [CURRENT_LAYER= <current_layer>]
[gcode_macro SET_PRINT_STATS_INFO]
rename_existing: SET_PRINT_STATS_INFO_BASE
description: Overwrite, to get pause_next_layer and pause_at_layer feature
variable_pause_next_layer: { 'enable': False, 'call': "PAUSE" }
variable_pause_at_layer : { 'enable': False, 'layer': 0, 'call': "PAUSE" }
gcode:
{% if pause_next_layer.enable %}
RESPOND TYPE=echo MSG='{"%s, forced by pause_next_layer" % pause_next_layer.call}'
{pause_next_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE
SET_PAUSE_NEXT_LAYER ENABLE=0
{% elif pause_at_layer.enable and params.CURRENT_LAYER is defined and params.CURRENT_LAYER|int == pause_at_layer.layer %}
RESPOND TYPE=echo MSG='{"%s, forced by pause_at_layer [%d]" % (pause_at_layer.call, pause_at_layer.layer)}'
{pause_at_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE
SET_PAUSE_AT_LAYER ENABLE=0
{% endif %}
SET_PRINT_STATS_INFO_BASE {rawparams}
##### internal use #####
[gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL]
description: Helper: park toolhead used in PAUSE and CANCEL_PRINT
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set velocity = printer.configfile.settings.pause_resume.recover_velocity %}
{% set use_custom = client.use_custom_pos|default(false)|lower == 'true' %}
{% set custom_park_x = client.custom_park_x|default(0.0) %}
{% set custom_park_y = client.custom_park_y|default(0.0) %}
{% set park_dz = client.custom_park_dz|default(2.0)|abs %}
{% set sp_hop = client.speed_hop|default(15) * 60 %}
{% set sp_move = client.speed_move|default(velocity) * 60 %}
##### get config and toolhead values #####
{% set origin = printer.gcode_move.homing_origin %}
{% set act = printer.gcode_move.gcode_position %}
{% set max = printer.toolhead.axis_maximum %}
{% set cone = printer.toolhead.cone_start_z|default(max.z) %} ; height as long the toolhead can reach max and min of an delta
{% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch']
else False %}
##### define park position #####
{% set z_min = params.Z_MIN|default(0)|float %}
{% set z_park = [[(act.z + park_dz), z_min]|max, (max.z - origin.z)]|min %}
{% set x_park = params.X if params.X is defined
else custom_park_x if use_custom
else 0.0 if round_bed
else (max.x - 5.0) %}
{% set y_park = params.Y if params.Y is defined
else custom_park_y if use_custom
else (max.y - 5.0) if round_bed and z_park < cone
else 0.0 if round_bed
else (max.y - 5.0) %}
##### end of definitions #####
_CLIENT_RETRACT
{% if "xyz" in printer.toolhead.homed_axes %}
G90
G1 Z{z_park} F{sp_hop}
G1 X{x_park} Y{y_park} F{sp_move}
{% if not printer.gcode_move.absolute_coordinates %} G91 {% endif %}
{% else %}
RESPOND TYPE=echo MSG='Printer not homed'
{% endif %}
[gcode_macro _CLIENT_EXTRUDE]
description: Extrudes, if the extruder is hot enough
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set use_fw_retract = (client.use_fw_retract|default(false)|lower == 'true') and (printer.firmware_retraction is defined) %}
{% set length = params.LENGTH|default(client.unretract)|default(1.0)|float %}
{% set speed = params.SPEED|default(client.speed_unretract)|default(35) %}
{% set absolute_extrude = printer.gcode_move.absolute_extrude %}
##### end of definitions #####
{% if printer.toolhead.extruder != '' %}
{% if printer[printer.toolhead.extruder].can_extrude %}
{% if use_fw_retract %}
{% if length < 0 %}
G10
{% else %}
G11
{% endif %}
{% else %}
M83
G1 E{length} F{(speed|float|abs) * 60}
{% if absolute_extrude %}
M82
{% endif %}
{% endif %}
{% else %}
RESPOND TYPE=echo MSG='{"\"%s\" not hot enough" % printer.toolhead.extruder}'
{% endif %}
{% endif %}
[gcode_macro _CLIENT_RETRACT]
description: Retracts, if the extruder is hot enough
gcode:
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set length = params.LENGTH|default(client.retract)|default(1.0)|float %}
{% set speed = params.SPEED|default(client.speed_retract)|default(35) %}
_CLIENT_EXTRUDE LENGTH=-{length|float|abs} SPEED={speed|float|abs}

View File

@@ -0,0 +1,90 @@
[server]
host: 0.0.0.0
port: 7125
# The maximum size allowed for a file upload (in MiB). Default 1024 MiB
max_upload_size: 1024
# Path to klippy Unix Domain Socket
klippy_uds_address: ~/printer_data/comms/klippy.sock
[file_manager]
# post processing for object cancel. Not recommended for low resource SBCs such as a Pi Zero. Default False
enable_object_processing: False
[authorization]
cors_domains:
https://my.mainsail.xyz
http://my.mainsail.xyz
http://*.local
http://*.lan
trusted_clients:
10.0.0.0/8
127.0.0.0/8
169.254.0.0/16
172.16.0.0/12
192.168.0.0/16
FE80::/10
::1/128
# enables partial support of Octoprint API
[octoprint_compat]
# enables moonraker to track and store print history.
[history]
# this enables moonraker announcements for mainsail
[announcements]
subscriptions:
mainsail
# this enables moonraker's update manager
[update_manager]
refresh_interval: 168
enable_auto_refresh: True
[update_manager mainsail]
type: web
channel: stable
repo: mainsail-crew/mainsail
path: ~/mainsail
[update_manager mainsail-config]
type: git_repo
primary_branch: master
path: ~/mainsail-config
origin: https://github.com/mainsail-crew/mainsail-config.git
managed_services: klipper
### moonraker-timelapse
### Don't forget to include timelapse.cfg to your printer.cfg
### Uncomment to enable moonraker-timelapse
#[update_manager timelapse]
#type: git_repo
#primary_branch: main
#path: ~/moonraker-timelapse
#origin: https://github.com/mainsail-crew/moonraker-timelapse.git
#managed_services: klipper moonraker
#[timelapse]
### Directory where the generated video will be saved
#output_path: ~/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
managed_services: crowsnest
install_script: tools/pkglist.sh
# Sonar update_manager entry
[update_manager sonar]
type: git_repo
path: ~/sonar
origin: https://github.com/mainsail-crew/sonar.git
primary_branch: main
managed_services: sonar
install_script: tools/install.sh

View File

@@ -0,0 +1,113 @@
################################################################################
# Board: MKS Robin Nano v1.1 (Flying Bear Reborn 2.0) / MKS Robin Nano v1.3 / MKS Robin Nano-S v1.3
# Printer: Flying Bear Ghost 5
# Config by ODUCCEU
################################################################################
# Documentation
# https://www.klipper3d.org/Config_Reference.html
# Rename this file to 'printer.cfg'.
# Enable proper 'Control board' in 'Included configs' section.
# It is recommended that you follow these steps to properly calibrate your printer:
# 1) Sanity check and PID Tuning: https://www.klipper3d.org/Config_checks.html
# 2) Skew Correction: https://www.klipper3d.org/skew_correction.html
# 3) Resonance Compensation: https://www.klipper3d.org/Resonance_Compensation.html
# 4) Pressure Advance: https://www.klipper3d.org/Pressure_Advance.html
################################################################################
# Included configs
################################################################################
# Duplicate parameters in included config files will override each other.
# In this case, each next included file overwrites the previous one in the list.
# 'printer.cfg' takes precedence over other included files.
# Try to avoid changing the default files by adding or changing parameters in 'printer.cfg' below.
# This does not apply to commented out parameters.
## Control board ###############################################################
# THERE CAN BE ONLY ONE!
[include board/BIGTREETECH-SKR-mini-E3.cfg] # MKS Robin Nano v1.1 https://github.com/oducceu/klipper_configs/blob/master/images/mks-rn-11.jpg
# [include board/mks-rn-13.cfg] # MKS Robin Nano v1.3 https://github.com/oducceu/klipper_configs/blob/master/images/mks-rn-13.png
# [include board/mks-rn-s-13.cfg] # MKS Robin Nano-S v1.3 https://github.com/oducceu/klipper_configs/blob/master/images/mks-rn-s-13.png
# [include board/mks-rn-s-13-E-on-5.cfg] # MKS Robin Nano-S v1.3 with extruder plugged to E1 https://github.com/oducceu/klipper_configs/blob/master/images/mks-rn-s-13-E-on-5.png
## Base configuration ##########################################################
[include printer/fb-ghost5.cfg]
## Drivers #####################################################################
# [include printer/tmc2225.cfg]
[include printer/tmc2209_uart_mks_rn.cfg] # enable if using TMC drivers via UART on MKS Robin Nano
## Base macros #################################################################
[include macros/macros.cfg]
## Additional hardware #########################################################
[include printer/fb-ghost5-bltouch.cfg] # disable 'position_endstop' in [stepper_z] section
# [include printer/rpi_mcu.cfg] # enable ONLY after setting Pi as MCU https://www.klipper3d.org/RPi_microcontroller.html
# [include printer/accelerometer.cfg] # requires "rpi.cfg"
[include mainsail.cfg]
################################################################################
# X, Y, Z
################################################################################
[stepper_x]
homing_speed: 150
[stepper_y]
homing_speed: 150
[stepper_z]
#position_endstop: 0.5 # disable if using BLTouch to use 'probe:z_virtual_endstop'
################################################################################
# E0, HB
################################################################################
[extruder]
rotation_distance: 7.600 # CAUTION! Calibrate using https://www.klipper3d.org/Rotation_Distance.html
nozzle_diameter: 0.400
pressure_advance: 0.000 # CAUTION! Calibrate using https://www.klipper3d.org/Pressure_Advance.html
control: pid # CAUTION! Calibrate using PID_CALIBRATE https://www.klipper3d.org/G-Codes.html#extended-g-code-commands
pid_Kp: 30.891
pid_Ki: 2.542
pid_Kd: 93.830
# min_extrude_temp: 0 # allow Cold Extrusion for extruder steps calibration
[heater_bed]
control: pid # CAUTION! Calibrate using PID_CALIBRATE https://www.klipper3d.org/G-Codes.html#extended-g-code-commands
pid_Kp: 63.104
pid_Ki: 2.350
pid_Kd: 423.586
################################################################################
# Printer
################################################################################
[mcu]
# serial: /dev/ttyAMA0 # enable if connected via UART1 on Pi3/PiZ
# serial: /dev/ttyAMA1 # enable if connected via UART5 on Pi4
[printer]
max_velocity: 300
max_accel: 3000
#max_accel_to_decel: 2000
################################################################################
# Bed leveling
################################################################################
[bed_screws]
screw5: 127.5,105
screw5_name: center virtual screw
################################################################################
# Resonance compensation
################################################################################
[input_shaper]
################################################################################

View File

@@ -1,7 +1,8 @@
################################################################################
# Board: MKS Robin Nano v1.1 (Flying Bear Reborn 2.0) / MKS Robin Nano v1.3 / MKS Robin Nano-S v1.3
# Board: SKR Mini E3 v3.0
# Printer: Flying Bear Ghost 5
# Config by ODUCCEU
# Config by Sz77
# special thanks to ODUCCEU for the base config
################################################################################
# WARNING! DO NOT EDIT THIS FILE!
# To override settings from this file, you can copy and paste the relevant
@@ -20,19 +21,6 @@
# Pin Definitions
################################################################################
# You have different choices on how to plug your probe on MKS Robin Nano:
#
# Sensor can be plugged into one of the list:
## Z_MIN_STOP PA11
## Z_MAX_STOP PC4
## MT_DET2 PE6
## WiFi_IO0 P13 MKSRNv1.3
## WiFi_IO0 PA8 MKSRNv1.1
#
# Servo control can be plugged into one of the list:
## SERVO PA8 'BLTOUCH' slot on MKSRNv1.3
## PB2 PB2
#
# You can check default 'BLTOUCH_SENSOR_PIN' and 'BLTOUCH_CONTROL_PIN' in your board cfg file
################################################################################
@@ -43,8 +31,8 @@
sensor_pin: ^BLTOUCH_SENSOR_PIN
control_pin: BLTOUCH_CONTROL_PIN
# stow_on_each_sample: False # faster but dangerous
x_offset: 0 # CAUTION! Set your own offset
y_offset: 0 # CAUTION! Set your own offset
x_offset: 44
y_offset: 0 # CAUTION! Set your own offset
z_offset: 0 # CAUTION! Set your own offset
speed: 12
samples: 3
@@ -71,12 +59,14 @@ z_hop_speed: 12
[bed_mesh]
speed: 100
horizontal_move_z: 10
mesh_min: 0,0 # CAUTION! = probe_xy = nozzle_xy + offset_xy
mesh_max: 255,210 # CAUTION! = probe_xy = nozzle_xy + offset_xy
probe_count: 7,5
mesh_min: 50, 10
mesh_max: 230, 200
probe_count: 5, 5
mesh_pps: 3
algorithm: bicubic
relative_reference_index: 18 # center point
fade_start: 1
fade_end: 10
fade_target: 0 # center point
[screws_tilt_adjust] # = nozzle_xy = probe_xy - offset_xy
screw1: 25,30

View File

@@ -21,25 +21,28 @@ dir_pin: X_DIR_PIN
enable_pin: !X_ENABLE_PIN
rotation_distance: 40
microsteps: 16
endstop_pin: !X_STOP_PIN
position_min: -1.2 # home offset, measure yours or disable for no offset
position_endstop: -1.2 # home offset, measure yours or set '0' for no offset
position_max: 255 # X-axis bed size
endstop_pin: tmc2209_stepper_x:virtual_endstop
position_min: 0
position_max: 240
position_endstop: 0
homing_retract_dist: 0 # X-axis bed size
homing_speed: 100
homing_retract_dist: 0 # disable for head retraction after homing
# disable for head retraction after homing
[stepper_y]
step_pin: Y_STEP_PIN
dir_pin: Y_DIR_PIN
enable_pin: !Y_ENABLE_PIN
rotation_distance: 40
microsteps: 16
endstop_pin: !Y_STOP_PIN
position_min: -4.3 # home offset, measure yours or disable for no offset
position_endstop: -4.3 # home offset, measure yours or set '0' for no offset
position_max: 210 # Y-axis bed size
rotation_distance: 40
endstop_pin: tmc2209_stepper_y:virtual_endstop
homing_speed: 100
homing_retract_dist: 0 # disable for head retraction after homing
position_min: 0
position_max: 210
position_endstop: 0
homing_retract_dist: 0
# disable for head retraction after homing
[stepper_z] # left stepper
step_pin: Z_STEP_PIN
@@ -47,10 +50,12 @@ dir_pin: !Z_DIR_PIN
enable_pin: !Z_ENABLE_PIN
rotation_distance: 8
microsteps: 16
endstop_pin: !Z_STOP_PIN
endstop_pin: tmc2209_stepper_y:virtual_endstop
position_max: 200 # Z-axis print volume size
homing_speed: 20
second_homing_speed: 5
position_min: -5
################################################################################
# E0, HB
@@ -64,12 +69,12 @@ rotation_distance: 7.600
microsteps: 16
nozzle_diameter: 0.400
filament_diameter: 1.750
max_extrude_only_distance: 100 # ~100 direct, ~600 bowden
max_extrude_only_distance: 120 # ~100 direct, ~600 bowden
heater_pin: E_HEATER_PIN
sensor_type: EPCOS 100K B57560G104F
sensor_pin: E_SENSOR_PIN
min_temp: 0
max_temp: 285
max_temp: 300
[heater_bed]
heater_pin: BED_HEATER_PIN
@@ -94,9 +99,9 @@ pin: HEATER_FAN_PIN
[printer]
kinematics: cartesian
max_velocity: 150
max_velocity: 300
max_accel: 3000
max_accel_to_decel: 1500
#max_accel_to_decel: 1500
max_z_velocity: 20
max_z_accel: 100
@@ -104,8 +109,7 @@ max_z_accel: 100
# Optional G-Code features
################################################################################
[virtual_sdcard]
path: ~/gcode_files
[pause_resume]

View File

@@ -1,7 +1,8 @@
################################################################################
# Board: MKS Robin Nano v1.1 (Flying Bear Reborn 2.0) / MKS Robin Nano v1.3 / MKS Robin Nano-S v1.3
# Printer: Flying Bear Ghost 4S / Ghost 5
# Config by ODUCCEU
# Board: SKR Mini E3 v3.0
# Printer: Flying Bear Ghost 5
# Config by Sz77
# special thanks to ODUCCEU for the base config
################################################################################
# Drivers: TMC2209 by BTT
################################################################################
@@ -27,14 +28,22 @@ run_current: 0.800
hold_current: 0.400
stealthchop_threshold: 999999
uart_address: 0
sense_resistor: 0.110
diag_pin: PC0
driver_SGTHRS: 100
[tmc2209 stepper_y]
uart_pin: TMC_UART_PIN
tx_pin: TMC_TX_PIN
run_current: 0.800
uart_address: 2
run_current: 0.8
hold_current: 0.400
stealthchop_threshold: 999999
uart_address: 1
sense_resistor: 0.110
diag_pin: PC1
driver_SGTHRS: 100
stealthchop_threshold: 999999
[tmc2209 stepper_z]
uart_pin: TMC_UART_PIN
@@ -42,33 +51,39 @@ tx_pin: TMC_TX_PIN
run_current: 0.600
hold_current: 0.300
stealthchop_threshold: 999999
uart_address: 2
uart_address: 1
[tmc2209 extruder]
uart_pin: TMC_UART_PIN
tx_pin: TMC_TX_PIN
run_current: 0.400
hold_current: 0.200
run_current: 0.600
hold_current: 0.300
stealthchop_threshold: 999999
uart_address: 3
################################################################################
# Macros
################################################################################
[gcode_macro HIGH_SPEED]
gcode:
SET_TMC_CURRENT STEPPER=stepper_x CURRENT=1.000 HOLDCURRENT=0.750
SET_TMC_CURRENT STEPPER=stepper_y CURRENT=1.000 HOLDCURRENT=0.750
SET_TMC_CURRENT STEPPER=extruder CURRENT=0.600 HOLDCURRENT=0.300
SET_TMC_CURRENT STEPPER=stepper_x CURRENT=1.200 HOLDCURRENT=0.750
SET_TMC_CURRENT STEPPER=stepper_y CURRENT=1.200 HOLDCURRENT=0.750
SET_TMC_CURRENT STEPPER=stepper_z CURRENT=0.800 HOLDCURRENT=0.400
SET_TMC_CURRENT STEPPER=extruder CURRENT=0.800 HOLDCURRENT=0.400
[gcode_macro NORMAL_SPEED]
gcode:
{% set tmc_x = printer.configfile.settings["tmc2209 stepper_x"] %}
{% set tmc_y = printer.configfile.settings["tmc2209 stepper_y"] %}
{% set tmc_z = printer.configfile.settings["tmc2209 stepper_z"] %}
{% set tmc_e = printer.configfile.settings["tmc2209 extruder"] %}
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={tmc_x.run_current} HOLDCURRENT={tmc_x.hold_current}
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={tmc_y.run_current} HOLDCURRENT={tmc_y.hold_current}
SET_TMC_CURRENT STEPPER=stepper_z CURRENT={tmc_z.run_current} HOLDCURRENT={tmc_z.hold_current}
SET_TMC_CURRENT STEPPER=extruder CURRENT={tmc_e.run_current} HOLDCURRENT={tmc_e.hold_current}
################################################################################

View File

@@ -0,0 +1,17 @@
#### Sonar - A WiFi Keepalive daemon
####
#### Written by Stephan Wendel aka KwadFan <me@stephanwe.de>
#### Copyright 2022
#### https://github.com/mainsail-crew/sonar
####
#### This File is distributed under GPLv3
####
[sonar]
enable: false # false to disable till next reboot (will stop again if not set to true)
debug_log: false # if set to true, sonar will log ever ping with triptime and date/time
persistant_log: false # If true logs in /var/log/sonar.log, false logs to systemd
target: auto # IP Address, URL or auto as ping target
count: 3 # How often should be pinged?
interval: 60 # Ping again after X seconds
restart_treshold: 10 # If failed, restart WiFi after X seconds

View File

@@ -0,0 +1,424 @@
# 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 %}

Binary file not shown.