diff --git a/config/Adaptive_Mesh.cfg b/config/Adaptive_Mesh.cfg new file mode 100644 index 0000000..b3e994b --- /dev/null +++ b/config/Adaptive_Mesh.cfg @@ -0,0 +1,225 @@ +# # # Klipper Adaptive Meshing # # # + +# Heads up! If you have any other BED_MESH_CALIBRATE macros defined elsewhere in your config, you will need to comment out / remove them for this to work. (Klicky/Euclid Probe) +# You will also need to be sure that [exclude_object] is defined in printer.cfg, and your slicer is labeling objects. +# This macro will parse information from objects in your gcode to define a min and max mesh area to probe, creating an adaptive mesh! +# This macro will not increase probe_count values in your [bed_mesh] config. If you want richer meshes, be sure to increase probe_count. We recommend at least 5,5. + +[gcode_macro BED_MESH_CALIBRATE] +rename_existing: _BED_MESH_CALIBRATE + +### This section allows control of status LEDs your printer may have. + +variable_led_enable: False # Enables/disables the use of status LEDs in this macro. +variable_status_macro: 'status_meshing' # If you have status LEDs in your printer (StealthBurner), you can use the macro that changes their status here. + +### This section configures mesh point fuzzing, which allows probe points to be varied slightly if printing multiples of the same G-code file. + +variable_fuzz_enable: False # Enables/disables the use of mesh point fuzzing to slightly randomize probing points to spread out wear on a build surface, default is False. +variable_fuzz_min: 0 # If enabled, the minimum amount in mm a probe point can be randomized, default is 0. +variable_fuzz_max: 4 # If enabled, the maximum amount in mm a probe point can be randomized, default is 4. + +### This section is for configuring a mesh margin, which allows the probed mesh to be expanded outwards from the print area. + +variable_margin_enable: False # Enables/disables adding a margin to the meshed area to pad a mesh out for specific needs, default is False. +variable_margin_size: 5 # Size in millimeters to expand the mesh outwards from the print area in all directions. + +### This section is for those using a dockable probe that is stored outside of the print area. ### + +variable_probe_dock_enable: False # Enables/disables the use of a dockable probe that is stored outside of the print area, default is False. +variable_attach_macro: 'Attach_Probe' # Here is where you define the macro that ATTACHES the probe to the printhead. E.g. 'Attach_Probe' +variable_detach_macro: 'Dock_Probe' # Here is where you define the macro that DETACHES the probe from the printhead. E.g. 'Dock_Probe' + +### This section is for those who are using Moonraker's Update Manager for KAMP, or want a more verbose macro. ### + +variable_display_parameters: True # Display macro paramters in the console, useful for debugging the SETUP_KAMP_MESHING call, or more verbosity. + +gcode: + + {% if display_parameters == True %} + { action_respond_info("led_enable : %d" % (led_enable)) } + { action_respond_info("status_macro: \'%s\'" % (status_macro)) } + { action_respond_info("fuzz_enable : %d" % (fuzz_enable)) } + { action_respond_info("fuzz_min : %f" % (fuzz_min)) } + { action_respond_info("fuzz_max : %f" % (fuzz_max)) } + { action_respond_info("probe_dock_enable: %d" % (probe_dock_enable)) } + { action_respond_info("attach_macro: \'%s\'" % (attach_macro)) } + { action_respond_info("detach_macro: \'%s\'" % (detach_macro)) } + {% endif %} + + {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} + {% set bed_mesh_min = printer.configfile.settings.bed_mesh.mesh_min %} + {% set bed_mesh_max = printer.configfile.settings.bed_mesh.mesh_max %} + {% set probe_count = printer.configfile.settings.bed_mesh.probe_count %} + {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} + {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} + {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} + {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} + {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} + {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} + {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} + + {% if margin_enable == False %} + {% set margin_size = 0 %} + {% endif %} + + { action_respond_info("{} object points, clamping to bed mesh [{!r} {!r}]".format( + all_points | count, + bed_mesh_min, + bed_mesh_max, + )) } + + {% if fuzz_enable == True %} + {% set fuzz_range = range((fuzz_min * 100) | int, (fuzz_max * 100) | int + 1) %} + {% set x_min = (bed_mesh_min[0] + fuzz_max - margin_size, x_min) | max - (fuzz_range | random / 100.0) %} + {% set y_min = (bed_mesh_min[1] + fuzz_max - margin_size, y_min) | max - (fuzz_range | random / 100.0) %} + {% set x_max = (bed_mesh_max[0] - fuzz_max + margin_size, x_max) | min + (fuzz_range | random / 100.0) %} + {% set y_max = (bed_mesh_max[1] - fuzz_max + margin_size, y_max) | min + (fuzz_range | random / 100.0) %} + {% else %} + {% set x_min = [ bed_mesh_min[0], x_min - margin_size ] | max %} + {% set y_min = [ bed_mesh_min[1], y_min - margin_size ] | max %} + {% set x_max = [ bed_mesh_max[0], x_max + margin_size ] | min %} + {% set y_max = [ bed_mesh_max[1], y_max + margin_size ] | min %} + {% endif %} + + { action_respond_info("Object bounds, clamped to the bed_mesh: {!r}, {!r}".format( + (x_min, y_min), + (x_max, y_max), + )) } + + {% set points_x = (((x_max - x_min) / max_probe_point_distance_x) | round(method='ceil') | int) + 1 %} + {% set points_y = (((y_max - y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} + + {% if params.PROFILE is defined %} + {% set PROFILE2 =params.PROFILE %} + {% else %} + {% set PROFILE2 ="default" %} + {% endif %} + + {% if (([points_x, points_y]|max) > 4) %} + {% set algorithm = "bicubic" %} + {% set min_points = 4 %} + {% else %} + {% set algorithm = "lagrange" %} + {% set min_points = 3 %} + {% endif %} + { action_respond_info( "Algorithm: {}".format(algorithm)) } + + {% set points_x = [points_x, min_points]|max %} + {% set points_y = [points_y, min_points]|max %} + { action_respond_info( "Points: x: {}, y: {}".format(points_x, points_y) ) } + + {% if printer.configfile.settings.bed_mesh.relative_reference_index is defined %} + {% set ref_index = (points_x * points_y / 2) | int %} + { action_respond_info( "Reference index: {}".format(ref_index) ) } + {% else %} + {% set ref_index = -1 %} + {% endif %} + + {% if probe_dock_enable == True %} + {attach_macro} # Attach/deploy a probe if the probe is stored somewhere outside of the print area + {% endif %} + + {% if led_enable == True %} + {status_macro} # Set status LEDs + {% endif %} + + _BED_MESH_CALIBRATE mesh_min={x_min},{y_min} mesh_max={x_max},{y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} RELATIVE_REFERENCE_INDEX={ref_index} PROFILE={params.PROFILE|default("default")} + + {% if probe_dock_enable == True %} + {detach_macro} # Detach/stow a probe if the probe is stored somewhere outside of the print area + {% endif %} + +[gcode_macro SETUP_KAMP_MESHING] +gcode: + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=led_enable VALUE={params.LED_ENABLE|default(False)|int} + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=status_macro VALUE='"{params.STATUS_MACRO|default('status_meshing')|string}"' + + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_enable VALUE={params.FUZZ_ENABLE|default(False)|int} + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_min VALUE={params.FUZZ_MIN|default(0)|float} + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=fuzz_max VALUE={params.FUZZ_MAX|default(4)|float} + + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=probe_dock_enable VALUE={params.PROBE_DOCK_ENABLE|default(False)|int} + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=attach_macro VALUE='"{params.ATTACH_MACRO|default('Attach_Probe')|string}"' + SET_GCODE_VARIABLE MACRO=BED_MESH_CALIBRATE VARIABLE=detach_macro VALUE='"{params.DETACH_MACRO|default('Dock_Probe')|string}"' + + + +# # # Klipper Adaptive Purging - Line # # # + +# This macro will parse information from objects in your gcode and create a nearby purge! +# For successful purging, you may need to configure: +# +# [extruder] +# ... +# max_extrude_cross_section: 5 + +[gcode_macro LINE_PURGE] +description: A purge macro that adapts to be near your actual printed objects + +variable_adaptive_enable: True # Change to False if you'd like the purge to be in the same spot every print +variable_z_height: 0.4 # Height above the bed to purge +variable_purge_amount: 40 # Amount of filament in millimeters to purge +variable_line_length: 50 # Overall desired length of purge line in millimeters, around 1/5th of X axis length is a good starting value +variable_flow_rate: 12 # Desired flow rate in mm3/s (Around 12 for standard flow hotends, around 24 for high flow hotends) +variable_x_default: 10 # Default X location to purge. If adaptive_enable is True, this is overwritten +variable_y_default: 10 # Default Y location to purge. If adaptive_enable is True, this is overwritten +variable_distance_to_object_y: 10 # Y distance in millimeters away from the print area for purging. Must be less than or equal to y_default if adaptive_enable is False + +### This section is for those who are using Moonraker's Update Manager for KAMP, or want a more verbose macro. ### + +variable_display_parameters: True # Display macro paramters in the console, useful for debugging the SETUP_LINE_PURGE call, or more verbosity. + +gcode: + + {% if display_parameters == True %} + { action_respond_info("adaptive_enable : %d" % (adaptive_enable)) } + { action_respond_info("z_height : %f" % (z_height)) } + { action_respond_info("purge_amount : %f" % (purge_amount)) } + { action_respond_info("line_length : %f" % (line_length)) } + { action_respond_info("flow_rate : %f" % (flow_rate)) } + { action_respond_info("x_default : %f" % (x_default)) } + { action_respond_info("y_default : %f" % (y_default)) } + { action_respond_info("distance_to_object_y : %f" % (distance_to_object_y)) } + {% endif %} + + {% if adaptive_enable == True %} + {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} + {% set x_origin = (all_points | map(attribute=0) | min | default(x_default)) %} + {% set y_origin = (all_points | map(attribute=1) | min | default(y_default)) %} + {% set x_origin = ([x_origin, 0] | max) %} + {% set y_origin = ([y_origin, 0] | max) %} + {% else %} + {% set x_origin = x_default | float %} + {% set y_origin = y_default | float %} + {% endif %} + {% set nozzle_dia = printer.configfile.config.extruder.nozzle_diameter | float %} + {% set cross_section = nozzle_dia * z_height | float %} + {% set purge_move_speed = (cross_section * flow_rate) * 60 | float %} + {% set travel_speed = (printer.toolhead.max_velocity) * 30 | float %} + + G92 E0 # Reset extruder + G0 F{travel_speed} # Set travel speed + G90 # Absolute positioning + G0 X{x_origin} Y{y_origin - distance_to_object_y} # Move to purge position + G0 Z{z_height} # Move to purge Z height + M83 # Relative extrusion mode + G1 X{x_origin + line_length} E{purge_amount} F{purge_move_speed} # Purge line + G1 E-.5 F2100 # Retract + G92 E0 # Reset extruder distance + M82 # Absolute extrusion mode + G0 Z{z_height * 2} F{travel_speed} # Z hop + +[gcode_macro SETUP_LINE_PURGE] +gcode: + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=display_parameters VALUE={params.DISPLAY_PARAMETERS|default(True)|int} + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=adaptive_enable VALUE={params.ADAPTIVE_ENABLE|default(True)|int} + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=z_height VALUE={params.Z_HEIGHT|default(0.4)|float} + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=purge_amount VALUE={params.PURGE_AMOUNT|default(40)|float} + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=line_length VALUE={params.LINE_LENGTH|default(50)|float} + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=flow_rate VALUE={params.FLOW_RATE|default(12)|float} + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=x_default VALUE={params.X_DEFAULT|default(10)|float} + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=y_default VALUE={params.Y_DEFAULT|default(10)|float} + SET_GCODE_VARIABLE MACRO=LINE_PURGE VARIABLE=distance_to_object_y VALUE={params.DISTANCE_TO_OBJECT_Y|default(10)|float} + diff --git a/config/gcode_macro.cfg b/config/gcode_macro.cfg index eedb10a..37872d2 100644 --- a/config/gcode_macro.cfg +++ b/config/gcode_macro.cfg @@ -1,8 +1,13 @@ # Q1_Pro # V4.4.16 2024-3-14 -# modify: variable change M106 & M141 & M107 +# update: variable change M106 & M141 & M107 # V4.4.16 2024-3-26 -# modify: variable change [homing_override]->add M204 S10000 +# update: variable change [homing_override]->add M204 S10000 +# V4.4.20 2024-6-17 +# update: Z_DOUDONG CLEAR_NOZZLE get_zoffset rewrite +# move_subzoffset added +# V4.4.21 2024-6-22 +# update: Enable chamber exhaust fan by default when chamber temp not set [gcode_macro test_zoffset] gcode: @@ -11,18 +16,30 @@ gcode: G1 X{120 - printer.probe["x_offset"]} Y{120 - printer.probe["y_offset"]} F9000 G1 Z10 F600 probe + M400 + G4 P5000 G1 Z10 F600 +[gcode_macro move_subzoffset] +gcode: + + G1 Z{printer.probe.last_z_result} F600 + [gcode_macro get_zoffset] gcode: G1 Z10 F600 Z_DOUDONG - G4 P500 + ;G4 P500 QIDI_PROBE_PIN_1 - probe probe_speed=10 samples=3 - SET_KINEMATIC_POSITION Z=-0.1 + M204 S30 + G4 P500 + probe probe_speed=5 lift_speed=5 samples=5 sample_retract_dist=5 + move_subzoffset + M114 + SET_KINEMATIC_POSITION Z=-0.07 G1 Z30 F600 QIDI_PROBE_PIN_2 + M204 S10000 [gcode_macro save_zoffset] gcode: @@ -46,8 +63,9 @@ gcode: G1 Z5 F900 G90 {% endif %} - G1 X97 F9000 - G1 Y254 F9000 + G1 X97 F15000 + G1 Y243 F15000 + G1 Y254 F800 M109 S{hotendtemp} @@ -55,22 +73,20 @@ gcode: G1 E80 F400 M106 S255 - G1 X98 F500 + G1 X97 F500 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 - G1 Y240 F9000 - - + G1 X97 F2000 + G1 Y240 F800 [gcode_macro CLEAR_NOZZLE] gcode: @@ -82,8 +98,9 @@ gcode: G1 Z5 F900 G90 {% endif %} - G1 X97 F9000 - G1 Y254 F9000 + G1 X97 F15000 + G1 Y243 F15000 + G1 Y254 F800 M109 S{hotendtemp} @@ -93,56 +110,45 @@ gcode: M400 M106 P2 S0 M104 S0 - TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={hotendtemp-30} + TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={hotendtemp-20} G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 - G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 + G1 X65 F500 + G1 X88 F500 + G1 X65 F500 + G1 X88 F500 G1 X65 F500 G1 X88 F500 G1 X65 F500 G1 X88 F500 G1 X65 F500 - - G1 Y249 F500 - G1 Y254 F500 - G1 Y249 F500 - G1 Y254 F500 - G1 Y249 F500 - G1 Y253.5 F500 - - G1 X88 F500 - G1 X65 F500 - G1 X88 F500 - G1 X65 F500 - G1 X85 F500 - - G1 X98 F500 + G1 X97 F500 + G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 G1 X85 F2000 - G1 X98 F2000 - G1 X85 F2000 - G1 X98 F2000 + G1 X97 F2000 + M400 M118 Nozzle cleared - G1 Y120 F9000 - G1 X230 F9000 + G1 Y240 F800 + G1 Y120 F15000 + G1 X230 F15000 TEMPERATURE_WAIT SENSOR=extruder MAXIMUM=140 M107 M106 P2 S0 @@ -157,6 +163,9 @@ gcode: {% set hotendtemp = params.HOTEND|int %} {% set chambertemp = params.CHAMBER|default(0)|int %} set_zoffset + {% if chambertemp == 0 %} + M106 P3 S255 + {% endif %} M104 S0 M140 S{bedtemp} M141 S{chambertemp} @@ -188,7 +197,6 @@ gcode: SET_FILAMENT_SENSOR SENSOR=fila ENABLE=0 DISABLE_FILAMENT_WIDTH_SENSOR - [gcode_macro AUTOTUNE_SHAPERS] variable_autotune_shapers: 'ei' gcode: @@ -212,19 +220,13 @@ gcode: M118 No: CLEAR_LAST_FILE {% endif %} -[delayed_gcode KINEMATIC_POSITION] +[delayed_gcode PRINTER_INIT] initial_duration:0.2 gcode: SET_STEPPER_ENABLE STEPPER=stepper_z enable=1 SET_STEPPER_ENABLE STEPPER=stepper_z1 enable=1 BED_MESH_CLEAR SET_FILAMENT_SENSOR SENSOR=fila ENABLE=0 - # {% set was_interrupted = printer.save_variables.variables.was_interrupted %} - # {% if was_interrupted %} - # M118 Detected unexpected interruption during the last print. Do you want to resume printing? (Do not move the extruder before resuming.) - # M118 Yes: RESUME_INTERRUPTED - # M118 No: CLEAR_LAST_FILE - # {% endif %} [homing_override] axes:xyz @@ -234,6 +236,7 @@ gcode: {% set RUN_CUR = driver_config.run_current %} {% set HOLD_CUR = driver_config.hold_current %} M204 S10000 + M220 S100 {% if params.X is defined %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={HOME_CUR * 0.7} G28 X @@ -343,9 +346,6 @@ gcode: CLEAR_LAST_FILE BEEP I=2 DUR=500 - - - [gcode_macro CANCEL_PRINT] rename_existing: BASE_CANCEL_PRINT gcode: @@ -417,7 +417,6 @@ gcode: SET_STEPPER_ENABLE STEPPER=extruder enable=0 {% endif %} - [gcode_macro RESUME] rename_existing: BASE_RESUME variable_zhop: 0 @@ -459,8 +458,6 @@ gcode: SET_FILAMENT_SENSOR SENSOR=fila ENABLE=1 ; enable filament sensor {% endif %} - - [gcode_macro BEEP] gcode: {% set i = params.I|default(1)|int %} ; Iterations (number of times to beep). @@ -607,8 +604,6 @@ gcode: [gcode_macro M4028] gcode: - G28 -# Z_TILT_ADJUST G28 get_zoffset M400 @@ -623,16 +618,12 @@ gcode: M118 Position init complete CLEAR_NOZZLE HOTEND=240 -# Z_TILT_ADJUST + G28 get_zoffset [gcode_macro M4030] gcode: - REVERSE_HOMING - G91 - G1 Z-30 - G90 BED_MESH_CLEAR SET_GCODE_OFFSET Z=0 MOVE=0 G28 @@ -640,8 +631,28 @@ gcode: G1 X120 Y120 F9000 G1 Z0 F600 +[gcode_macro M4031] +gcode: + SET_TMC_CURRENT STEPPER=stepper_z CURRENT={printer.configfile.settings['tmc2209 stepper_z'].run_current * 0.8 } + SET_TMC_CURRENT STEPPER=stepper_z1 CURRENT={printer.configfile.settings['tmc2209 stepper_z1'].run_current * 0.8 } + REVERSE_HOMING + SET_TMC_CURRENT STEPPER=stepper_z CURRENT={printer.configfile.settings['tmc2209 stepper_z'].run_current} + SET_TMC_CURRENT STEPPER=stepper_z1 CURRENT={printer.configfile.settings['tmc2209 stepper_z1'].run_current} + G91 + G1 Z-30 F600 + G90 + + SET_TMC_CURRENT STEPPER=stepper_z CURRENT={printer.configfile.settings['tmc2209 stepper_z'].run_current * 0.8 } + SET_TMC_CURRENT STEPPER=stepper_z1 CURRENT={printer.configfile.settings['tmc2209 stepper_z1'].run_current * 0.8 } + REVERSE_HOMING + SET_TMC_CURRENT STEPPER=stepper_z CURRENT={printer.configfile.settings['tmc2209 stepper_z'].run_current} + SET_TMC_CURRENT STEPPER=stepper_z1 CURRENT={printer.configfile.settings['tmc2209 stepper_z1'].run_current} + G91 + G1 Z-30 F600 + G90 + [gcode_macro M603] -description: filament unlode +description: unload filament gcode: M118 Heat up complete G92 E0 @@ -653,6 +664,7 @@ gcode: M118 Unload finish [gcode_macro M604] +description: load filament gcode: M118 Heat up complete M83 @@ -744,126 +756,19 @@ gcode: [gcode_macro Z_DOUDONG] gcode: - m204 S5000 - G91 - G1 X2 F6000 - G1 X-2 F6000 - G1 X2 F6000 - G1 X-2 F6000 - G1 X2 F6000 - G1 X-2 F6000 - G1 X2 F6000 - G1 X-2 F6000 - G1 X2 F6000 - G1 X-2 F6000 - G1 X2 F6000 - G1 X-2 F6000 - - G1 Y2 F6000 - G1 Y-2 F6000 - G1 Y2 F6000 - G1 Y-2 F6000 - G1 Y2 F6000 - G1 Y-2 F6000 - G1 Y2 F6000 - G1 Y-2 F6000 - G1 Y2 F6000 - G1 Y-2 F6000 - G1 Y2 F6000 - G1 Y-2 F6000 - G1 Y2 F6000 - G1 Y-2 F6000 - - G90 - m204 S5000 - SET_Z_VELOCITY_LIMIT VALUE=15 - SET_PIN PIN=ctlyd VALUE=1 - G91 - G1 Z1 F900 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 + M204 S30 G90 + G0 Z1 + G91 + G4 P3000 + SET_PIN PIN=ctlyd VALUE=1 + {% for z in range(1,7) %} + G1 Z10 F900 + G1 Z-10 F900 + {% endfor %} SET_PIN PIN=ctlyd VALUE=0 - SET_Z_VELOCITY_LIMIT VALUE=10 - G4 P500 + G4 P1000 + G1 Z4 + G90 +# M204 S10000 + diff --git a/config/plr.cfg b/config/plr.cfg new file mode 100644 index 0000000..f89665a --- /dev/null +++ b/config/plr.cfg @@ -0,0 +1,66 @@ +[gcode_shell_command POWER_LOSS_RESUME] +command: bash /home/mks/scripts/plr/plr.sh +timeout: 120 + +[gcode_shell_command UPDATE_GCODE_LINES] +command: bash /home/mks/scripts/plr/update_gcode_lines.sh + +[gcode_macro save_last_file] +gcode: + {% set svv = printer.save_variables.variables %} + {% set filepath=printer.virtual_sdcard.file_path %} + {% set filename=filepath.split('/')%} + SAVE_VARIABLE VARIABLE=was_interrupted VALUE=True + SAVE_VARIABLE VARIABLE=print_temp VALUE={printer.extruder.target} + SAVE_VARIABLE VARIABLE=bed_temp VALUE={printer['heater_bed'].target} + {% if printer["heater_generic chamber"] is defined %} + SAVE_VARIABLE VARIABLE=hot_temp VALUE={printer['heater_generic chamber'].target} + {% else %} + SAVE_VARIABLE VARIABLE=hot_temp VALUE=0 + {% endif %} + M118 Last File: { filename[-1] } + M117 Last File: { filename[-1] } + G4 P2000 + +[gcode_macro CLEAR_LAST_FILE] +gcode: + {% set filename='' %} + SAVE_VARIABLE VARIABLE=last_file VALUE='"{ filename }"' + SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False + +[gcode_macro LOG_Z] +gcode: + {% set z_pos = printer.gcode_move.gcode_position.z %} + RESPOND MSG="Current Z is {z_pos}" + SAVE_VARIABLE VARIABLE=power_resume_z VALUE={z_pos} + +[gcode_macro RESUME_INTERRUPTED] +gcode: + set_zoffset + RUN_SHELL_COMMAND CMD=UPDATE_GCODE_LINES + {% set profile_name = params.PROFILE_NAME|default(printer.save_variables.variables.profile_name)|string %} + # {% set g_lines = params.GCODE_LINES|default(printer.save_variables.variables.gcode_lines)|string %} + # {% set last_file = params.GCODE_FILE|default(printer.save_variables.variables.last_file)|string %} + # {% set print_temp = params.PRINT_TEMP|default(printer.save_variables.variables.print_temp)|float %} + # {% set bed_temp = params.BED_TEMP|default(printer.save_variables.variables.bed_temp)|float %} + # {% set hot_temp = params.HOT_TEMP|default(printer.save_variables.variables.hot_temp)|float %} + # {% set filepath = params.FILE_PATH|default(printer.save_variables.variables.file_path)|string %} + BED_MESH_PROFILE LOAD={profile_name} + RUN_SHELL_COMMAND CMD=POWER_LOSS_RESUME + SDCARD_PRINT_FILE FILENAME=/.plr/plr.gcode + + +# [gcode_macro RESUME_INTERRUPTED] +# gcode: +# set_zoffset +# {% set profile_name = params.PROFILE_NAME|default(printer.save_variables.variables.profile_name)|string %} +# {% set z_height = params.Z_HEIGHT|default(printer.save_variables.variables.power_resume_z)|float %} +# {% set last_file = params.GCODE_FILE|default(printer.save_variables.variables.last_file)|string %} +# {% set print_temp = params.PRINT_TEMP|default(printer.save_variables.variables.print_temp)|float %} +# {% set bed_temp = params.BED_TEMP|default(printer.save_variables.variables.bed_temp)|float %} +# {% set hot_temp = params.HOT_TEMP|default(printer.save_variables.variables.hot_temp)|float %} +# {% set filepath = params.FILE_PATH|default(printer.save_variables.variables.file_path)|string %} +# BED_MESH_PROFILE LOAD={profile_name} +# RUN_SHELL_COMMAND CMD=POWER_LOSS_RESUME PARAMS="{z_height} {last_file} {print_temp} {bed_temp} {hot_temp} {filepath}" +# SDCARD_PRINT_FILE FILENAME=/.plr/plr.gcode + diff --git a/config/printer.cfg b/config/printer.cfg index 82ff99f..72f7c03 100644 --- a/config/printer.cfg +++ b/config/printer.cfg @@ -1,17 +1,25 @@ # Q1_Pro # V4.4.14 2024-3-14 -# modify: heater_generic hot -> chamber +# update: heater_generic hot -> chamber # out_put_pin fan0 -> fan_generic cooling_fan # out_put_pin fan2 -> fan_generic auxiliary_cooling_fan # out_put_pin fan3 -> fan_generic chamber_circulation_fan # heater_fan hot -> heater_fan chamber # verify_heater hot -> verify_heater chamber # V4.4.17 2024-3-29 -# modify: delete comments +# update: delete comments # add time_update macro # [bed_mesh] 6,6 ->8,8 -#V4.4.19 2024-4-16 -# modify: add [chamber_fan chamber_fan] +# V4.4.19 2024-4-16 +# update: add [chamber_fan chamber_fan] +# V4.4.20 2024-6-17 +# update: [smart_effector] +# samples_result: average -> submaxmin +# speed: 10 -> 5 +# sample_retract_dist: 3.0 -> 5.0 +# [stepper_x] +# position_max: 245 -> 246 + [include timelapse.cfg] [include Adaptive_Mesh.cfg] [include gcode_macro.cfg] @@ -77,7 +85,6 @@ min_diameter: 0.3 use_current_dia_while_delay: False pause_on_runout:True runout_gcode: - pause RESET_FILAMENT_WIDTH_SENSOR M118 Filament run out event_delay: 3.0 @@ -152,7 +159,7 @@ full_steps_per_rotation:200 #set to 400 for 0.9 degree stepper endstop_pin:tmc2240_stepper_x:virtual_endstop position_min: -5.5 position_endstop: -5.5 -position_max:245 +position_max:246 homing_speed:50 homing_retract_dist:0 homing_positive_dir:False @@ -252,7 +259,7 @@ run_current: 0.6 interpolate: True stealthchop_threshold: 9999999999 diag_pin:^U_1:PC12 -driver_SGTHRS:140 +driver_SGTHRS:130 [tmc2209 stepper_z1] uart_pin:U_1: PB7 @@ -261,7 +268,7 @@ run_current: 0.6 interpolate: True stealthchop_threshold: 9999999999 diag_pin:^U_1:PA13 -driver_SGTHRS:140 +driver_SGTHRS:130 [heater_bed] heater_pin: U_1:PB10 @@ -360,7 +367,7 @@ max_power:1.0 shutdown_speed:1.0 cycle_time:0.01 fan_speed: 0.6 -stepper:stepper_z,stepper_z1 +stepper:stepper_x,stepper_y [fan_generic cooling_fan] pin:gpio2 @@ -395,11 +402,12 @@ recovery_time:0 x_offset: 17.6 y_offset: 4.4 z_offset: 0.000001 -speed:10 +speed:5 +lift_speed:5 probe_accel:50 samples: 2 -samples_result: average -sample_retract_dist: 3.0 +samples_result: submaxmin +sample_retract_dist: 5.0 samples_tolerance: 0.05 samples_tolerance_retries:5 @@ -417,105 +425,12 @@ algorithm:bicubic bicubic_tension:0.2 mesh_pps: 2, 2 vibrate_gcode: - G90 - m204 S5000 - SET_Z_VELOCITY_LIMIT VALUE=15 - SET_PIN PIN=ctlyd VALUE=1 - G4 P500 - G91 - G1 Z1 F900 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G1 Z1 - G1 Z-1 - G90 - SET_PIN PIN=ctlyd VALUE=0 - SET_Z_VELOCITY_LIMIT VALUE=10 - G4 P500 + Z_DOUDONG [filament_switch_sensor fila] pause_on_runout: True runout_gcode: - PAUSE + M118 Filament tangle detected event_delay: 3.0 pause_delay: 0.5 switch_pin:U_1:PC3 diff --git a/config/saved_variables.cfg b/config/saved_variables.cfg new file mode 100644 index 0000000..3d441c1 --- /dev/null +++ b/config/saved_variables.cfg @@ -0,0 +1,11 @@ +[Variables] +bed_temp = 60.0 +filepath = '' +hot_temp = 0.0 +last_file = '' +power_resume_z = 0.0 +print_temp = 210.0 +profile_name = 'kamp' +was_interrupted = False +z_offset = 0.0 + diff --git a/config/timelapse.cfg b/config/timelapse.cfg new file mode 100644 index 0000000..e4036b4 --- /dev/null +++ b/config/timelapse.cfg @@ -0,0 +1,424 @@ +# Timelapse klipper macro definition +# +# Copyright (C) 2021 Christoph Frei +# Copyright (C) 2021 Alex Zellner +# +# This file may be distributed under the terms of the GNU GPLv3 license +# +# Macro version 1.14 +# + +##### DO NOT CHANGE ANY MACRO!!! ##### + +########################################################################## +# # +# GET_TIMELAPSE_SETUP: Print the Timelapse setup to console # +# # +########################################################################## + +[gcode_macro GET_TIMELAPSE_SETUP] +description: Print the Timelapse setup +gcode: + {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} + {% set output_txt = ["Timelapse Setup:"] %} + {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} + {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} + {% if tl.park.enable %} + {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} + {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} + {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} + {% endif %} + {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} + {% if not tl.extruder.fw_retract %} + {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} + {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} + {% endif %} + {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} + {action_respond_info(output_txt|join("\n"))} + +################################################################################################ +# # +# Use _SET_TIMELAPSE_SETUP [ENABLE=value] [VERBOSE=value] [PARK_ENABLE=value] [PARK_POS=value] # +# [PARK_TIME=value] [CUSTOM_POS_X=value] [CUSTOM_POS_Y=value] # +# [CUSTOM_POS_DZ=value][TRAVEL_SPEED=value] [RETRACT_SPEED=value] # +# [EXTRUDE_SPEED=value] [EXTRUDE_DISTANCE=value] # +# [RETRACT_DISTANCE=value] [FW_RETRACT=value] # +# # +################################################################################################ + +[gcode_macro _SET_TIMELAPSE_SETUP] +description: Set user parameters for timelapse +gcode: + {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} + ##### get min and max bed size ##### + {% set min = printer.toolhead.axis_minimum %} + {% set max = printer.toolhead.axis_maximum %} + {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] + else False %} + {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), + 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, + 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), + 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, + 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), + 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} + ##### set new values ##### + {% if params.ENABLE %} + {% if params.ENABLE|lower is in ['true', 'false'] %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} + {% else %} + {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} + {% endif %} + {% endif %} + {% if params.VERBOSE %} + {% if params.VERBOSE|lower is in ['true', 'false'] %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} + {% else %} + {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} + {% endif %} + {% endif %} + {% if params.CUSTOM_POS_X %} + {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} + {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} + {% else %} + {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} + {% endif %} + {% endif %} + {% if params.CUSTOM_POS_Y %} + {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} + {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} + {% else %} + {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} + {% endif %} + {% endif %} + {% if params.CUSTOM_POS_DZ %} + {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} + {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} + {% else %} + {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} + {% endif %} + {% endif %} + {% if params.PARK_ENABLE %} + {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} + {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} + {% else %} + {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} + {% endif %} + {% endif %} + {% if params.PARK_POS %} + {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} + {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, + 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, + 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, + 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, + 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, + 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, + 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, + 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} + {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} + {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} + {% else %} + {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" + % params.PARK_POS|upper)} + {% endif %} + {% endif %} + {% if params.PARK_TIME %} + {% if params.PARK_TIME|float >= 0.0 %} + {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} + {% else %} + {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} + {% endif %} + {% endif %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" + {% if params.TRAVEL_SPEED %} + {% if params.TRAVEL_SPEED|float > 0.0 %} + {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} + {% else %} + {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} + {% endif %} + {% endif %} + {% if params.RETRACT_SPEED %} + {% if params.RETRACT_SPEED|float > 0.0 %} + {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} + {% else %} + {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} + {% endif %} + {% endif %} + {% if params.EXTRUDE_SPEED %} + {% if params.EXTRUDE_SPEED|float > 0.0 %} + {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} + {% else %} + {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} + {% endif %} + {% endif %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" + {% if params.EXTRUDE_DISTANCE %} + {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} + {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} + {% else %} + {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} + {% endif %} + {% endif %} + {% if params.RETRACT_DISTANCE %} + {% if params.RETRACT_DISTANCE|float >= 0.0 %} + {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} + {% else %} + {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} + {% endif %} + {% endif %} + {% if params.FW_RETRACT %} + {% if params.FW_RETRACT|lower is in ['true', 'false'] %} + {% if 'firmware_retraction' in printer.configfile.settings %} + {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} + {% else %} + {% set _dummy = tl.extruder.update({'fw_retract':False}) %} + {% if params.FW_RETRACT|capitalize == 'True' %} + {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} + {% endif %} + {% endif %} + {% else %} + {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} + {% endif %} + {% endif %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" + {% if printer.configfile.settings['gcode_macro pause'] is defined %} + {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} + {% endif %} + {% if printer.configfile.settings['gcode_macro resume'] is defined %} + {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} + {% endif %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" + +########################################################################## +# # +# TIMELAPSE_TAKE_FRAME: take the next picture # +# # +########################################################################## + +######################### definition ######################### +## enable: enable or disable the next frame. Valid inputs: [True, False] +## takingframe: internal use. Valid inputs: [True, False] +## +## park.enable: enable or disable to park the head while taking a picture. Valid inputs: [True, False] +## park.pos : used position for parking. Valid inputs: [center, front_left, front_right, back_left, back_right, custom, x_only, y_only] +## park.time : used for the debug macro. Time in s +## park.custom.x, park.custom.y: coordinates of the custom parkposition. Unit [mm] +## park.custom.dz : custom z hop for the picture. Unit [mm] +## park.coord : internal use +## +## extruder.fw_retract: enable disable fw retraction [True,False] +## extruder.extrude : filament extruded at the end of park. Unit [mm] +## extruder.retract : filament retract at the start of park. Unit [mm] +## +## speed.travel : used speed for travel from and to the park positon. Unit: [mm/min] +## speed.retract: used speed for retract [mm/min] +## speed.extrude: used speed for extrude [mm/min] +## +## verbose: Enable mesage output of TIMELAPSE_TAKE_FRAME +## +## restore.absolute.coordinates: internal use +## restore.absolute.extrude : internal use +## restore.speed : internal use +## restore.e : internal use +## restore.factor.speed : internal use +## restore.factor.extrude : internal use +## +## macro.pause : internal use +## macro.resume : internal use +## +## is_paused: internal use +############################################################### +[gcode_macro TIMELAPSE_TAKE_FRAME] +description: Take Timelapse shoot +variable_enable: False +variable_takingframe: False +variable_park: {'enable': False, + 'pos' : 'center', + 'time' : 0.1, + 'custom': {'x': 0, 'y': 0, 'dz': 0}, + 'coord' : {'x': 0, 'y': 0, 'dz': 0}} +variable_extruder: {'fw_retract': False, + 'retract': 1.0, + 'extrude': 1.0} +variable_speed: {'travel': 100, + 'retract': 15, + 'extrude': 15} +variable_verbose: True +variable_restore: {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} +variable_macro: {'pause': 'PAUSE', 'resume': 'RESUME'} +variable_is_paused: False +gcode: + {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} + {% if enable %} + {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or + (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} + {% if park.enable %} + {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', + 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', + 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} + {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, + 'extrude' : printer.gcode_move.absolute_extrude}, + 'speed' : printer.gcode_move.speed, + 'e' : printer.gcode_move.gcode_position.e, + 'factor' : {'speed' : printer.gcode_move.speed_factor, + 'extrude': printer.gcode_move.extrude_factor}} %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" + {% if not printer[printer.toolhead.extruder].can_extrude %} + {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} + {% else %} + {% if extruder.fw_retract %} + G10 + {% else %} + M83 ; insure relative extrusion + G0 E-{extruder.retract} F{speed.retract * 60} + {% endif %} + {% endif %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True + {macro.pause} ; execute the klipper PAUSE command + SET_GCODE_OFFSET X=0 Y=0 ; this will insure that the head parks always at the same position in a multi setup + G90 ; insure absolute move + {% if "xyz" not in printer.toolhead.homed_axes %} + {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} + {% else %} + G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} + {% endif %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True + UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 + M400 + {% endif %} + _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} + {% endif %} + {% else %} + {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} + {% endif %} + +[gcode_macro _TIMELAPSE_NEW_FRAME] +description: action call for timelapse shoot. must be a seperate macro +gcode: + {action_call_remote_method("timelapse_newframe", + macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, + hyperlapse=params.HYPERLAPSE)} + +[delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] +gcode: + {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} + {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} + {% if tl.takingframe %} + UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 + {% else %} + {tl.macro.resume} VELOCITY={tl.speed.travel} ; execute the klipper RESUME command + SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False + {% if not printer[printer.toolhead.extruder].can_extrude %} + {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} + {% else %} + {% if tl.extruder.fw_retract %} + G11 + {% else %} + G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} + G0 F{tl.restore.speed} + {% if tl.restore.absolute.extrude %} + M82 + G92 E{tl.restore.e} + {% endif %} + {% endif %} + {% endif %} + {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} + {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} + {% if not tl.restore.absolute.coordinates %} G91 {% endif %} + {% endif %} + +#################################################################################################### +# # +# HYPERLAPSE: Starts or stops a Hyperlapse video # +# Usage: HYPERLAPSE ACTION=START [CYCLE=time] starts a hyperlapse with cycle time (default 30 sec) # +# HYPERLAPSE ACTION=STOP stops the hyperlapse recording # +# # +#################################################################################################### + +######################### definition ######################### +## cycle: cycle time in seconds +## run: internal use [True/False] +############################################################### +[gcode_macro HYPERLAPSE] +description: Start/Stop a hyperlapse recording +variable_cycle: 0 +variable_run: False +gcode: + {% set cycle = params.CYCLE|default(30)|int %} + {% if params.ACTION and params.ACTION|lower == 'start' %} + {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} + SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True + SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} + UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} + TIMELAPSE_TAKE_FRAME HYPERLAPSE=True + {% elif params.ACTION and params.ACTION|lower == 'stop' %} + {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} + SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False + UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 + {% else %} + {action_raise_error("Hyperlapse: No valid input parameter + Use: + - HYPERLAPSE ACTION=START [CYCLE=time] + - HYPERLAPSE ACTION=STOP")} + {% endif %} + +[delayed_gcode _HYPERLAPSE_LOOP] +gcode: + UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} + TIMELAPSE_TAKE_FRAME HYPERLAPSE=True + +########################################################################## +# # +# TIMELAPSE_RENDER: Render the video at print end # +# # +########################################################################## + +######################### definition ######################### +## render: internal use. Valid inputs: [True, False] +## run_identifier: internal use. Valid input [0 .. 3] +############################################################### +[gcode_macro TIMELAPSE_RENDER] +description: Render Timelapse video and wait for the result +variable_render: False +variable_run_identifier: 0 +gcode: + {action_respond_info("Timelapse: Rendering started")} + {action_call_remote_method("timelapse_render", byrendermacro="True")} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True + {printer.configfile.settings['gcode_macro pause'].rename_existing} ; execute the klipper PAUSE command + UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 + +[delayed_gcode _WAIT_TIMELAPSE_RENDER] +gcode: + {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} + SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} + {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} + M117 Rendering {['-','\\','|','/'][ri]} + UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 + {% else %} + {action_respond_info("Timelapse: Rendering finished")} + M117 + {printer.configfile.settings['gcode_macro resume'].rename_existing} ; execute the klipper RESUME command + {% endif %} + +########################################################################## +# # +# TEST_STREAM_DELAY: Helper macro to find stream and park delay # +# # +########################################################################## + +[gcode_macro TEST_STREAM_DELAY] +description: Helper macro to find stream and park delay +gcode: + {% set min = printer.toolhead.axis_minimum %} + {% set max = printer.toolhead.axis_maximum %} + {% set act = printer.toolhead.position %} + {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} + {% if act.z > 5.0 %} + G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} + G0 X{(max.x-min.x)/2} + G4 P{tl.park.time|float * 1000} + _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE + G0 X{max.x - 5.0} + {% else %} + {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} + {% endif %} \ No newline at end of file