Skip to content

Instantly share code, notes, and snippets.

@NameOfTheDragon
Last active April 26, 2022 13:08
Show Gist options
  • Save NameOfTheDragon/21701f8a0f8122ef6e47180be005dcb1 to your computer and use it in GitHub Desktop.
Save NameOfTheDragon/21701f8a0f8122ef6e47180be005dcb1 to your computer and use it in GitHub Desktop.
A klipper macro to run Pressure Advance tuning in Klipper (with embedded test object). Originally by Jon Fox (see https://www.facebook.com/groups/klipper/posts/1395848650844501/) [Note: I'm not necessarily recommending this approach, this was just an experiment]
[gcode_macro PA_TUNER]
description: Pressure Advance Tuning with pre-sliced tuning tower
gcode:
# Set your own default parameters here
{% set filament_d = params.FILAMENT_DIAMETER|default(1.75)|float %}
{% set e_width = params.EXTRUSION_WIDTH|default(0.4)|float %}
{% set tool = params.TOOLHEAD|default("") %}
{% set rect_side_len = params.SIDE_LENGTH|default(100.0)|float %}
{% set layer_h = params.LAYER_HEIGHT|default(0.3)|float %}
{% set fspeed = params.FAST_PRINT_SPEED|default(150.0)|float %}
{% set sspeed = params.SLOW_PRINT_SPEED|default(30.0)|float %}
{% set fan_speed = params.COOLING_FAN_SPEED|default(255.0)|float %}
{% set PA_low = params.PA_MIN|default(0.0)|float %}
{% set PA_high = params.PA_MAX|default(0.2)|float %}
{% set b_temp = params.BED_TEMP|default(110)|float %}
{% set p_temp = params.PRINTING_TEMP|default(250)|float %}
{% set off_x = params.X_OFFSET|default(0.0)|float %}
{% set off_y = params.Y_OFFSET|default(0.0)|float %}
{% set layer_num = params.LAYERS|default(60)|int %}
# End default parameters
# Computed parameters
{% set bed_x = printer.toolhead.axis_maximum.x|float %}
{% set bed_y = printer.toolhead.axis_maximum.y|float %}
{% set PA_const = (2 * ((PA_high - PA_low) / layer_num)) - PA_low %}
{% if PA_const < 0 %}
{% set PA_sign = " + " %}
{% else %}
{% set PA_sign = " - " %}
{% endif %}
RESPOND MSG="Bed X Length: {bed_x}"
{% set info_str = "Bed Y Length: " ~ bed_y %}
RESPOND MSG="{info_str}"
{% set info_str = "Bed X Offset: " ~ off_x %}
RESPOND MSG="{info_str}"
{% set info_str = "Bed Y Offset: " ~ off_y %}
RESPOND MSG="{info_str}"
{% set info_str = "Extrusion Width: " ~ e_width %}
RESPOND MSG="{info_str}"
{% set info_str = "Filament size: " ~ filament_d %}
RESPOND MSG="{info_str}"
{% set info_str = "Layer Height: " ~ layer_h %}
RESPOND MSG="{info_str}"
{% set info_str = "Bed Temperature: " ~ b_temp %}
RESPOND MSG="{info_str}"
{% set info_str = "Print Temperature: " ~ p_temp %}
RESPOND MSG="{info_str}"
{% set info_str = "Slow Printing Speed: " ~ sspeed %}
RESPOND MSG="{info_str}"
{% set info_str = "Fast Printing Speed: " ~ fspeed %}
RESPOND MSG="{info_str}"
{% set info_str = "Fan Speed: " ~ fan_speed %}
RESPOND MSG="{info_str}"
{% set info_str = "Length of Test Square: " ~ rect_side_len %}
RESPOND MSG="{info_str}"
{% set info_str = "Number of Layers: " ~ layer_num %}
RESPOND MSG="{info_str}"
{% set info_str = "Minimum Pressure Advance: " ~ PA_low %}
RESPOND MSG="{info_str}"
{% set info_str = "Maximum Pressure Advance: " ~ PA_high %}
RESPOND MSG="{info_str}"
{% set info_str = "Formula: Pressure Advance Value = Measured_Z_Height x " ~ (((PA_high - PA_low) / layer_num) / layer_h) ~ PA_sign ~ PA_const|abs %}
RESPOND MSG="{info_str}"
{% set g_cmd = tool %}
{ g_cmd }
# {% set g_cmd = startup_code %}
# { g_cmd }
START_PRINT BED_TEMPERATURE={b_temp} EXTRUDER_TEMPERATURE={p_temp} CHAMBER_TEMPERATURE=50
M220 S100
M221 S100
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=1 ACCEL=500
SET_PRESSURE_ADVANCE ADVANCE_LOOKAHEAD_TIME=0
G92 E0
M83
# Precompute absolute coordinates of all print moves and speeds
#
# fast
# V5 +-----+ V4
# | | slow
# slow| + V3
# | | fast
# V1 +-----+ V2
# fast
{% set x_center = bed_x|float / 2.0 %}
{% set y_center = bed_y|float / 2.0 %}
{% set half_width = rect_side_len|float / 2.0 %}
{% set x_left = x_center - half_width + off_x %}
{% set x_right = x_center + half_width + off_x %}
{% set y_front = y_center - half_width + off_y %}
{% set y_back = y_center + half_width + off_y %}
{% set current_z = layer_h %}
{% set move_feedrate = 300.0 * 60.0 %}
{% set fast_feedrate = fspeed|float * 60.0 %}
{% set slow_feedrate = sspeed|float * 60.0 %}
# move the printhead to the starting position and make ready
G0 X{x_left} Y{y_front} Z{current_z} F{move_feedrate}
{% set pressure_advance = 0.0 %}
SET_PRESSURE_ADVANCE ADVANCE={pressure_advance}
M106 S{fan_speed}
# Iterate through each layer
{% for i in range(layer_num) %}
{% set pressure_advance = i / layer_num * (PA_high - PA_low) + PA_low %}
SET_PRESSURE_ADVANCE ADVANCE={pressure_advance}
# Set correct Z height
{% set current_z = layer_h * i %}
G0 Z{current_z}
# V1 to V2, fast feedrate
PA_LINE FEEDRATE={fast_feedrate} XSTART={x_left} YSTART={y_front} XEND={x_right} YEND={y_front} FD={filament_d} EW={e_width} LH={layer_h}
# V2 to V3, fast feedrate
PA_LINE FEEDRATE={fast_feedrate} XSTART={x_right} YSTART={y_front} XEND={x_right} YEND={y_center} FD={filament_d} EW={e_width} LH={layer_h}
# V3 to V4, slow feedrate
PA_LINE FEEDRATE={slow_feedrate} XSTART={x_right} YSTART={y_center} XEND={x_right} YEND={y_back} FD={filament_d} EW={e_width} LH={layer_h}
# V4 to V5, fast feedrate
PA_LINE FEEDRATE={fast_feedrate} XSTART={x_right} YSTART={y_back} XEND={x_left} YEND={y_back} FD={filament_d} EW={e_width} LH={layer_h}
# V5 back to start, slow feedrate
PA_LINE FEEDRATE={slow_feedrate} XSTART={x_left} YSTART={y_back} XEND={x_left} YEND={y_front} FD={filament_d} EW={e_width} LH={layer_h}
{% endfor %}
END_PRINT
[gcode_macro PA_LINE]
gcode:
# All parameters mandatory (no defaults)
{% set print_feedrate = params.FEEDRATE|float %}
{% set xfrom = params.XSTART|float %}
{% set yfrom = params.YSTART|float %}
{% set xto = params.XEND|float %}
{% set yto = params.YEND|float %}
{% set f_size = params.FD|default(1.75)|float %}
{% set e_size = params.EW|default(0.4)|float %}
{% set l_size = params.LH|default(0.2)|float %}
{% set line_length = ((xto-xfrom)**2 + (yto-yfrom)**2)**0.5 %} # Pythagoras
{% set extrude_length = line_length / (f_size * f_size * 3.14159 * 0.25) %}
{% set e_num = extrude_length * e_size * l_size * 1.67 %}
G1 X{xto} Y{yto} E{e_num} F{print_feedrate}
{ g_cmd }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment