Fungernede maskine
This commit is contained in:
commit
6a2a18bf7f
|
@ -0,0 +1,90 @@
|
||||||
|
[server]
|
||||||
|
host = 0.0.0.0
|
||||||
|
port = 7125
|
||||||
|
klippy_uds_address = /home/biqu/printer_data/comms/klippy.sock
|
||||||
|
|
||||||
|
[authorization]
|
||||||
|
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
|
||||||
|
cors_domains =
|
||||||
|
*.lan
|
||||||
|
*.local
|
||||||
|
*://localhost
|
||||||
|
*://localhost:*
|
||||||
|
*://my.mainsail.xyz
|
||||||
|
*://app.fluidd.xyz
|
||||||
|
|
||||||
|
[octoprint_compat]
|
||||||
|
|
||||||
|
[history]
|
||||||
|
|
||||||
|
[update_manager]
|
||||||
|
channel = dev
|
||||||
|
refresh_interval = 168
|
||||||
|
|
||||||
|
[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
|
||||||
|
|
||||||
|
[update_manager mainsail]
|
||||||
|
type = web
|
||||||
|
channel = stable
|
||||||
|
repo = mainsail-crew/mainsail
|
||||||
|
path = ~/mainsail
|
||||||
|
|
||||||
|
[update_manager crowsnest]
|
||||||
|
type = git_repo
|
||||||
|
path = ~/crowsnest
|
||||||
|
origin = https://github.com/mainsail-crew/crowsnest.git
|
||||||
|
managed_services = crowsnest
|
||||||
|
install_script = tools/pkglist.sh
|
||||||
|
|
||||||
|
[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
|
||||||
|
|
||||||
|
[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
|
||||||
|
|
||||||
|
[update_manager print_area_bed_mesh]
|
||||||
|
type = git_repo
|
||||||
|
path = ~/print_area_bed_mesh
|
||||||
|
origin = https://github.com/Turge08/print_area_bed_mesh.git
|
||||||
|
is_system_service = False
|
||||||
|
|
||||||
|
[update_manager KlipperScreen]
|
||||||
|
type = git_repo
|
||||||
|
path = ~/KlipperScreen
|
||||||
|
origin = https://github.com/jordanruthe/KlipperScreen.git
|
||||||
|
virtualenv = ~/.KlipperScreen-env
|
||||||
|
requirements = scripts/KlipperScreen-requirements.txt
|
||||||
|
system_dependencies = scripts/system-dependencies.json
|
||||||
|
managed_services = KlipperScreen
|
||||||
|
|
||||||
|
[update_manager Klippain-ShakeTune]
|
||||||
|
type = git_repo
|
||||||
|
origin = https://github.com/Frix-x/klippain-shaketune.git
|
||||||
|
path = ~/klippain_shaketune
|
||||||
|
virtualenv = ~/klippy-env
|
||||||
|
requirements = requirements.txt
|
||||||
|
system_dependencies = system-dependencies.json
|
||||||
|
primary_branch = main
|
||||||
|
managed_services = klipper
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
# To use this KlipperScreen panel, create a symlink:
|
||||||
|
# $MOONRAKER_OBICO_HOME/scripts/klipper_screen_obico_panel.py -> $KLIPPER_SCREEN_HOME/panels/obico.py
|
||||||
|
#[menu __main more obico]
|
||||||
|
#name: Obico
|
||||||
|
#icon: network
|
||||||
|
#panel: obico
|
||||||
|
#~# --- Do not edit below this line. This section is auto generated --- #~#
|
||||||
|
#~#
|
||||||
|
#~# [main]
|
||||||
|
#~# screen_blanking = 300
|
||||||
|
#~# show_heater_power = True
|
||||||
|
#~#
|
|
@ -0,0 +1,47 @@
|
||||||
|
#### 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: /home/biqu/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.
|
|
@ -0,0 +1,4 @@
|
||||||
|
[include mcu.cfg]
|
||||||
|
[include steppers.cfg]
|
||||||
|
[include nitehawk.cfg]
|
||||||
|
[include manta.cfg]
|
|
@ -0,0 +1,223 @@
|
||||||
|
[temperature_sensor MCU]
|
||||||
|
sensor_type: temperature_mcu
|
||||||
|
|
||||||
|
[temperature_sensor SoC]
|
||||||
|
sensor_type: temperature_host
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Bed Heater
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
[heater_bed]
|
||||||
|
## SSR Pin - HE1
|
||||||
|
heater_pin: PA1
|
||||||
|
## Check what thermistor type you have. See https://www.klipper3d.org/Config_Reference.html#common-thermistors for common thermistor types.
|
||||||
|
## Use "Generic 3950" for NTC 100k 3950 thermistors
|
||||||
|
#sensor_type:
|
||||||
|
sensor_pin: PB1
|
||||||
|
## Adjust max_power so it doesn't exceed the SSR rating. The Omron G3NA-210B-DC5 SSR is rated at 4 amps without a heatsink.
|
||||||
|
## The formula is "4 / (Wattage_of_bed_heater / Mains_voltage) = max_power"
|
||||||
|
## If max_power is greater than 1.0, use 1.0
|
||||||
|
sensor_type: Generic 3950
|
||||||
|
max_power: 0.96
|
||||||
|
min_temp: 0
|
||||||
|
max_temp: 120
|
||||||
|
control: pid
|
||||||
|
pid_kp: 62.117
|
||||||
|
pid_ki: 3.210
|
||||||
|
pid_kd: 300.492
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Fan Control
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
[multi_pin ebay_fans_pin]
|
||||||
|
pins: PF7, PF9, PF6, PF8
|
||||||
|
|
||||||
|
[temperature_fan ebay_fans]
|
||||||
|
# Print Cooling Fan - CNC_FAN0
|
||||||
|
pin: multi_pin:ebay_fans_pin
|
||||||
|
hardware_pwm: true
|
||||||
|
control: watermark
|
||||||
|
max_delta: 5
|
||||||
|
sensor_type: temperature_host
|
||||||
|
min_temp: 15
|
||||||
|
max_temp: 80
|
||||||
|
target_temp: 50
|
||||||
|
|
||||||
|
#[heater_fan hotend_fan]
|
||||||
|
## Hotend Fan - CNC_FAN1
|
||||||
|
#pin: PF9
|
||||||
|
#max_power: 1.0
|
||||||
|
#kick_start_time: 0.5
|
||||||
|
#heater: extruder
|
||||||
|
#heater_temp: 50.0
|
||||||
|
## If you are experiencing back flow, you can reduce fan_speed
|
||||||
|
#fan_speed: 1.0
|
||||||
|
|
||||||
|
#[heater_fan controller_fan]
|
||||||
|
## Controller fan - CNC_FAN2
|
||||||
|
#pin: PF6
|
||||||
|
#kick_start_time: 0.5
|
||||||
|
#heater: heater_bed
|
||||||
|
#heater_temp: 45.0
|
||||||
|
|
||||||
|
#[heater_fan exhaust_fan]
|
||||||
|
## Exhaust fan - CNC_FAN3
|
||||||
|
#pin: PF8
|
||||||
|
#max_power: 1.0
|
||||||
|
#shutdown_speed: 0.0
|
||||||
|
#kick_start_time: 5.0
|
||||||
|
#heater: heater_bed
|
||||||
|
#heater_temp: 60
|
||||||
|
#fan_speed: 1.0
|
||||||
|
|
||||||
|
#[heater_fan fan4]
|
||||||
|
#pin: PA4
|
||||||
|
|
||||||
|
#[heater_fan fan5]
|
||||||
|
#pin: PA6
|
||||||
|
#tachometer_pin: PC2
|
||||||
|
|
||||||
|
#[heater_fan fan6]
|
||||||
|
#pin: PA2
|
||||||
|
#tachometer_pin: PC1
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# LED Control
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
#[output_pin caselight]
|
||||||
|
# Chamber Lighting - HE2 Connector (Optional)
|
||||||
|
#pin: PA3
|
||||||
|
#pwm:true
|
||||||
|
#shutdown_value: 0
|
||||||
|
#value:1
|
||||||
|
#cycle_time: 0.01
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Homing and Gantry Adjustment Routines
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
[idle_timeout]
|
||||||
|
timeout: 1800
|
||||||
|
|
||||||
|
[safe_z_home]
|
||||||
|
home_xy_position:175,175
|
||||||
|
speed:200
|
||||||
|
z_hop:10
|
||||||
|
|
||||||
|
[quad_gantry_level]
|
||||||
|
## Gantry Corners for 350mm Build
|
||||||
|
## Uncomment for 350mm build
|
||||||
|
gantry_corners:
|
||||||
|
-60,-10
|
||||||
|
410,420
|
||||||
|
# Probe points
|
||||||
|
points:
|
||||||
|
50,25
|
||||||
|
50,275
|
||||||
|
300,275
|
||||||
|
300,25
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
speed: 250
|
||||||
|
horizontal_move_z: 10
|
||||||
|
retries: 5
|
||||||
|
retry_tolerance: 0.0075
|
||||||
|
max_adjust: 10
|
||||||
|
|
||||||
|
[board_pins]
|
||||||
|
aliases:
|
||||||
|
# EXP1 header
|
||||||
|
EXP1_1=PE7, EXP1_2=PG1,
|
||||||
|
EXP1_3=PG0, EXP1_4=PF15,
|
||||||
|
EXP1_5=PF14, EXP1_6=PF13, # Slot in the socket on this side
|
||||||
|
EXP1_7=PF12, EXP1_8=PF11,
|
||||||
|
EXP1_9=<GND>, EXP1_10=<5V>,
|
||||||
|
|
||||||
|
# EXP2 header
|
||||||
|
EXP2_1=PE13, EXP2_2=PE12,
|
||||||
|
EXP2_3=PE15, EXP2_4=PE11,
|
||||||
|
EXP2_5=PE10, EXP2_6=PE14, # Slot in the socket on this side
|
||||||
|
EXP2_7=PE8, EXP2_8=<RST>,
|
||||||
|
EXP2_9=<GND>, EXP2_10=<NC>
|
||||||
|
|
||||||
|
# See the sample-lcd.cfg file for definitions of common LCD displays.
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Displays
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
## Uncomment the display that you have
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
#[display]
|
||||||
|
## RepRapDiscount 128x64 Full Graphic Smart Controller
|
||||||
|
#lcd_type: st7920
|
||||||
|
#cs_pin: EXP1_4
|
||||||
|
#sclk_pin: EXP1_5
|
||||||
|
#sid_pin: EXP1_3
|
||||||
|
#menu_timeout: 40
|
||||||
|
#encoder_pins: ^EXP2_5, ^EXP2_3
|
||||||
|
#click_pin: ^!EXP1_2
|
||||||
|
|
||||||
|
#[output_pin beeper]
|
||||||
|
#pin: EXP1_1
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Macros
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
[gcode_macro G32]
|
||||||
|
gcode:
|
||||||
|
BED_MESH_CLEAR
|
||||||
|
G28
|
||||||
|
QUAD_GANTRY_LEVEL
|
||||||
|
G28
|
||||||
|
## Uncomment for for your size printer:
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
## Uncomment for 250mm build
|
||||||
|
#G0 X125 Y125 Z30 F3600
|
||||||
|
|
||||||
|
## Uncomment for 300 build
|
||||||
|
#G0 X150 Y150 Z30 F3600
|
||||||
|
|
||||||
|
## Uncomment for 350mm build
|
||||||
|
#G0 X175 Y175 Z30 F3600
|
||||||
|
#--------------------------------------------------------------------
|
||||||
|
|
||||||
|
[gcode_macro PRINT_START]
|
||||||
|
# Use PRINT_START for the slicer starting script - please customise for your slicer of choice
|
||||||
|
gcode:
|
||||||
|
G32 ; home all axes
|
||||||
|
G1 Z20 F3000 ; move nozzle away from bed
|
||||||
|
|
||||||
|
|
||||||
|
[gcode_macro PRINT_END]
|
||||||
|
# Use PRINT_END for the slicer ending script - please customise for your slicer of choice
|
||||||
|
gcode:
|
||||||
|
SAVE_GCODE_STATE NAME=STATE_PRINT_END
|
||||||
|
|
||||||
|
M400 ; wait for buffer to clear
|
||||||
|
G92 E0 ; zero the extruder
|
||||||
|
G1 E-10.0 F3600 ; retract filament
|
||||||
|
|
||||||
|
G91 ; relative positioning
|
||||||
|
G0 Z1.00 X20.0 Y20.0 F20000 ; move nozzle to remove stringing
|
||||||
|
TURN_OFF_HEATERS
|
||||||
|
M107 ; turn off fan
|
||||||
|
G1 Z2 F3000 ; move nozzle up 2mm
|
||||||
|
G90 ; absolute positioning
|
||||||
|
G0 X125 Y250 F3600 ; park nozzle at rear
|
||||||
|
BED_MESH_CLEAR
|
||||||
|
|
||||||
|
# The purpose of the SAVE_GCODE_STATE/RESTORE_GCODE_STATE
|
||||||
|
# command pair is to restore the printer's coordinate system
|
||||||
|
# and speed settings since the commands above change them.
|
||||||
|
# However, to prevent any accidental, unintentional toolhead
|
||||||
|
# moves when restoring the state, explicitly set MOVE=0.
|
||||||
|
RESTORE_GCODE_STATE NAME=STATE_PRINT_END MOVE=0
|
|
@ -0,0 +1,2 @@
|
||||||
|
[mcu]
|
||||||
|
canbus_uuid=bdaffed2b88f
|
|
@ -0,0 +1,130 @@
|
||||||
|
# This file contains pin mappings for the LDO Nitehawk-SB Toolboard
|
||||||
|
# To use this config, the firmware should be compiled for the Raspberry Pi RP2040
|
||||||
|
# Make sure to include this config *at the end* of printer.cfg to overwrite the relevent sections
|
||||||
|
|
||||||
|
# See https://docs.ldomotors.com/en/voron/nitehawk-sb#firmware-setup-and-update
|
||||||
|
# For instructions on uploading/updating klipper firmware to the PCB
|
||||||
|
|
||||||
|
## LDO Nitehawk-SB Toolboard Partial Config
|
||||||
|
|
||||||
|
## *** THINGS TO CHANGE/CHECK: ***
|
||||||
|
## MCU paths [mcu] section
|
||||||
|
## Thermistor types [extruder] sections
|
||||||
|
|
||||||
|
## *MAKE SURE* to include this partial config file *AFTER* the main controller config.
|
||||||
|
## This will ensure the relavent sections are overwritten by the pin mappings specified here.
|
||||||
|
|
||||||
|
[mcu nhk]
|
||||||
|
## Obtain definition by "ls -l /dev/serial/by-id/" then unplug to verify
|
||||||
|
##--------------------------------------------------------------------
|
||||||
|
serial: /dev/serial/by-id/usb-Klipper_rp2040_313436333211C87C-if00
|
||||||
|
restart_method: command
|
||||||
|
##--------------------------------------------------------------------
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Extruder
|
||||||
|
#####################################################################
|
||||||
|
[extruder]
|
||||||
|
step_pin: nhk:gpio23
|
||||||
|
dir_pin: !nhk:gpio24
|
||||||
|
enable_pin: !nhk:gpio25
|
||||||
|
heater_pin: nhk:gpio9
|
||||||
|
sensor_pin: nhk:gpio29
|
||||||
|
sensor_type: PT1000
|
||||||
|
pullup_resistor: 2200
|
||||||
|
min_temp: 0
|
||||||
|
max_temp: 400
|
||||||
|
microsteps: 16
|
||||||
|
control: pid
|
||||||
|
pid_kp: 15.708
|
||||||
|
pid_ki: 0.585
|
||||||
|
pid_kd: 105.438
|
||||||
|
rotation_distance: 22.6789511 #Bondtech 5mm Drive Gears
|
||||||
|
gear_ratio: 50:10
|
||||||
|
filament_diameter: 1.75
|
||||||
|
nozzle_diameter: 0.4
|
||||||
|
|
||||||
|
[tmc2209 extruder]
|
||||||
|
sense_resistor: 0.100
|
||||||
|
uart_pin: nhk:gpio0
|
||||||
|
tx_pin: nhk:gpio1
|
||||||
|
interpolate: false
|
||||||
|
run_current: 0.8
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Fans
|
||||||
|
#####################################################################
|
||||||
|
## PCF
|
||||||
|
[fan]
|
||||||
|
pin: nhk:gpio6
|
||||||
|
#tachometer_pin: nhk:gpio17
|
||||||
|
#tachometer_ppr: 2
|
||||||
|
|
||||||
|
## HEF
|
||||||
|
[heater_fan hotend_fan]
|
||||||
|
pin: nhk:gpio5
|
||||||
|
#tachometer_pin: nhk:gpio16
|
||||||
|
#tachometer_ppr: 2
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Probe
|
||||||
|
#####################################################################
|
||||||
|
## Probe Port
|
||||||
|
[probe]
|
||||||
|
pin: nhk:gpio10
|
||||||
|
z_offset: -0.9
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Lights
|
||||||
|
#####################################################################
|
||||||
|
## Stealthburner Headlights
|
||||||
|
[neopixel headlight]
|
||||||
|
pin: nhk:gpio7
|
||||||
|
|
||||||
|
## PCB Activity Light
|
||||||
|
[output_pin act_led]
|
||||||
|
pin: !nhk:gpio8
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Accelerometer
|
||||||
|
#####################################################################
|
||||||
|
[adxl345]
|
||||||
|
cs_pin: nhk:gpio21
|
||||||
|
spi_software_sclk_pin: nhk:gpio18
|
||||||
|
spi_software_mosi_pin: nhk:gpio20
|
||||||
|
spi_software_miso_pin: nhk:gpio19
|
||||||
|
|
||||||
|
[resonance_tester]
|
||||||
|
accel_chip: adxl345
|
||||||
|
probe_points:
|
||||||
|
175, 175, 20
|
||||||
|
|
||||||
|
##--------------------------------------------------------------------
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Thermistors
|
||||||
|
# #####################################################################
|
||||||
|
## External Chamber Thermistor Port
|
||||||
|
#[temperature_sensor chamber_temp]
|
||||||
|
#sensor_type: Generic 3950
|
||||||
|
#sensor_pin: nhk:gpio28
|
||||||
|
#min_temp: 0
|
||||||
|
#max_temp: 100
|
||||||
|
#gcode_id: chamber_th
|
||||||
|
|
||||||
|
[thermistor CMFB103F3950FANT]
|
||||||
|
temperature1: 0.0
|
||||||
|
resistance1: 32116.0
|
||||||
|
temperature2: 40.0
|
||||||
|
resistance2: 5309.0
|
||||||
|
temperature3: 80.0
|
||||||
|
resistance3: 1228.0
|
||||||
|
|
||||||
|
[temperature_sensor nh_temp]
|
||||||
|
## Nitehawk PCB Sensor
|
||||||
|
sensor_type: CMFB103F3950FANT
|
||||||
|
sensor_pin: nhk:gpio26
|
||||||
|
pullup_resistor: 2200
|
||||||
|
min_temp: 0
|
||||||
|
max_temp: 100
|
||||||
|
gcode_id: nh_th
|
|
@ -0,0 +1,136 @@
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# X/Y Stepper Settings
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
## X Stepper on Motor1(B Motor)
|
||||||
|
[stepper_x]
|
||||||
|
dir_pin: !PE5
|
||||||
|
step_pin: PE6
|
||||||
|
enable_pin: !PC14
|
||||||
|
microsteps: 16
|
||||||
|
rotation_distance: 40
|
||||||
|
full_steps_per_rotation:200 #set to 400 for 0.9 degree stepper
|
||||||
|
endstop_pin: tmc2209_stepper_x:virtual_endstop
|
||||||
|
position_min: 0
|
||||||
|
position_endstop: 350
|
||||||
|
position_max: 350
|
||||||
|
homing_speed: 100 #Max 100
|
||||||
|
homing_retract_dist: 5
|
||||||
|
homing_positive_dir: true
|
||||||
|
|
||||||
|
## Make sure to update below for your relevant driver (2208 or 2209)
|
||||||
|
[tmc2209 stepper_x]
|
||||||
|
uart_pin: PC13
|
||||||
|
interpolate: True
|
||||||
|
run_current: 0.8
|
||||||
|
sense_resistor: 0.110
|
||||||
|
stealthchop_threshold: 0
|
||||||
|
driver_SGTHRS: 60
|
||||||
|
diag_pin: PF4
|
||||||
|
|
||||||
|
## Y Stepper on Motor2 (A Motor)
|
||||||
|
[stepper_y]
|
||||||
|
dir_pin: !PE1
|
||||||
|
step_pin: PE2
|
||||||
|
enable_pin: !PE4
|
||||||
|
microsteps: 16
|
||||||
|
rotation_distance: 40
|
||||||
|
endstop_pin: tmc2209_stepper_y:virtual_endstop
|
||||||
|
full_steps_per_rotation:200 #set to 400 for 0.9 degree stepper
|
||||||
|
position_min: 0
|
||||||
|
position_endstop: 350
|
||||||
|
position_max: 350
|
||||||
|
|
||||||
|
##--------------------------------------------------------------------
|
||||||
|
homing_speed: 100 #Max 100
|
||||||
|
homing_retract_dist: 5
|
||||||
|
homing_positive_dir: true
|
||||||
|
|
||||||
|
## Make sure to update below for your relevant driver (2208 or 2209)
|
||||||
|
[tmc2209 stepper_y]
|
||||||
|
uart_pin: PE3
|
||||||
|
interpolate: True
|
||||||
|
run_current: 0.8
|
||||||
|
sense_resistor: 0.110
|
||||||
|
stealthchop_threshold: 0
|
||||||
|
diag_pin: PF3
|
||||||
|
driver_SGTHRS: 60
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# Z Stepper Settings
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
## Z0 Stepper - Front Left on MOTOR3_A
|
||||||
|
[stepper_z]
|
||||||
|
step_pin: PB8
|
||||||
|
dir_pin: !PB7
|
||||||
|
enable_pin: !PE0
|
||||||
|
rotation_distance: 40
|
||||||
|
gear_ratio: 80:16
|
||||||
|
microsteps: 16
|
||||||
|
endstop_pin: probe:z_virtual_endstop
|
||||||
|
position_max: 340
|
||||||
|
position_min: -5
|
||||||
|
homing_speed: 8
|
||||||
|
second_homing_speed: 3
|
||||||
|
homing_retract_dist: 3
|
||||||
|
|
||||||
|
## Make sure to update below for your relevant driver (2208 or 2209)
|
||||||
|
[tmc2209 stepper_z]
|
||||||
|
uart_pin: PB9
|
||||||
|
interpolate: true
|
||||||
|
run_current: 0.8
|
||||||
|
sense_resistor: 0.110
|
||||||
|
stealthchop_threshold: 0
|
||||||
|
|
||||||
|
## Z1 Stepper - Rear Left on Motor5
|
||||||
|
[stepper_z1]
|
||||||
|
step_pin: PG13
|
||||||
|
dir_pin: PG12
|
||||||
|
enable_pin: !PG15
|
||||||
|
rotation_distance: 40
|
||||||
|
gear_ratio: 80:16
|
||||||
|
microsteps: 16
|
||||||
|
|
||||||
|
## Make sure to update below for your relevant driver (2208 or 2209)
|
||||||
|
[tmc2209 stepper_z1]
|
||||||
|
uart_pin: PG14
|
||||||
|
interpolate: true
|
||||||
|
run_current: 0.8
|
||||||
|
sense_resistor: 0.110
|
||||||
|
stealthchop_threshold: 0
|
||||||
|
|
||||||
|
## Z2 Stepper - Rear Right on Motor6
|
||||||
|
[stepper_z2]
|
||||||
|
step_pin: PG9
|
||||||
|
dir_pin: !PD7
|
||||||
|
enable_pin: !PG11
|
||||||
|
rotation_distance: 40
|
||||||
|
gear_ratio: 80:16
|
||||||
|
microsteps: 16
|
||||||
|
|
||||||
|
## Make sure to update below for your relevant driver (2208 or 2209)
|
||||||
|
[tmc2209 stepper_z2]
|
||||||
|
uart_pin: PG10
|
||||||
|
interpolate: true
|
||||||
|
run_current: 0.8
|
||||||
|
sense_resistor: 0.110
|
||||||
|
stealthchop_threshold: 0
|
||||||
|
|
||||||
|
## Z3 Stepper - Front Right on Motor7
|
||||||
|
[stepper_z3]
|
||||||
|
step_pin: PD4
|
||||||
|
dir_pin: PD3
|
||||||
|
enable_pin: !PD6
|
||||||
|
rotation_distance: 40
|
||||||
|
gear_ratio: 80:16
|
||||||
|
microsteps: 16
|
||||||
|
|
||||||
|
## Make sure to update below for your relevant driver (2208 or 2209)
|
||||||
|
[tmc2209 stepper_z3]
|
||||||
|
uart_pin: PD5
|
||||||
|
interpolate: true
|
||||||
|
run_current: 0.8
|
||||||
|
sense_resistor: 0.110
|
||||||
|
stealthchop_threshold: 0
|
|
@ -0,0 +1,9 @@
|
||||||
|
[gcode_macro BUZZ]
|
||||||
|
gcode:
|
||||||
|
STEPPER_BUZZ STEPPER=stepper_x
|
||||||
|
STEPPER_BUZZ STEPPER=stepper_y
|
||||||
|
STEPPER_BUZZ STEPPER=stepper_z
|
||||||
|
STEPPER_BUZZ STEPPER=stepper_z1
|
||||||
|
STEPPER_BUZZ STEPPER=stepper_z2
|
||||||
|
STEPPER_BUZZ STEPPER=stepper_z3
|
||||||
|
STEPPER_BUZZ STEPPER=extruder
|
|
@ -0,0 +1,4 @@
|
||||||
|
[include buzz.cfg]
|
||||||
|
[include sensorless-homing.cfg]
|
||||||
|
[include print-start.cfg]
|
||||||
|
# [include sb-leds.cfg]
|
|
@ -0,0 +1,91 @@
|
||||||
|
#####################################################################
|
||||||
|
# print_start macro
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
## *** THINGS TO UNCOMMENT: ***
|
||||||
|
## Bed mesh (2 lines at 2 locations)
|
||||||
|
## Z_TILT_ADJUST if your printer is a Trident
|
||||||
|
## Quad gantry level if your printer is a V2
|
||||||
|
## Nevermore - if you have one
|
||||||
|
|
||||||
|
[gcode_macro PRINT_START]
|
||||||
|
gcode:
|
||||||
|
# This part fetches data from your slicer. Such as bed temp, extruder temp, chamber temp and size of your printer.
|
||||||
|
{% set target_bed = params.BED|int %}
|
||||||
|
{% set target_extruder = params.EXTRUDER|int %}
|
||||||
|
{% set target_chamber = params.CHAMBER|default("40")|int %}
|
||||||
|
{% set x_wait = printer.toolhead.axis_maximum.x|float / 2 %}
|
||||||
|
{% set y_wait = printer.toolhead.axis_maximum.y|float / 2 %}
|
||||||
|
|
||||||
|
# Homes the printer, sets absolute positioning and updates the Stealthburner leds.
|
||||||
|
# STATUS_HOMING # Sets SB-leds to homing-mode
|
||||||
|
G28 # Full home (XYZ)
|
||||||
|
G90 # Absolut position
|
||||||
|
|
||||||
|
## Uncomment for bed mesh (1 of 2)
|
||||||
|
BED_MESH_CLEAR # Clears old saved bed mesh (if any)
|
||||||
|
|
||||||
|
# Checks if the bed temp is higher than 90c - if so then trigger a heatsoak.
|
||||||
|
{% if params.BED|int > 90 %}
|
||||||
|
SET_DISPLAY_TEXT MSG="Bed: {target_bed}c" # Displays info
|
||||||
|
# STATUS_HEATING # Sets SB-leds to heating-mode
|
||||||
|
M106 S255 # Turns on the PT-fan
|
||||||
|
|
||||||
|
## Uncomment if you have a Nevermore.
|
||||||
|
#SET_PIN PIN=nevermore VALUE=1 # Turns on the nevermore
|
||||||
|
|
||||||
|
G1 X{x_wait} Y{y_wait} Z15 F9000 # Goes to center of the bed
|
||||||
|
M190 S{target_bed} # Sets the target temp for the bed
|
||||||
|
SET_DISPLAY_TEXT MSG="Heatsoak: {target_chamber}c" # Displays info
|
||||||
|
TEMPERATURE_WAIT SENSOR="temperature_sensor chamber" MINIMUM={target_chamber} # Waits for chamber to reach desired temp
|
||||||
|
|
||||||
|
# If the bed temp is not over 90c, then it skips the heatsoak and just heats up to set temp with a 5min soak
|
||||||
|
{% else %}
|
||||||
|
SET_DISPLAY_TEXT MSG="Bed: {target_bed}c" # Displays info
|
||||||
|
# STATUS_HEATING # Sets SB-leds to heating-mode
|
||||||
|
G1 X{x_wait} Y{y_wait} Z15 F9000 # Goes to center of the bed
|
||||||
|
M190 S{target_bed} # Sets the target temp for the bed
|
||||||
|
SET_DISPLAY_TEXT MSG="Soak for 5min" # Displays info
|
||||||
|
G4 P300000 # Waits 5 min for the bedtemp to stabilize
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# Heating nozzle to 150 degrees. This helps with getting a correct Z-home
|
||||||
|
SET_DISPLAY_TEXT MSG="Hotend: 150c" # Displays info
|
||||||
|
M109 S150 # Heats the nozzle to 150c
|
||||||
|
|
||||||
|
## Uncomment for Trident (Z_TILT_ADJUST)
|
||||||
|
#SET_DISPLAY_TEXT MSG="Z-tilt adjust" # Displays info
|
||||||
|
#STATUS_LEVELING # Sets SB-leds to leveling-mode
|
||||||
|
#Z_TILT_ADJUST # Levels the buildplate via z_tilt_adjust
|
||||||
|
#G28 Z # Homes Z again after z_tilt_adjust
|
||||||
|
|
||||||
|
## Uncomment for V2 (Quad gantry level AKA QGL)
|
||||||
|
SET_DISPLAY_TEXT MSG="QGL" # Displays info
|
||||||
|
# STATUS_LEVELING # Sets SB-leds to leveling-mode
|
||||||
|
quad_gantry_level # Levels the buildplate via QGL
|
||||||
|
G28 Z # Homes Z again after QGL
|
||||||
|
|
||||||
|
## Uncomment for Klicky auto-z
|
||||||
|
#CALIBRATE_Z # Calibrates Z-offset with klicky
|
||||||
|
#SET_DISPLAY_TEXT MSG="Z-offset" # Displays info
|
||||||
|
|
||||||
|
## Uncomment for bed mesh (2 of 2)
|
||||||
|
SET_DISPLAY_TEXT MSG="Bed mesh" # Displays info
|
||||||
|
# STATUS_MESHING # Sets SB-leds to bed mesh-mode
|
||||||
|
bed_mesh_calibrate # Starts bed mesh
|
||||||
|
|
||||||
|
# Heats up the nozzle up to target via data from slicer
|
||||||
|
SET_DISPLAY_TEXT MSG="Hotend: {target_extruder}c" # Displays info
|
||||||
|
# STATUS_HEATING # Sets SB-leds to heating-mode
|
||||||
|
G1 X{x_wait} Y{y_wait} Z15 F9000 # Goes to center of the bed
|
||||||
|
M107 # Turns off partcooling fan
|
||||||
|
M109 S{target_extruder} # Heats the nozzle to printing temp
|
||||||
|
|
||||||
|
# Gets ready to print by doing a purge line and updating the SB-leds
|
||||||
|
SET_DISPLAY_TEXT MSG="Printer goes brr" # Displays info
|
||||||
|
# STATUS_PRINTING # Sets SB-leds to printing-mode
|
||||||
|
G0 X{x_wait - 50} Y4 F10000 # Moves to starting point
|
||||||
|
G0 Z0.4 # Raises Z to 0.4
|
||||||
|
G91 # Incremental positioning
|
||||||
|
G1 X100 E20 F1000 # Purge line
|
||||||
|
G90 # Absolut position
|
|
@ -0,0 +1,156 @@
|
||||||
|
#####################################################################
|
||||||
|
# Stealthburner LED macro
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
[gcode_macro _sb_vars]
|
||||||
|
variable_colors: {
|
||||||
|
'logo': { # Colors for logo states
|
||||||
|
'busy': {'r': 0.4, 'g': 0.0, 'b': 0.0, 'w': 0.0},
|
||||||
|
'cleaning': {'r': 0.0, 'g': 0.02, 'b': 0.5, 'w': 0.0},
|
||||||
|
'calibrating_z': {'r': 0.8, 'g': 0., 'b': 0.35, 'w': 0.0},
|
||||||
|
'heating': {'r': 0.3, 'g': 0.18, 'b': 0.0, 'w': 0.0},
|
||||||
|
'homing': {'r': 0.0, 'g': 0.6, 'b': 0.2, 'w': 0.0},
|
||||||
|
'leveling': {'r': 0.5, 'g': 0.1, 'b': 0.4, 'w': 0.0},
|
||||||
|
'meshing': {'r': 0.2, 'g': 1.0, 'b': 0.0, 'w': 0.0},
|
||||||
|
'off': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w': 0.0},
|
||||||
|
'printing': {'r': 1.0, 'g': 0.0, 'b': 0.0, 'w': 0.0},
|
||||||
|
'standby': {'r': 0.01, 'g': 0.01, 'b': 0.01, 'w': 0.1},
|
||||||
|
},
|
||||||
|
'nozzle': { # Colors for nozzle states
|
||||||
|
'heating': {'r': 0.8, 'g': 0.35, 'b': 0.0, 'w':0.0},
|
||||||
|
'off': {'r': 0.0, 'g': 0.0, 'b': 0.0, 'w': 0.0},
|
||||||
|
'on': {'r': 0.8, 'g': 0.8, 'b': 0.8, 'w':1.0},
|
||||||
|
'standby': {'r': 0.6, 'g': 0.0, 'b': 0.0, 'w':0.0},
|
||||||
|
},
|
||||||
|
'thermal': {
|
||||||
|
'hot': {'r': 1.0, 'g': 0.0, 'b': 0.0, 'w': 0.0},
|
||||||
|
'cold': {'r': 0.3, 'g': 0.0, 'b': 0.3, 'w': 0.0}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
variable_logo_led_name: "sb_leds"
|
||||||
|
# The name of the addressable LED chain that contains the logo LED(s)
|
||||||
|
variable_logo_idx: "2"
|
||||||
|
# A comma-separated list of indexes LEDs in the logo
|
||||||
|
variable_nozzle_led_name: "sb_leds"
|
||||||
|
# The name of the addressable LED chain that contains the nozzle LED(s). This will
|
||||||
|
# typically be the same LED chain as the logo.
|
||||||
|
variable_nozzle_idx: "1,3"
|
||||||
|
# A comma-separated list of indexes of LEDs in the nozzle
|
||||||
|
gcode:
|
||||||
|
# This section is required. Do Not Delete.
|
||||||
|
|
||||||
|
|
||||||
|
[gcode_macro _set_sb_leds]
|
||||||
|
gcode:
|
||||||
|
{% set red = params.RED|default(0)|float %}
|
||||||
|
{% set green = params.GREEN|default(0)|float %}
|
||||||
|
{% set blue = params.BLUE|default(0)|float %}
|
||||||
|
{% set white = params.WHITE|default(0)|float %}
|
||||||
|
{% set led = params.LED|string %}
|
||||||
|
{% set idx = (params.IDX|string).split(',') %}
|
||||||
|
{% set transmit_last = params.TRANSMIT|default(1) %}
|
||||||
|
|
||||||
|
{% for led_index in idx %}
|
||||||
|
{% set transmit=transmit_last if loop.last else 0 %}
|
||||||
|
set_led led={led} red={red} green={green} blue={blue} white={white} index={led_index} transmit={transmit}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
[gcode_macro _set_sb_leds_by_name]
|
||||||
|
gcode:
|
||||||
|
{% set leds_name = params.LEDS %}
|
||||||
|
{% set color_name = params.COLOR %}
|
||||||
|
{% set color = printer["gcode_macro _sb_vars"].colors[leds_name][color_name] %}
|
||||||
|
{% set led = printer["gcode_macro _sb_vars"][leds_name + "_led_name"] %}
|
||||||
|
{% set idx = printer["gcode_macro _sb_vars"][leds_name + "_idx"] %}
|
||||||
|
{% set transmit = params.TRANSMIT|default(1) %}
|
||||||
|
|
||||||
|
_set_sb_leds led={led} red={color.r} green={color.g} blue={color.b} white={color.w} idx="{idx}" transmit={transmit}
|
||||||
|
|
||||||
|
[gcode_macro _set_logo_leds]
|
||||||
|
gcode:
|
||||||
|
{% set red = params.RED|default(0)|float %}
|
||||||
|
{% set green = params.GREEN|default(0)|float %}
|
||||||
|
{% set blue = params.BLUE|default(0)|float %}
|
||||||
|
{% set white = params.WHITE|default(0)|float %}
|
||||||
|
{% set led = printer["gcode_macro _sb_vars"].logo_led_name %}
|
||||||
|
{% set idx = printer["gcode_macro _sb_vars"].logo_idx %}
|
||||||
|
{% set transmit=params.TRANSMIT|default(1) %}
|
||||||
|
|
||||||
|
_set_sb_leds led={led} red={red} green={green} blue={blue} white={white} idx="{idx}" transmit={transmit}
|
||||||
|
|
||||||
|
[gcode_macro _set_nozzle_leds]
|
||||||
|
gcode:
|
||||||
|
{% set red = params.RED|default(0)|float %}
|
||||||
|
{% set green = params.GREEN|default(0)|float %}
|
||||||
|
{% set blue = params.BLUE|default(0)|float %}
|
||||||
|
{% set white = params.WHITE|default(0)|float %}
|
||||||
|
{% set led = printer["gcode_macro _sb_vars"].nozzle_led_name %}
|
||||||
|
{% set idx = printer["gcode_macro _sb_vars"].nozzle_idx %}
|
||||||
|
{% set transmit=params.TRANSMIT|default(1) %}
|
||||||
|
|
||||||
|
_set_sb_leds led={led} red={red} green={green} blue={blue} white={white} idx="{idx}" transmit={transmit}
|
||||||
|
|
||||||
|
[gcode_macro set_logo_leds_off]
|
||||||
|
gcode:
|
||||||
|
{% set transmit=params.TRANSMIT|default(1) %}
|
||||||
|
_set_logo_leds red=0 blue=0 green=0 white=0 transmit={transmit}
|
||||||
|
|
||||||
|
[gcode_macro set_nozzle_leds_on]
|
||||||
|
gcode:
|
||||||
|
{% set transmit=params.TRANSMIT|default(1) %}
|
||||||
|
_set_sb_leds_by_name leds="nozzle" color="on" transmit={transmit}
|
||||||
|
|
||||||
|
[gcode_macro set_nozzle_leds_off]
|
||||||
|
gcode:
|
||||||
|
{% set transmit=params.TRANSMIT|default(1) %}
|
||||||
|
_set_sb_leds_by_name leds="nozzle" color="off" transmit={transmit}
|
||||||
|
|
||||||
|
[gcode_macro status_off]
|
||||||
|
gcode:
|
||||||
|
set_logo_leds_off transmit=0
|
||||||
|
set_nozzle_leds_off
|
||||||
|
|
||||||
|
[gcode_macro status_ready]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="standby" transmit=0
|
||||||
|
_set_sb_leds_by_name leds="nozzle" color="standby" transmit=1
|
||||||
|
|
||||||
|
[gcode_macro status_busy]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="busy" transmit=0
|
||||||
|
set_nozzle_leds_on
|
||||||
|
|
||||||
|
[gcode_macro status_heating]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="heating" transmit=0
|
||||||
|
_set_sb_leds_by_name leds="nozzle" color="heating" transmit=1
|
||||||
|
|
||||||
|
[gcode_macro status_leveling]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="leveling" transmit=0
|
||||||
|
set_nozzle_leds_on
|
||||||
|
|
||||||
|
[gcode_macro status_homing]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="homing" transmit=0
|
||||||
|
set_nozzle_leds_on
|
||||||
|
|
||||||
|
[gcode_macro status_cleaning]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="cleaning" transmit=0
|
||||||
|
set_nozzle_leds_on
|
||||||
|
|
||||||
|
[gcode_macro status_meshing]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="meshing" transmit=0
|
||||||
|
set_nozzle_leds_on
|
||||||
|
|
||||||
|
[gcode_macro status_calibrating_z]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="calibrating_z" transmit=0
|
||||||
|
set_nozzle_leds_on
|
||||||
|
|
||||||
|
[gcode_macro status_printing]
|
||||||
|
gcode:
|
||||||
|
_set_sb_leds_by_name leds="logo" color="printing" transmit=0
|
||||||
|
set_nozzle_leds_on
|
|
@ -0,0 +1,41 @@
|
||||||
|
[gcode_macro _HOME_X]
|
||||||
|
gcode:
|
||||||
|
# Always use consistent run_current on A/B steppers during sensorless homing
|
||||||
|
{% set RUN_CURRENT_X = printer.configfile.settings['tmc2209 stepper_x'].run_current|float %}
|
||||||
|
{% set RUN_CURRENT_Y = printer.configfile.settings['tmc2209 stepper_y'].run_current|float %}
|
||||||
|
{% set HOME_CURRENT = 0.7 %}
|
||||||
|
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
|
||||||
|
|
||||||
|
# Wait just a second… (give StallGuard registers time to clear)
|
||||||
|
G4 P1000
|
||||||
|
# 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['tmc2209 stepper_x'].run_current|float %}
|
||||||
|
{% set RUN_CURRENT_Y = printer.configfile.settings['tmc2209 stepper_y'].run_current|float %}
|
||||||
|
{% set HOME_CURRENT = 0.7 %}
|
||||||
|
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
|
||||||
|
|
||||||
|
# Wait just a second… (give StallGuard registers time to clear)
|
||||||
|
G4 P1000
|
||||||
|
# Set current during print
|
||||||
|
SET_TMC_CURRENT STEPPER=stepper_x CURRENT={RUN_CURRENT_X}
|
||||||
|
SET_TMC_CURRENT STEPPER=stepper_y CURRENT={RUN_CURRENT_Y}
|
|
@ -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}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[bed_mesh]
|
||||||
|
speed: 600
|
||||||
|
horizontal_move_z: 2
|
||||||
|
mesh_min: 20,20
|
||||||
|
mesh_max: 320,320
|
||||||
|
probe_count: 7,7
|
||||||
|
algorithm: bicubic
|
|
@ -0,0 +1,4 @@
|
||||||
|
[input_shaper]
|
||||||
|
shaper_freq_x: 60.8
|
||||||
|
shaper_freq_y: 42.0
|
||||||
|
shaper_type: zv
|
|
@ -0,0 +1,3 @@
|
||||||
|
[include bed_mesh.cfg]
|
||||||
|
[include input-shaper.cfg]
|
||||||
|
[include shake-n-tune.cfg]
|
|
@ -0,0 +1,14 @@
|
||||||
|
[shaketune]
|
||||||
|
# result_folder: ~/printer_data/config/ShakeTune_results
|
||||||
|
# The folder where the results will be stored. It will be created if it doesn't exist.
|
||||||
|
# number_of_results_to_keep: 3
|
||||||
|
# The number of results to keep in the result_folder. The oldest results will
|
||||||
|
# be automatically deleted after each runs.
|
||||||
|
# keep_raw_csv: False
|
||||||
|
# If True, the raw CSV files will be kept in the result_folder alongside the
|
||||||
|
# PNG graphs. If False, they will be deleted and only the graphs will be kept.
|
||||||
|
# show_macros_in_webui: True
|
||||||
|
# Mainsail and Fluidd doesn't create buttons for "system" macros that are not in the
|
||||||
|
# printer.cfg file. If you want to see the macros in the webui, set this to True.
|
||||||
|
# timeout: 300
|
||||||
|
# The maximum time in seconds to let Shake&Tune process the CSV files and generate the graphs.
|
|
@ -0,0 +1,9 @@
|
||||||
|
[update_manager moonraker-obico]
|
||||||
|
type: git_repo
|
||||||
|
path: /home/biqu/moonraker-obico
|
||||||
|
origin: https://github.com/TheSpaghettiDetective/moonraker-obico.git
|
||||||
|
env: /home/biqu/moonraker-obico/../moonraker-obico-env/bin/python
|
||||||
|
requirements: requirements.txt
|
||||||
|
install_script: install.sh
|
||||||
|
managed_services:
|
||||||
|
moonraker-obico
|
|
@ -0,0 +1,34 @@
|
||||||
|
[server]
|
||||||
|
url = https://app.obico.io
|
||||||
|
|
||||||
|
[moonraker]
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = 7125
|
||||||
|
# api_key = <grab one or set trusted hosts in moonraker>
|
||||||
|
|
||||||
|
[webcam]
|
||||||
|
disable_video_streaming = False
|
||||||
|
|
||||||
|
# CAUTION: Don't modify the settings below unless you know what you are doing
|
||||||
|
# In most cases webcam configuration will be automatically retrived from moonraker
|
||||||
|
#
|
||||||
|
# Lower target_fps if ffmpeg is using too much CPU. Capped at 25 for Pro users (including self-hosted) and 5 for Free users
|
||||||
|
# target_fps = 25
|
||||||
|
#
|
||||||
|
snapshot_url = http://127.0.0.1:8080/?action=snapshot
|
||||||
|
stream_url = http://127.0.0.1:8080/?action=stream
|
||||||
|
# flip_h = False
|
||||||
|
# flip_v = False
|
||||||
|
# rotation = 0
|
||||||
|
# aspect_ratio_169 = False
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
path = /home/biqu/printer_data/logs/moonraker-obico.log
|
||||||
|
# level = INFO
|
||||||
|
|
||||||
|
[tunnel]
|
||||||
|
# CAUTION: Don't modify the settings below unless you know what you are doing
|
||||||
|
# dest_host = 127.0.0.1
|
||||||
|
dest_port = 80
|
||||||
|
# dest_is_ssl = False
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
[server]
|
||||||
|
host: 0.0.0.0
|
||||||
|
port: 7125
|
||||||
|
klippy_uds_address: /home/biqu/printer_data/comms/klippy.sock
|
||||||
|
|
||||||
|
[authorization]
|
||||||
|
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
|
||||||
|
cors_domains:
|
||||||
|
*.lan
|
||||||
|
*.local
|
||||||
|
*://localhost
|
||||||
|
*://localhost:*
|
||||||
|
*://my.mainsail.xyz
|
||||||
|
*://app.fluidd.xyz
|
||||||
|
|
||||||
|
[octoprint_compat]
|
||||||
|
|
||||||
|
[history]
|
||||||
|
|
||||||
|
[update_manager]
|
||||||
|
channel: dev
|
||||||
|
refresh_interval: 168
|
||||||
|
|
||||||
|
[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
|
||||||
|
|
||||||
|
[update_manager mainsail]
|
||||||
|
type: web
|
||||||
|
channel: stable
|
||||||
|
repo: mainsail-crew/mainsail
|
||||||
|
path: ~/mainsail
|
||||||
|
|
||||||
|
# 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
|
||||||
|
# moonraker.conf
|
||||||
|
|
||||||
|
[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
|
||||||
|
|
||||||
|
[update_manager print_area_bed_mesh]
|
||||||
|
type: git_repo
|
||||||
|
path: ~/print_area_bed_mesh
|
||||||
|
origin: https://github.com/Turge08/print_area_bed_mesh.git
|
||||||
|
is_system_service: False
|
||||||
|
|
||||||
|
[update_manager KlipperScreen]
|
||||||
|
type: git_repo
|
||||||
|
path: ~/KlipperScreen
|
||||||
|
origin: https://github.com/jordanruthe/KlipperScreen.git
|
||||||
|
virtualenv: ~/.KlipperScreen-env
|
||||||
|
requirements: scripts/KlipperScreen-requirements.txt
|
||||||
|
system_dependencies: scripts/system-dependencies.json
|
||||||
|
managed_services: KlipperScreen
|
||||||
|
|
||||||
|
## Klippain Shake&Tune automatic update management
|
||||||
|
[update_manager Klippain-ShakeTune]
|
||||||
|
type: git_repo
|
||||||
|
origin: https://github.com/Frix-x/klippain-shaketune.git
|
||||||
|
path: ~/klippain_shaketune
|
||||||
|
virtualenv: ~/klippy-env
|
||||||
|
requirements: requirements.txt
|
||||||
|
system_dependencies: system-dependencies.json
|
||||||
|
primary_branch: main
|
||||||
|
managed_services: klipper
|
|
@ -0,0 +1,166 @@
|
||||||
|
[gcode_macro BED_MESH_CALIBRATE]
|
||||||
|
# print surface bed mesh calibrate
|
||||||
|
# Works with Klicky Probe on Voron
|
||||||
|
# November 24, 2021
|
||||||
|
# Steve Turgeon
|
||||||
|
rename_existing: _BED_MESH_CALIBRATE
|
||||||
|
|
||||||
|
variable_buffer: 20
|
||||||
|
|
||||||
|
; Do not change any of the existing values below.
|
||||||
|
variable_last_area_start_x: -1 ; Do not change
|
||||||
|
variable_last_area_start_y: -1 ; Do not change
|
||||||
|
variable_last_area_end_x: -1 ; Do not change
|
||||||
|
variable_last_area_end_y: -1 ; Do not change
|
||||||
|
|
||||||
|
gcode:
|
||||||
|
|
||||||
|
{% if params.FORCE_NEW_MESH != null %}
|
||||||
|
{ action_respond_info("Force New Mesh: %s" % (params.FORCE_NEW_MESH)) }
|
||||||
|
{% endif %}
|
||||||
|
{% if printer["bed_mesh"].profile_name == '' %}
|
||||||
|
{ action_respond_info("No existing bed mesh found.") }
|
||||||
|
{% set last_area_end_x=-1 %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if printer.toolhead.homed_axes != "xyz" %}
|
||||||
|
G28
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% set klicky_available = printer['gcode_macro _Probe_Variables'] != null %}
|
||||||
|
{% set euclid_available = printer['gcode_macro EuclidProbe'] != null %}; Requires v5 macros https://github.com/nionio6915/Euclid_Probe/blob/main/Firmware_Examples/Klipper/00-euclid_exampleV5.cfg
|
||||||
|
{% if params.PRINT_MIN %}
|
||||||
|
{ action_respond_info("print_min: %s" % params.PRINT_MIN) }
|
||||||
|
{ action_respond_info("print_max: %s" % params.PRINT_MAX) }
|
||||||
|
|
||||||
|
{% set blTouchConfig = printer['configfile'].config["bltouch"] %}
|
||||||
|
{% if blTouchConfig %}
|
||||||
|
{% set OffsetX = blTouchConfig.x_offset|default(0)|float %}
|
||||||
|
{% set OffsetY = blTouchConfig.y_offset|default(0)|float %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% set probeConfig = printer['configfile'].config["probe"] %}
|
||||||
|
{% if probeConfig %}
|
||||||
|
{% set OffsetX = probeConfig.x_offset|default(0)|float %}
|
||||||
|
{% set OffsetY = probeConfig.y_offset|default(0)|float %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% set print_min_x = params.PRINT_MIN.split(",")[0]|float %}
|
||||||
|
{% set print_min_y = params.PRINT_MIN.split(",")[1]|float %}
|
||||||
|
{% set print_max_x = params.PRINT_MAX.split(",")[0]|float %}
|
||||||
|
{% set print_max_y = params.PRINT_MAX.split(",")[1]|float %}
|
||||||
|
|
||||||
|
{% if last_area_start_x > 0 %}
|
||||||
|
{ action_respond_info("last_bed_mesh: %s,%s %s,%s" % (last_area_start_x, last_area_start_y, last_area_end_x, last_area_end_y)) }
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if (params.FORCE_NEW_MESH != null) or (print_min_x < last_area_start_x) or (print_max_x > last_area_end_x) or (print_min_y < last_area_start_y) or (print_max_y > last_area_end_y) %}
|
||||||
|
{% if klicky_available %}
|
||||||
|
_CheckProbe action=query
|
||||||
|
Attach_Probe
|
||||||
|
{% elif euclid_available %}
|
||||||
|
DEPLOY_PROBE
|
||||||
|
{% endif %}
|
||||||
|
{% if (print_min_x < print_max_x) and (print_min_y < print_max_y) %}
|
||||||
|
|
||||||
|
# Get bed_mesh config (probe count, mesh_min and mesh_max for x and y
|
||||||
|
{% set bedMeshConfig = printer['configfile'].config["bed_mesh"] %}
|
||||||
|
{% set minimum_probe_count = 3 %}
|
||||||
|
{% if bedMeshConfig.algorithm == "bicubic" %}
|
||||||
|
{% set minimum_probe_count = 5 %}
|
||||||
|
{% endif %}
|
||||||
|
{% set probe_count = bedMeshConfig.probe_count.split(",") %}
|
||||||
|
{% set probe_count_x = probe_count[0]|int %}
|
||||||
|
{% if probe_count.__len__() > 1 %}
|
||||||
|
{% set probe_count_y = probe_count[1]|int %}
|
||||||
|
{% else %}
|
||||||
|
{% set probe_count_y = probe_count_x|int %}
|
||||||
|
{% endif %}
|
||||||
|
{% set relative_reference_index = bedMeshConfig.relative_reference_index %}
|
||||||
|
{% set mesh_min_x = bedMeshConfig.mesh_min.split(",")[0]|float %}
|
||||||
|
{% set mesh_min_y = bedMeshConfig.mesh_min.split(",")[1]|float %}
|
||||||
|
{% set mesh_max_x = bedMeshConfig.mesh_max.split(",")[0]|float %}
|
||||||
|
{% set mesh_max_y = bedMeshConfig.mesh_max.split(",")[1]|float %}
|
||||||
|
|
||||||
|
# If print area X is smaller than 50% of the bed size, change to to 3 probe counts for X instead of the default
|
||||||
|
{% if print_max_x - print_min_x < (mesh_max_x - mesh_min_x) * 0.50 %}
|
||||||
|
{% set probe_count_x = minimum_probe_count %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# If print area Y is smaller than 50% of the bed size, change to to 3 probe counts for Y instead of the default
|
||||||
|
{% if print_max_y - print_min_y < (mesh_max_y - mesh_min_y) * 0.50 %}
|
||||||
|
{% set probe_count_y = minimum_probe_count %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if print_min_x - buffer >= mesh_min_x %}
|
||||||
|
{% set mesh_min_x = print_min_x - buffer %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if print_min_y - buffer >= mesh_min_y %}
|
||||||
|
{% set mesh_min_y = print_min_y - buffer %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if print_max_x + buffer <= mesh_max_x %}
|
||||||
|
{% set mesh_max_x = print_max_x + buffer %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if print_max_y + buffer <= mesh_max_y %}
|
||||||
|
{% set mesh_max_y = print_max_y + buffer %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{ action_respond_info("mesh_min: %s,%s" % (mesh_min_x, mesh_min_y)) }
|
||||||
|
{ action_respond_info("mesh_max: %s,%s" % (mesh_max_x, mesh_max_y)) }
|
||||||
|
{ action_respond_info("probe_count: %s,%s" % (probe_count_x,probe_count_y)) }
|
||||||
|
|
||||||
|
; Set variables so they're available outside of macro
|
||||||
|
SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=last_area_start_x VALUE={print_min_x}
|
||||||
|
SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=last_area_start_y VALUE={print_min_y}
|
||||||
|
SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=last_area_end_x VALUE={print_max_x}
|
||||||
|
SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=last_area_end_y VALUE={print_max_y}
|
||||||
|
|
||||||
|
{% if printer["gcode_macro status_meshing"] != null %}
|
||||||
|
status_meshing
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if relative_reference_index == 0 or relative_reference_index == null %}
|
||||||
|
_BED_MESH_CALIBRATE mesh_min={mesh_min_x},{mesh_min_y} mesh_max={mesh_max_x},{mesh_max_y} probe_count={probe_count_x},{probe_count_y}
|
||||||
|
{% else %}
|
||||||
|
{% set relative_reference_index = ((probe_count_x * probe_count_y - 1) / 2)|int %}
|
||||||
|
{ action_respond_info("relative_reference_index: %s" % relative_reference_index) }
|
||||||
|
_BED_MESH_CALIBRATE mesh_min={mesh_min_x},{mesh_min_y} mesh_max={mesh_max_x},{mesh_max_y} probe_count={probe_count_x},{probe_count_y} relative_reference_index={relative_reference_index}
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{% if printer["gcode_macro status_meshing"] != null %}
|
||||||
|
status_meshing
|
||||||
|
{% endif %}
|
||||||
|
_BED_MESH_CALIBRATE
|
||||||
|
{% endif %}
|
||||||
|
{% if klicky_available %}
|
||||||
|
Dock_Probe
|
||||||
|
{% elif euclid_available %}
|
||||||
|
STOW_PROBE
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{ action_respond_info("No need to recreate Bed Mesh since it's same as current mesh or smaller") }
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{% if klicky_available %}
|
||||||
|
_CheckProbe action=query
|
||||||
|
Attach_Probe
|
||||||
|
{% elif euclid_available %}
|
||||||
|
STOW_PROBE
|
||||||
|
{% endif %}
|
||||||
|
{% if printer["gcode_macro status_meshing"] != null %}
|
||||||
|
status_meshing
|
||||||
|
{% endif %}
|
||||||
|
_BED_MESH_CALIBRATE
|
||||||
|
{% if klicky_available %}
|
||||||
|
Dock_Probe
|
||||||
|
{% endif %}
|
||||||
|
{% if euclid_available %}
|
||||||
|
STOW_PROBE
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% if printer["gcode_macro status_ready"] != null %}
|
||||||
|
status_ready
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#[include print_area_bed_mesh.cfg]
|
||||||
|
[include mainsail.cfg]
|
||||||
|
[include hardware/hardware.cfg]
|
||||||
|
[include misc/misc.cfg]
|
||||||
|
[include macros/macros.cfg]
|
||||||
|
|
||||||
|
[printer]
|
||||||
|
max_velocity: 600
|
||||||
|
max_accel: 6500
|
||||||
|
kinematics: corexy
|
||||||
|
max_z_velocity: 30 #Max 15 for 12V TMC Drivers, can increase for 24V
|
||||||
|
max_z_accel: 350
|
||||||
|
square_corner_velocity: 5.0
|
||||||
|
|
||||||
|
[exclude_object]
|
|
@ -0,0 +1,39 @@
|
||||||
|
#[include print_area_bed_mesh.cfg]
|
||||||
|
[include mainsail.cfg]
|
||||||
|
[include hardware/hardware.cfg]
|
||||||
|
[include misc/misc.cfg]
|
||||||
|
[include macros/macros.cfg]
|
||||||
|
|
||||||
|
[printer]
|
||||||
|
max_velocity: 600
|
||||||
|
max_accel: 6500
|
||||||
|
kinematics: corexy
|
||||||
|
max_z_velocity: 30 #Max 15 for 12V TMC Drivers, can increase for 24V
|
||||||
|
max_z_accel: 350
|
||||||
|
square_corner_velocity: 5.0
|
||||||
|
|
||||||
|
[exclude_object]
|
||||||
|
|
||||||
|
#*# <---------------------- SAVE_CONFIG ---------------------->
|
||||||
|
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
|
||||||
|
#*#
|
||||||
|
#*# [bed_mesh default]
|
||||||
|
#*# version = 1
|
||||||
|
#*# points =
|
||||||
|
#*# 0.129938, 0.077438, 0.072438, 0.064938, 0.079938, 0.084938, 0.092438
|
||||||
|
#*# 0.074938, 0.042438, 0.032438, 0.029938, 0.032438, 0.059938, 0.079938
|
||||||
|
#*# 0.024938, 0.012438, -0.015062, -0.007562, -0.000062, 0.022438, 0.032438
|
||||||
|
#*# 0.014938, -0.000062, -0.015062, -0.020062, 0.007438, 0.027438, 0.047438
|
||||||
|
#*# 0.044938, 0.029938, -0.012562, -0.002562, 0.009938, 0.024938, 0.039938
|
||||||
|
#*# 0.089938, 0.049938, 0.012438, 0.019938, 0.029938, 0.032438, 0.064938
|
||||||
|
#*# 0.152438, 0.109938, 0.074938, 0.069938, 0.069938, 0.069938, 0.079938
|
||||||
|
#*# x_count = 7
|
||||||
|
#*# y_count = 7
|
||||||
|
#*# mesh_x_pps = 2
|
||||||
|
#*# mesh_y_pps = 2
|
||||||
|
#*# algo = bicubic
|
||||||
|
#*# tension = 0.2
|
||||||
|
#*# min_x = 20.0
|
||||||
|
#*# max_x = 320.0
|
||||||
|
#*# min_y = 20.0
|
||||||
|
#*# max_y = 320.0
|
|
@ -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
|
|
@ -0,0 +1,427 @@
|
||||||
|
# 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.15
|
||||||
|
#
|
||||||
|
|
||||||
|
##### 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
|
||||||
|
##
|
||||||
|
## check_time: time when the status of the taken picture is checked. Default 0.5 sec
|
||||||
|
##
|
||||||
|
## 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_check_time: 0.5
|
||||||
|
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={check_time}
|
||||||
|
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={tl.check_time}
|
||||||
|
{% 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 %}
|
Loading…
Reference in New Issue