[gcode_macro FEED_RATE_TEST] #Params: #ACCEL_STEPS (text, comma separated integers): acceleration values to test, passed as a string like ACCEL_STEPS="5000, 10000, 20000" #TEST_STEPS (text, comma separated texts): tests to run, passed as a string like TEST_STEPS="x_test,y_test,rect_test,diag_test" #- Options: # - x_test = Moves x axis # - y_test = Moves y axis # - rect_test = Moves in a rectangle # - diag_test = Moves x & y diagonally # - circle_test = Moves in a circle twice #DISTANCE_STEPS (text, comma separated floats): distance values to test, passed as a string like DISTANCE_STEPS="30, 22, 45.221" #SPEED_STEPS (text, comma separated floats): speed (mm/s) values to test, passed as a string like SPEED_STEPS="100, 120, 120.22" gcode: {% if printer.configfile.config.respond is not defined %} {action_raise_error("This gcode_macro requires the [respond] section in your printer.cfg")} {% endif %} # Ugly code to convert a string into an array in jinja # TEST_STEPS conversion {% set ns_test_steps = namespace(collector="", arr=[]) %} {% for char in params.TEST_STEPS|default("x_test,y_test,rect_test,diag_test")|string %} {% if char == "," or loop.last %} {% if loop.last %} {% set ns_test_steps.collector = ns_test_steps.collector ~ char %} {% endif %} {% set ns_test_steps.arr = ns_test_steps.arr + [ns_test_steps.collector|string] %} {% set ns_test_steps.collector = "" %} {% else %} {% set ns_test_steps.collector = ns_test_steps.collector ~ char %} {% endif %} {% endfor %} # SPEED_STEPS conversion {% set ns_speed_steps = namespace(collector="", arr=[]) %} {% for char in params.SPEED_STEPS|default("80.0")|string %} {% if char == "," or loop.last %} {% if loop.last %} {% set ns_speed_steps.collector = ns_speed_steps.collector ~ char %} {% endif %} {% set ns_speed_steps.arr = ns_speed_steps.arr + [ns_speed_steps.collector|float] %} {% set ns_speed_steps.collector = "" %} {% else %} {% set ns_speed_steps.collector = ns_speed_steps.collector ~ char %} {% endif %} {% endfor %} # DISTANCE_STEPS conversion {% set ns_distance_steps = namespace(collector="", arr=[]) %} {% for char in params.DISTANCE_STEPS|default("40.0")|string %} {% if char == "," or loop.last %} {% if loop.last %} {% set ns_distance_steps.collector = ns_distance_steps.collector ~ char %} {% endif %} {% set ns_distance_steps.arr = ns_distance_steps.arr + [ns_distance_steps.collector|float] %} {% set ns_distance_steps.collector = "" %} {% else %} {% set ns_distance_steps.collector = ns_distance_steps.collector ~ char %} {% endif %} {% endfor %} # ACCEL_STEPS conversion {% set ns_accel_steps = namespace(collector="", arr=[]) %} {% for char in params.ACCEL_STEPS|default(printer.toolhead.max_accel|string)|string %} {% if char == "," or loop.last %} {% if loop.last %} {% set ns_accel_steps.collector = ns_accel_steps.collector ~ char %} {% endif %} {% set ns_accel_steps.arr = ns_accel_steps.arr + [ns_accel_steps.collector|int] %} {% set ns_accel_steps.collector = "" %} {% else %} {% set ns_accel_steps.collector = ns_accel_steps.collector ~ char %} {% endif %} {% endfor %} # Variable assignment {% set center_x_position = printer.toolhead.axis_maximum.x / 2 %} {% set center_y_position = printer.toolhead.axis_maximum.y / 2 %} # Conversion steps variable assignment {% set accel_steps = ns_accel_steps.arr %} {% set test_steps = ns_test_steps.arr %} {% set distance_steps = ns_distance_steps.arr %} {% set speed_steps = ns_speed_steps.arr %} SAVE_GCODE_STATE NAME=speed_testing_macro {% set testRunCounter = namespace(value=0) %} RESPOND PREFIX="Speed-Test - " MSG="Starting Speed testing with" RESPOND PREFIX="- " MSG="distance_steps={distance_steps}" RESPOND PREFIX="- " MSG="speed_steps={speed_steps}" RESPOND PREFIX="- " MSG="accel_steps={accel_steps}" RESPOND PREFIX="- " MSG="test_steps={test_steps}" RESPOND PREFIX="" MSG="--------------------" # Homing {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G90 G1 X{center_x_position} Y{center_y_position} Z25 F4000 {% for distance_step in distance_steps %} {% for speed_step in speed_steps %} {% set speed_feedrate_step = speed_step * 60 %} {% for accel_step in accel_steps %} {% set testRunCounter.value = testRunCounter.value + 1 %} M204 S{accel_step} RESPOND PREFIX="Speed-Test - " MSG="Test-Run {testRunCounter.value} => distance: {distance_step} speed: {speed_step} acceleration: {accel_step}" {% for test_step in test_steps %} _{test_step|upper} FEEDRATE={speed_feedrate_step} DISTANCE={distance_step} {% endfor %} {% endfor %} {% endfor %} {% endfor %} RESTORE_GCODE_STATE NAME=speed_testing_macro [gcode_macro _X_TEST] description: Moves the head left/right gcode: {% set speed_feedrate = params.FEEDRATE|default(4800)|float %} {% set distance = params.DISTANCE|default(100)|float %} G91 G1 x{distance} F{speed_feedrate} G1 x-{distance * 2} F{speed_feedrate} G1 x{distance} F{speed_feedrate} G90 [gcode_macro _Y_TEST] description: Moves the head forward/backward gcode: {% set speed_feedrate = params.FEEDRATE|default(4800)|float %} {% set distance = params.DISTANCE|default(100)|float %} G91 G1 y{distance} F{speed_feedrate} G1 y-{distance * 2} F{speed_feedrate} G1 y{distance} F{speed_feedrate} G90 [gcode_macro _RECT_TEST] description: Moves the head in a rectangle gcode: {% set speed_feedrate = params.FEEDRATE|default(4800)|float %} {% set distance = params.DISTANCE|default(100)|float %} G91 G1 x-{distance} F{speed_feedrate} G1 y-{distance} F{speed_feedrate} G1 x{distance * 2} F{speed_feedrate} G1 y{distance * 2} F{speed_feedrate} G1 x-{distance * 2} F{speed_feedrate} G1 y-{distance} F{speed_feedrate} G1 x{distance} F{speed_feedrate} G90 [gcode_macro _DIAG_TEST] description: Moves the head diagonally. First spinning the stepper_x, then the stepper_y. (CoreXY) gcode: {% set speed_feedrate = params.FEEDRATE|default(4800)|float %} {% set distance = params.DISTANCE|default(100)|float %} G91 G1 x{distance} y{distance} F{speed_feedrate} G1 x-{distance * 2} y-{distance * 2} F{speed_feedrate} G1 x{distance} y{distance} F{speed_feedrate} G1 x{distance} y-{distance} F{speed_feedrate} G1 x-{distance * 2} y{distance * 2} F{speed_feedrate} G1 x{distance} y-{distance} F{speed_feedrate} G90 [gcode_macro _CIRCLE_TEST] description: Moves the head in a circle twice. gcode: {% set speed_feedrate = params.FEEDRATE|default(4800)|float %} {% set distance = params.DISTANCE|default(100)|float %} {% if printer.configfile.config.gcode_arcs is not defined %} {action_raise_error("The circle test requires the [gcode_arcs] section in your printer.cfg")} {% endif %} {% for count in range(2) %} G2 I{distance} J{distance} F{speed_feedrate} {% endfor %}