mirror of
https://github.com/furrysalamander/rubedo.git
synced 2025-09-26 23:29:12 +08:00

Cleaned up a lot of code. Some things are still kind of messy, but it's a vast improvement over what I used to have. Data is easy to pass around the system, and the pattern info has proved invaluable for cleanly connecting prints, scans, and analysis.
305 lines
10 KiB
Python
Executable File
305 lines
10 KiB
Python
Executable File
#!/usr/bin/python3
|
|
from pattern_info import PatternInfo
|
|
|
|
BUILD_PLATE_TEMPERATURE = 110
|
|
HOTEND_TEMPERATURE = 255
|
|
|
|
FINISHED_X = 30
|
|
FINISHED_Y = 250
|
|
|
|
def generate_pa_tune_gcode(info: PatternInfo, finished_printing=True):
|
|
Z_HOP_HEIGHT = 0.75
|
|
LAYER_HEIGHT = 0.25
|
|
RETRACTION_DISTANCE = 0.5
|
|
EXTRUSION_DISTANCE_PER_MM = 0.045899
|
|
|
|
gcode = f"""
|
|
G21 ; Millimeter units
|
|
G90 ; Absolute XYZ
|
|
M83 ; Relative E
|
|
SET_VELOCITY_LIMIT ACCEL=3000 ACCEL_TO_DECEL=1500
|
|
G92 E0 ;
|
|
M106 S0 ; set fan speed to 0
|
|
|
|
G1 X{info.start_x + info.line_length} Y{info.start_y - info.spacing} F30000 ; move to start position
|
|
G1 Z{LAYER_HEIGHT} F300 ; move to layer height
|
|
G91 ; switch to relative movements
|
|
; Print a bounding box to aid with removal and prime the extruder.
|
|
G1 E{RETRACTION_DISTANCE * 2}
|
|
G1 Y{(len(info.pa_values) + 1) * info.spacing} E{(len(info.pa_values) + 1) * info.spacing * EXTRUSION_DISTANCE_PER_MM} F3000;
|
|
G1 X{-info.line_length} E{info.line_length * EXTRUSION_DISTANCE_PER_MM};
|
|
G1 Y{-(len(info.pa_values) + 1) * info.spacing} E{(len(info.pa_values) + 1) * info.spacing * EXTRUSION_DISTANCE_PER_MM};
|
|
G1 X{info.line_length} E{info.line_length * EXTRUSION_DISTANCE_PER_MM};
|
|
G1 Z{Z_HOP_HEIGHT} E{-RETRACTION_DISTANCE} F300; retract and prepare to hop to first line location.
|
|
"""
|
|
|
|
for pa_value in info.pa_values:
|
|
# TODO: parameterize the extrusion values based on the layer height
|
|
#
|
|
# TODO: the lines could be printed in alternating directions to
|
|
# eliminate the need for retractions and also decrease print time.
|
|
gcode += f"""
|
|
SET_PRESSURE_ADVANCE ADVANCE={pa_value} ; set Pressure Advance
|
|
M117 Testing Pressure Advance at: {pa_value}
|
|
G1 X-{info.line_length} Y{info.spacing} F30000 ; move to start position
|
|
G1 Z{-Z_HOP_HEIGHT} F300 ; move to layer height
|
|
G1 E{RETRACTION_DISTANCE} F1800 ; un-retract
|
|
G1 X{info.line_length / 4} E{(info.line_length / 4) * EXTRUSION_DISTANCE_PER_MM} F300 ; print line part one
|
|
G1 X{info.line_length / 2} E{(info.line_length / 2) * EXTRUSION_DISTANCE_PER_MM} F9000 ; print line part two
|
|
G1 X{info.line_length / 4} E{(info.line_length / 4) * EXTRUSION_DISTANCE_PER_MM} F300 ; print line part three
|
|
G1 E{-RETRACTION_DISTANCE} F1800 ; retract
|
|
G1 Z{Z_HOP_HEIGHT} F300 ; Move above layer height
|
|
"""
|
|
gcode += """
|
|
G1 Z20; move up 20mm
|
|
M117
|
|
"""
|
|
if finished_printing:
|
|
gcode += f"""
|
|
G90; switch back to absolute coordinates
|
|
G1 X{FINISHED_X} Y{FINISHED_Y} F30000;
|
|
"""
|
|
# print(gcode)
|
|
return gcode
|
|
|
|
|
|
def main():
|
|
# FIXME: this stuff times out when it takes too long for the printer to respond... not sure
|
|
# how to properly send commands and block until they're finished. Can I poll for the printer
|
|
# status?
|
|
gcode = f"""
|
|
G28
|
|
M104 S180; preheat nozzle while waiting for build plate to get to temp
|
|
M190 S{BUILD_PLATE_TEMPERATURE};
|
|
QUAD_GANTRY_LEVEL
|
|
CLEAN_NOZZLE
|
|
G28 Z
|
|
M109 S{HOTEND_TEMPERATURE};
|
|
"""
|
|
# PA Patterns
|
|
control = PatternInfo(
|
|
0, 0,
|
|
30, 30,
|
|
10,
|
|
30, 4
|
|
)
|
|
normal_pattern = PatternInfo(
|
|
0, 0.06,
|
|
65, 30,
|
|
10,
|
|
30, 4
|
|
)
|
|
calibrated = PatternInfo(
|
|
0.04, 0.04,
|
|
100, 30,
|
|
10,
|
|
30, 4
|
|
)
|
|
|
|
|
|
gcode += generate_pa_tune_gcode(control)
|
|
gcode += generate_pa_tune_gcode(normal_pattern)
|
|
gcode += generate_pa_tune_gcode(calibrated)
|
|
|
|
# Reset PA so I don't forget.
|
|
gcode += """
|
|
SET_PRESSURE_ADVANCE ADVANCE=0.04
|
|
"""
|
|
|
|
with open("pa_patterns.gcode", "w") as f:
|
|
f.write(gcode)
|
|
# g.do_initialization_routine()
|
|
# g.send_gcode(f"""
|
|
# M104 S180; preheat nozzle while waiting for build plate to get to temp
|
|
# M190 S{BUILD_PLATE_TEMPERATURE};
|
|
# M109 S{HOTEND_TEMPERATURE};
|
|
# """)
|
|
# g.send_gcode("CLEAN_NOZZLE")
|
|
# g.send_gcode(
|
|
# generate_pa_tune_gcode(
|
|
# 0, 0.1,
|
|
# 30, 30,
|
|
# 10,
|
|
# 30, 4
|
|
# )
|
|
# )
|
|
|
|
|
|
|
|
|
|
if __name__=="__main__":
|
|
main()
|
|
|
|
# {% set BED = params.BED|default(99)|float %}
|
|
# {% set EXTRUDER = params.EXTRUDER|default(239)|float %}
|
|
# PRINT_START BED_TEMP={BED} EXTRUDER_TEMP={EXTRUDER}
|
|
|
|
# G21 ; Millimeter units
|
|
# G90 ; Absolute XYZ
|
|
# M83 ; Relative E
|
|
# SET_VELOCITY_LIMIT ACCEL=3000 ACCEL_TO_DECEL=1500
|
|
# G92 E0 ;
|
|
# M106 S0 ; set fan speed to 0
|
|
|
|
# G1 X{start_x} Y{start_y} F30000 ; move to start position
|
|
# G1 Z0.25 F300 ; move to layer height
|
|
|
|
# G91 ; switch to relative movements
|
|
# G1 E0.75 F1800 ; un-retract
|
|
# G1 X10 E0.45899 F300 ; print line part one
|
|
# G1 X20 E0.91798 F9000 ; print line part two
|
|
# G1 X10 E0.45899 F300 ; print line part three
|
|
# G1 E-0.75 F1800 ; retract
|
|
# G1 Z0.75 F300
|
|
|
|
# {% for i in range(0, 20) %}
|
|
# SET_PRESSURE_ADVANCE ADVANCE={i*0.005} ; set Pressure Advance
|
|
# M117 Testing Pressure Advance at: {i*0.005}
|
|
# G1 X-40 Y4 F30000 ; move to start position
|
|
# G1 Z-0.75 F300 ; move to layer height
|
|
# G1 E0.75 F1800 ; un-retract
|
|
# G1 X10 E0.45899 F300 ; print line part one
|
|
# G1 X20 E0.91798 F9000 ; print line part two
|
|
# G1 X10 E0.45899 F300 ; print line part three
|
|
# G1 E-0.75 F1800 ; retract
|
|
# G1 Z0.75 F300 ; Move above layer height
|
|
# {% endfor %}
|
|
|
|
# PRINT_END
|
|
|
|
"""
|
|
[gcode_macro PA_CAL]
|
|
# Pressure Advance Simple Test macro, using .4mm nozzle.
|
|
# Usage: PA_CAL BED=100 EXTRUDER=240
|
|
# First prints a line with current set PA, then prints 20 line segments
|
|
# starting with 0 PA, increasing each line by 0.005.
|
|
|
|
# [gcode_macro CLEAN_NOZZLE]
|
|
# variable_start_x: 130
|
|
# variable_start_y: 350
|
|
# variable_start_z: 2
|
|
# variable_wipe_dist: -50
|
|
# variable_wipe_qty: 5
|
|
# variable_wipe_spd: 200
|
|
# variable_raise_distance: 10
|
|
|
|
# gcode:
|
|
# {% if "xyz" not in printer.toolhead.homed_axes %}
|
|
# G28
|
|
# {% endif %}
|
|
|
|
# G90 ; absolute positioning
|
|
# ## Move nozzle to start position
|
|
# G1 X{start_x} Y{start_y} F6000
|
|
# G1 Z{start_z} F1500
|
|
variable_start_x: 10
|
|
variable_start_y: 200
|
|
|
|
gcode:
|
|
{% set BED = params.BED|default(99)|float %}
|
|
{% set EXTRUDER = params.EXTRUDER|default(239)|float %}
|
|
PRINT_START BED_TEMP={BED} EXTRUDER_TEMP={EXTRUDER}
|
|
|
|
G21 ; Millimeter units
|
|
G90 ; Absolute XYZ
|
|
M83 ; Relative E
|
|
SET_VELOCITY_LIMIT ACCEL=3000 ACCEL_TO_DECEL=1500
|
|
G92 E0 ;
|
|
M106 S0 ; set fan speed to 0
|
|
|
|
G1 X{start_x} Y{start_y} F30000 ; move to start position
|
|
G1 Z0.25 F300 ; move to layer height
|
|
|
|
G91 ; switch to relative movements
|
|
G1 E0.75 F1800 ; un-retract
|
|
G1 X10 E0.45899 F300 ; print line part one
|
|
G1 X20 E0.91798 F9000 ; print line part two
|
|
G1 X10 E0.45899 F300 ; print line part three
|
|
G1 E-0.75 F1800 ; retract
|
|
G1 Z0.75 F300
|
|
|
|
{% for i in range(0, 20) %}
|
|
SET_PRESSURE_ADVANCE ADVANCE={i*0.005} ; set Pressure Advance
|
|
M117 Testing Pressure Advance at: {i*0.005}
|
|
G1 X-40 Y4 F30000 ; move to start position
|
|
G1 Z-0.75 F300 ; move to layer height
|
|
G1 E0.75 F1800 ; un-retract
|
|
G1 X10 E0.45899 F300 ; print line part one
|
|
G1 X20 E0.91798 F9000 ; print line part two
|
|
G1 X10 E0.45899 F300 ; print line part three
|
|
G1 E-0.75 F1800 ; retract
|
|
G1 Z0.75 F300 ; Move above layer height
|
|
{% endfor %}
|
|
|
|
PRINT_END
|
|
|
|
|
|
# gcode:
|
|
# {% set BED = params.BED|default(99)|float %}
|
|
# {% set EXTRUDER = params.EXTRUDER|default(239)|float %}
|
|
# PRINT_START BED_TEMP={BED} EXTRUDER_TEMP={EXTRUDER}
|
|
|
|
# G21 ; Millimeter units
|
|
# G90 ; Absolute XYZ
|
|
# M83 ; Relative E
|
|
# SET_VELOCITY_LIMIT ACCEL=3000 ACCEL_TO_DECEL=1500
|
|
# G92 E0 ;
|
|
# M106 S0 ; set fan speed to 0
|
|
|
|
# G1 X{start_x} Y{start_y} F30000 ; move to start position
|
|
# G1 Z0.25 F300 ; move to layer height
|
|
|
|
# G91 ; switch to relative movements
|
|
# G1 E0.75 F1800 ; un-retract
|
|
# G1 X20 E0.91798 F300 ; print line part one
|
|
# G1 X40 E1.83596 F9000 ; print line part two
|
|
# G1 X20 E0.91798 F300 ; print line part three
|
|
# G1 E-0.75 F1800 ; retract
|
|
# G1 Z0.75 F300
|
|
|
|
# {% for i in range(0, 20) %}
|
|
# SET_PRESSURE_ADVANCE ADVANCE={i*0.005} ; set Pressure Advance
|
|
# M117 Testing Pressure Advance at: {i*0.005}
|
|
# G1 X-80 Y5 F30000 ; move to start position
|
|
# G1 Z-0.75 F300 ; move to layer height
|
|
# G1 E0.75 F1800 ; un-retract
|
|
# G1 X20 E0.91798 F300 ; print line part one
|
|
# G1 X40 E1.83596 F9000 ; print line part two
|
|
# G1 X20 E0.91798 F300 ; print line part three
|
|
# G1 E-0.75 F1800 ; retract
|
|
# G1 Z0.75 F300 ; Move above layer height
|
|
# {% endfor %}
|
|
|
|
# PRINT_END
|
|
|
|
|
|
# SET_VELOCITY_LIMIT ACCEL=3000 ACCEL_TO_DECEL=1500
|
|
# G92 E0 ;
|
|
# M106 S0 ; set fan speed to 0
|
|
|
|
# G1 X120 Y70 F30000 ; move to start position
|
|
# G1 Z0.25 F300 ; move to layer height
|
|
# G1 E0.75 F1800 ; un-retract
|
|
# G1 X140 Y70 E0.91798 F300 ; print line part one
|
|
# G1 X180 Y70 E1.83596 F9000 ; print line part two
|
|
# G1 X200 Y70 E0.91798 F300 ; print line part three
|
|
# G1 E-0.75 F1800 ; retract
|
|
# G1 Z1 F300 ; Move above layer height
|
|
|
|
# {% for i in range(0, 20) %}
|
|
# SET_PRESSURE_ADVANCE ADVANCE={i*0.005} ; set Pressure Advance
|
|
# M117 Testing Pressure Advance at: {i*0.005}
|
|
# G1 X120 Y{100+(5*i)} F30000 ; move to start position
|
|
# G1 Z0.25 F300 ; move to layer height
|
|
# G1 E0.75 F1800 ; un-retract
|
|
# G1 X140 Y{100+(5*i)} E0.91798 F300 ; print line part one
|
|
# G1 X180 Y{100+(5*i)} E1.83596 F9000 ; print line part two
|
|
# G1 X200 Y{100+(5*i)} E0.91798 F300 ; print line part three
|
|
# G1 E-0.75 F1800 ; retract
|
|
# G1 Z1 F300 ; Move above layer height
|
|
# {% endfor %}
|
|
|
|
# PRINT_END
|
|
"""
|
|
|