aboutsummaryrefslogtreecommitdiffstats
path: root/klippy
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2017-11-07 13:10:08 -0500
committerKevin O'Connor <kevin@koconnor.net>2017-11-18 17:37:04 -0500
commit8c2fa2e2d6ff6dda25d5505760ceba4076af9efc (patch)
treeb00e5f1a4d1b98ea200a896354949780dcc151f9 /klippy
parent38643f52c97dc85bcc2bf020927852f9cfe9fff6 (diff)
downloadkutter-8c2fa2e2d6ff6dda25d5505760ceba4076af9efc.tar.gz
kutter-8c2fa2e2d6ff6dda25d5505760ceba4076af9efc.tar.xz
kutter-8c2fa2e2d6ff6dda25d5505760ceba4076af9efc.zip
stepper: Support for multiple steppers controlling a single axis
Allow multiple steppers to be defined for a single cartesian axis. This adds support for dual-z setups. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy')
-rw-r--r--klippy/cartesian.py2
-rw-r--r--klippy/corexy.py10
-rw-r--r--klippy/stepper.py46
3 files changed, 54 insertions, 4 deletions
diff --git a/klippy/cartesian.py b/klippy/cartesian.py
index 4907b6d1..2f4651ad 100644
--- a/klippy/cartesian.py
+++ b/klippy/cartesian.py
@@ -10,7 +10,7 @@ StepList = (0, 1, 2)
class CartKinematics:
def __init__(self, toolhead, printer, config):
- self.steppers = [stepper.PrinterHomingStepper(
+ self.steppers = [stepper.LookupMultiHomingStepper(
printer, config.getsection('stepper_' + n))
for n in ['x', 'y', 'z']]
max_velocity, max_accel = toolhead.get_max_velocity()
diff --git a/klippy/corexy.py b/klippy/corexy.py
index 8b92d118..dd62cf1c 100644
--- a/klippy/corexy.py
+++ b/klippy/corexy.py
@@ -10,9 +10,13 @@ StepList = (0, 1, 2)
class CoreXYKinematics:
def __init__(self, toolhead, printer, config):
- self.steppers = [stepper.PrinterHomingStepper(
- printer, config.getsection('stepper_' + n))
- for n in ['x', 'y', 'z']]
+ self.steppers = [
+ stepper.PrinterHomingStepper(
+ printer, config.getsection('stepper_x')),
+ stepper.PrinterHomingStepper(
+ printer, config.getsection('stepper_y')),
+ stepper.LookupMultiHomingStepper(
+ printer, config.getsection('stepper_z'))]
self.steppers[0].mcu_endstop.add_stepper(self.steppers[1].mcu_stepper)
self.steppers[1].mcu_endstop.add_stepper(self.steppers[0].mcu_stepper)
max_velocity, max_accel = toolhead.get_max_velocity()
diff --git a/klippy/stepper.py b/klippy/stepper.py
index 692273c0..0574c4bf 100644
--- a/klippy/stepper.py
+++ b/klippy/stepper.py
@@ -143,3 +143,49 @@ class PrinterHomingStepper(PrinterStepper):
"Endstop %s incorrect phase (got %d vs %d)" % (
self.name, pos, self.homing_endstop_phase))
return delta * self.step_dist
+
+# Wrapper for dual stepper motor support
+class PrinterMultiStepper(PrinterHomingStepper):
+ def __init__(self, printer, config):
+ PrinterHomingStepper.__init__(self, printer, config)
+ self.endstops = PrinterHomingStepper.get_endstops(self)
+ self.extras = []
+ self.all_step_const = [self.step_const]
+ for i in range(1, 99):
+ if not config.has_section(config.section + str(i)):
+ break
+ extraconfig = config.getsection(config.section + str(i))
+ extra = PrinterStepper(printer, extraconfig)
+ self.extras.append(extra)
+ self.all_step_const.append(extra.step_const)
+ extraendstop = extraconfig.get('endstop_pin', None)
+ if extraendstop is not None:
+ mcu_endstop = pins.setup_pin(printer, 'endstop', extraendstop)
+ mcu_endstop.add_stepper(extra.mcu_stepper)
+ self.endstops.append(
+ (mcu_endstop, extra.mcu_stepper, extra.name))
+ else:
+ self.mcu_endstop.add_stepper(extra.mcu_stepper)
+ self.step_const = self.step_multi_const
+ def step_multi_const(self, print_time, start_pos, dist, start_v, accel):
+ for step_const in self.all_step_const:
+ step_const(print_time, start_pos, dist, start_v, accel)
+ def set_max_jerk(self, max_halt_velocity, max_accel):
+ PrinterHomingStepper.set_max_jerk(self, max_halt_velocity, max_accel)
+ for extra in self.extras:
+ extra.set_max_jerk(max_halt_velocity, max_accel)
+ def set_position(self, pos):
+ PrinterHomingStepper.set_position(self, pos)
+ for extra in self.extras:
+ extra.set_position(pos)
+ def motor_enable(self, print_time, enable=0):
+ PrinterHomingStepper.motor_enable(self, print_time, enable)
+ for extra in self.extras:
+ extra.motor_enable(print_time, enable)
+ def get_endstops(self):
+ return self.endstops
+
+def LookupMultiHomingStepper(printer, config):
+ if not config.has_section(config.section + '1'):
+ return PrinterHomingStepper(printer, config)
+ return PrinterMultiStepper(printer, config)