screws_tilt_adjust: Add new screws_tilt_adjust tool (#1367)

Signed-off-by: Rui Caridade <rui.mcbc@gmail.com>
This commit is contained in:
Rui Caridade 2019-03-08 16:47:17 +00:00 committed by KevinOConnor
parent fcaa75f014
commit 5c0a2479be
8 changed files with 336 additions and 3 deletions

View File

@ -126,6 +126,9 @@ radius: 50
#samples: 1 #samples: 1
# The number of times to probe each point. The probed z-values will # The number of times to probe each point. The probed z-values will
# be averaged. The default is to probe 1 time. # be averaged. The default is to probe 1 time.
#samples_result: average
# One can choose median or average between probes samples
# The default is average.
#sample_retract_dist: 2.0 #sample_retract_dist: 2.0
# The distance (in mm) to retract between each sample if sampling # The distance (in mm) to retract between each sample if sampling
# more than once. The default is 2mm. # more than once. The default is 2mm.

View File

@ -115,6 +115,9 @@
#samples: 1 #samples: 1
# The number of times to probe each point. The probed z-values # The number of times to probe each point. The probed z-values
# will be averaged. The default is to probe 1 time. # will be averaged. The default is to probe 1 time.
#samples_result: average
# One can choose median or average between probes samples
# The default is average.
#sample_retract_dist: 2.0 #sample_retract_dist: 2.0
# The distance (in mm) to retract between each sample if # The distance (in mm) to retract between each sample if
# sampling more than once. Default is 2mm. # sampling more than once. Default is 2mm.
@ -157,6 +160,9 @@
#samples: 1 #samples: 1
# The number of times to probe each point. The probed z-values # The number of times to probe each point. The probed z-values
# will be averaged. The default is to probe 1 time. # will be averaged. The default is to probe 1 time.
#samples_result: average
# One can choose median or average between probes samples
# The default is average.
#sample_retract_dist: 2.0 #sample_retract_dist: 2.0
# The distance (in mm) to retract between each sample if # The distance (in mm) to retract between each sample if
# sampling more than once. Default is 2mm. # sampling more than once. Default is 2mm.
@ -258,6 +264,47 @@
# The speed (in mm/s) when moving from a horizontal_move_z position # The speed (in mm/s) when moving from a horizontal_move_z position
# to a probe_height position. The default is 5. # to a probe_height position. The default is 5.
# Tool to help adjust bed screws tilt using Z probe. One may define a
# [screws_tilt_adjust] config section to enable a SCREWS_TILT_CALCULATE
# g-code command.
#[screws_tilt_adjust]
#screw1: 100,100
# The X,Y coordinate of the first bed leveling screw. This is a
# position to command the nozzle to that is directly above the bed
# screw (or as close as possible while still being above the bed).
# This is the base screw used in calculations.
# This parameter must be provided.
#screw1_name: front screw
# An arbitrary name for the given screw. This name is displayed when
# the helper script runs. The default is to use a name based upon
# the screw XY location.
#screw2:
#screw2_name:
#...
# Additional bed leveling screws. At least two screws must be
# defined.
#speed: 50
# The speed (in mm/s) of non-probing moves during the calibration.
# The default is 50.
#horizontal_move_z: 5
# The height (in mm) that the head should be commanded to move to
# just prior to starting a probe operation. The default is 5.
#samples: 1
# The number of times to probe each point. The probed z-values
# will be averaged. The default is to probe 1 time.
#sample_retract_dist: 2.0
# The distance (in mm) to retract between each sample if
# sampling more than once. Default is 2mm.
#samples_result: median
# One can choose median or average between screw probes
# The default is average.
#screw_thread: CW-M3
# The type of screw used for bed level, M3, M4 or M5 and the
# direction of the knob used to level the bed, clockwise decrease
# counter-clockwise decrease.
# Accepted values: CW-M3, CCW-M3, CW-M4, CCW-M4, CW-M5, CCW-M5.
# Default value is CW-M3, most printers use an M3 screw and
# turning the knob clockwise decrease distance.
# Multiple Z stepper tilt adjustment. This feature enables independent # Multiple Z stepper tilt adjustment. This feature enables independent
# adjustment of multiple z steppers (see stepper_z1 section below) to # adjustment of multiple z steppers (see stepper_z1 section below) to
@ -284,6 +331,9 @@
#samples: 1 #samples: 1
# The number of times to probe each point. The probed z-values # The number of times to probe each point. The probed z-values
# will be averaged. The default is to probe 1 time. # will be averaged. The default is to probe 1 time.
#samples_result: average
# One can choose median or average between probes samples
# The default is average.
#sample_retract_dist: 2.0 #sample_retract_dist: 2.0
# The distance (in mm) to retract between each sample if # The distance (in mm) to retract between each sample if
# sampling more than once. Default is 2mm. # sampling more than once. Default is 2mm.
@ -326,6 +376,9 @@
# just prior to starting a probe operation. The default is 5 # just prior to starting a probe operation. The default is 5
#samples: 1 #samples: 1
# Number of probe samples per point. The defaut is 1 # Number of probe samples per point. The defaut is 1
#samples_result: average
# One can choose median or average between probes samples
# The default is average.
#sample_retract_dist: 2.0 #sample_retract_dist: 2.0
# Distance in mm to retract the probe between samples. Default is 2. # Distance in mm to retract the probe between samples. Default is 2.

View File

@ -274,6 +274,16 @@ section is enabled:
the bed screws so that the bed is a constant distance from the the bed screws so that the bed is a constant distance from the
nozzle. nozzle.
## Bed Screws Tilt adjust Helper
The following commands are available when the "screws_tilt_adjust"
config section is enabled:
- `SCREWS_TILT_CALCULATE`: This command will invoke the bed screws
adjustment tool. It will command the nozzle to different locations
(as defined in the config file) probing the z height and calculate
the number of knob turns to adjust the bed level.
IMPORTANT: You MUST always do a G28 before using this command.
## Z Tilt ## Z Tilt
The following commands are available when the "z_tilt" config section The following commands are available when the "z_tilt" config section

View File

@ -133,3 +133,57 @@ prompt for coarse adjustments directly above each screw position, and
once those are accepted, it will prompt for fine adjustments at the once those are accepted, it will prompt for fine adjustments at the
additional locations. Continue to use `ACCEPT` and `ADJUSTED` at each additional locations. Continue to use `ACCEPT` and `ADJUSTED` at each
position. position.
# Adjusting bed leveling screws using the bed probe
This is another way to calibrate the bed level using the bed probe. To
use it you must have a Z probe (BL Touch, Inductive sensor, etc).
To enable this feature, one would determine the additional nozzle
coordinates near the screws and add them to the config file. For example,
it might look like:
```
[screws_tilt_adjust]
screw1: -5,30
screw1_name: front left screw
screw2: 155,30
screw2_name: front right screw
screw3: 155,190
screw3_name: rear right screw
screw4: -5,190
screw4_name: rear left screw
horizontal_move_z: 10.
speed: 50.
samples: 3
sample_retract_dist: 2.
samples_result: median
screw_thread: CW-M3
```
One can indicate the number of times to repeat probe on each screw and
if the value is the median or the average read probe.
The screw1 is always the reference point for the others, so the system
assumes that screw1 is in the correct height.
Then to use this feature you must preform every time `G28` before
`SCREWS_TILT_CALCULATE` and after bed is probed you get an output like this:
```
Send: G28
Recv: ok
Send: SCREWS_TILT_CALCULATE
Recv: // front left screw (Base): X -5.0, Y 30.0, Z 2.48750
Recv: // front right screw : X 155.0, Y 30.0, Z 2.36000 : Adjust -> CW 01:15
Recv: // rear right screw : X 155.0, Y 190.0, Z 2.71500 : Adjust -> CCW 00:50
Recv: // read left screw : X -5.0, Y 190.0, Z 2.47250 : Adjust -> CW 00:02
Recv: ok
```
This means that:
- front left screw is the reference point you must not change it.
- front right screw must be turned clockwise 1 full turn and a quarter turn
- rear right screw must be turned counter-clockwise 50 minutes
- read left screw must be turned clockwise 2 minutes (not need it's ok)
Repeat the process several times until you get a good level bed, normally when
all adjusts are below 6 minutes.

View File

@ -240,6 +240,9 @@ class ProbePointsHelper:
self.samples = config.getint('samples', 1, minval=1) self.samples = config.getint('samples', 1, minval=1)
self.sample_retract_dist = config.getfloat( self.sample_retract_dist = config.getfloat(
'sample_retract_dist', 2., above=0.) 'sample_retract_dist', 2., above=0.)
self.samples_result = config.getchoice('samples_result',
{'median': 0, 'average': 1},
default='average')
# Internal probing state # Internal probing state
self.results = [] self.results = []
self.busy = self.manual_probe = False self.busy = self.manual_probe = False
@ -295,9 +298,26 @@ class ProbePointsHelper:
if i < self.samples - 1: if i < self.samples - 1:
# retract # retract
self._lift_z(self.sample_retract_dist, add=True) self._lift_z(self.sample_retract_dist, add=True)
avg_pos = [sum([pos[i] for pos in positions]) / self.samples if self.samples_result == 1:
for i in range(3)] # Calculate Average
self.results.append(avg_pos) calculated_value = [sum([pos[i] for pos in positions]) /
self.samples for i in range(3)]
else:
# Calculate Median
sorted_z_positions = sorted([position[2]
for position in positions])
middle = self.samples // 2
if (self.samples & 1) == 1:
# odd number of samples
median = sorted_z_positions[middle]
else:
# even number of samples
median = (sorted_z_positions[middle] +
sorted_z_positions[middle - 1]) / 2
calculated_value = [positions[0][0],
positions[0][1],
median]
self.results.append(calculated_value)
def start_probe(self, params): def start_probe(self, params):
# Lookup objects # Lookup objects
self.toolhead = self.printer.lookup_object('toolhead') self.toolhead = self.printer.lookup_object('toolhead')

View File

@ -0,0 +1,97 @@
# Helper script to adjust bed screws tilt using Z probe
#
# Copyright (C) 2019 Rui Caridade <rui.mcbc@gmail.com>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
import math
import probe
def parse_coord(config, param):
pair = config.get(param).strip().split(',', 1)
try:
return (float(pair[0]), float(pair[1]))
except:
raise config.error("%s:%s needs to be an x,y coordinate" % (
config.get_name(), param))
class ScrewsTiltAdjust:
def __init__(self, config):
self.config = config
self.printer = config.get_printer()
self.screws = []
# Verify that a probe exists
try:
self.printer.lookup_object("probe")
except:
raise self.gcode.error("Error: you must have a probe on "
"your config file.")
# Read config
for i in range(99):
prefix = "screw%d" % (i + 1,)
if config.get(prefix, None) is None:
break
screw_coord = parse_coord(config, prefix)
screw_name = "screw at %.3f,%.3f" % screw_coord
screw_name = config.get(prefix + "_name", screw_name)
self.screws.append((screw_coord, screw_name))
if len(self.screws) < 3:
raise config.error("screws_tilt_adjust: Must have "
"at least three screws")
self.threads = {'CW-M3': 0, 'CCW-M3': 1, 'CW-M4': 2, 'CCW-M4': 3,
'CW-M5': 4, 'CCW-M5': 5}
self.thread = config.getchoice('screw_thread', self.threads,
default='CW-M3')
# Initialize ProbePointsHelper
points = [coord for coord, name in self.screws]
self.probe_helper = probe.ProbePointsHelper(self.config,
self.probe_finalize,
default_points=points)
# Register command
self.gcode = self.printer.lookup_object('gcode')
self.gcode.register_command("SCREWS_TILT_CALCULATE",
self.cmd_SCREWS_TILT_CALCULATE,
desc=self.cmd_SCREWS_TILT_CALCULATE_help)
cmd_SCREWS_TILT_CALCULATE_help = "Tool to help adjust bed leveling " \
"screws by calculating the number " \
"of turns to level it."
def cmd_SCREWS_TILT_CALCULATE(self, params):
self.probe_helper.start_probe(params)
def probe_finalize(self, offsets, positions):
# Factors used for CW-M3, CCW-M3, CW-M4, CCW-M4, CW-M5 and CCW-M5
threads_factor = {0: 0.5, 1: 0.5, 2: 0.7, 3: 0.7, 4: 0.8, 5: 0.8}
# Process the read Z values and
for i, screw in enumerate(self.screws):
if i == 0:
# First screw is the base position used for comparison
z_base = positions[i][2]
coord_base, name_base = screw
# Show the results
self.gcode.respond_info("%s (Base): X %.1f, Y %.1f, Z %.5f" %
(name_base, coord_base[0],
coord_base[1], z_base))
else:
# Calculate how knob must me adjusted for other positions
z = positions[i][2]
coord, name = screw
diff = z_base - z
if abs(diff) < 0.001:
adjust = 0
else:
adjust = diff / threads_factor.get(self.thread, 0.5)
if (self.thread & 1) == 1:
sign = "CW" if adjust < 0 else "CCW"
else:
sign = "CCW" if adjust < 0 else "CW"
full_turns = math.trunc(adjust)
decimal_part = adjust - full_turns
minutes = round(decimal_part * 60, 0)
# Show the results
self.gcode.respond_info("%s : X %.1f, Y %.1f, Z %.5f : "
"Adjust -> %s %02d:%02d" %
(name, coord[0], coord[1], z, sign,
abs(full_turns), abs(minutes)))
def load_config(config):
return ScrewsTiltAdjust(config)

View File

@ -0,0 +1,89 @@
# Test config for bed screws tool with bltouch
[stepper_x]
step_pin: ar54
dir_pin: ar55
enable_pin: !ar38
step_distance: .0125
endstop_pin: ^ar3
position_endstop: 0
position_max: 200
homing_speed: 50
[stepper_y]
step_pin: ar60
dir_pin: !ar61
enable_pin: !ar56
step_distance: .0125
endstop_pin: ^ar14
position_endstop: 0
position_max: 200
homing_speed: 50
[stepper_z]
step_pin: ar46
dir_pin: ar48
enable_pin: !ar62
step_distance: .0025
endstop_pin: probe:z_virtual_endstop
position_max: 200
[extruder]
step_pin: ar26
dir_pin: ar28
enable_pin: !ar24
step_distance: .002
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: ar10
sensor_type: EPCOS 100K B57560G104F
sensor_pin: analog13
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 250
[heater_bed]
heater_pin: ar8
sensor_type: EPCOS 100K B57560G104F
sensor_pin: analog14
control: watermark
min_temp: 0
max_temp: 130
[bltouch]
sensor_pin: ar30
control_pin: ar32
z_offset: 1.15
[bed_mesh]
min_point: 10,10
max_point: 180,180
[mcu]
serial: /dev/ttyACM0
pin_map: arduino
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100
[screws_tilt_adjust]
screw1: 10,30
screw1_name: front left screw
screw2: 155,30
screw2_name: front right screw
screw3: 155,190
screw3_name: rear right screw
screw4: 10,190
screw4_name: read left screw
horizontal_move_z: 10.
speed: 50.
samples: 3
sample_retract_dist: 2.
samples_result: median
screw_thread: CW-M3

View File

@ -0,0 +1,7 @@
# Test case for bed screws tilt helper tool
CONFIG screws_tilt_adjust.cfg
DICTIONARY atmega2560-16mhz.dict
# Simple script to test
G28
SCREWS_TILT_CALCULATE