diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2019-02-08 20:11:05 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2019-02-12 13:38:13 -0500 |
commit | 2d7c3a84eefdb584e977747d0b8d84304571b50f (patch) | |
tree | b2696ad66a5fed6160baa3ecff82797c2eeb181e /klippy | |
parent | 57e6acbc5c0d479786e924d588b51b3bb34da92a (diff) | |
download | kutter-2d7c3a84eefdb584e977747d0b8d84304571b50f.tar.gz kutter-2d7c3a84eefdb584e977747d0b8d84304571b50f.tar.xz kutter-2d7c3a84eefdb584e977747d0b8d84304571b50f.zip |
manual_stepper: Add an "extras" module for manually controlling a stepper
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy')
-rw-r--r-- | klippy/extras/manual_stepper.py | 117 | ||||
-rw-r--r-- | klippy/extras/tmc2130.py | 4 | ||||
-rw-r--r-- | klippy/extras/tmc2208.py | 2 | ||||
-rw-r--r-- | klippy/toolhead.py | 1 |
4 files changed, 121 insertions, 3 deletions
diff --git a/klippy/extras/manual_stepper.py b/klippy/extras/manual_stepper.py new file mode 100644 index 00000000..fdb9fc10 --- /dev/null +++ b/klippy/extras/manual_stepper.py @@ -0,0 +1,117 @@ +# Support for a manual controlled stepper +# +# Copyright (C) 2019 Kevin O'Connor <kevin@koconnor.net> +# +# This file may be distributed under the terms of the GNU GPLv3 license. +import stepper, homing, chelper + +ENDSTOP_SAMPLE_TIME = .000015 +ENDSTOP_SAMPLE_COUNT = 4 + +class ManualStepper: + def __init__(self, config): + self.printer = config.get_printer() + if config.get('endstop_pin', None) is not None: + self.can_home = True + self.stepper = stepper.PrinterRail( + config, need_position_minmax=False, default_position_endstop=0.) + else: + self.can_home = False + self.stepper = stepper.PrinterStepper(config) + self.next_cmd_time = 0. + # Setup iterative solver + ffi_main, ffi_lib = chelper.get_ffi() + self.cmove = ffi_main.gc(ffi_lib.move_alloc(), ffi_lib.free) + self.move_fill = ffi_lib.move_fill + self.stepper.setup_itersolve('cartesian_stepper_alloc', 'x') + self.stepper.set_max_jerk(9999999.9, 9999999.9) + # Register commands + stepper_name = config.get_name().split()[1] + self.gcode = self.printer.lookup_object('gcode') + self.gcode.register_mux_command('MANUAL_STEPPER', "STEPPER", + stepper_name, self.cmd_MANUAL_STEPPER, + desc=self.cmd_MANUAL_STEPPER_help) + self.printer.register_event_handler( + "toolhead:motor_off", self.handle_motor_off) + def sync_print_time(self): + toolhead = self.printer.lookup_object('toolhead') + print_time = toolhead.get_last_move_time() + if self.next_cmd_time > print_time: + toolhead.dwell(self.next_cmd_time - print_time) + else: + self.next_cmd_time = print_time + def do_enable(self, enable): + self.sync_print_time() + self.stepper.motor_enable(self.next_cmd_time, enable) + self.sync_print_time() + def do_set_position(self, setpos): + self.stepper.set_position([setpos, 0., 0.]) + def do_move(self, movepos, speed): + self.sync_print_time() + cp = self.stepper.get_commanded_position() + dist = movepos - cp + move_t = abs(dist / speed) + self.move_fill(self.cmove, self.next_cmd_time, 0., move_t, 0., + cp, 0., 0., dist, 0., 0., 0., speed, 0.) + self.stepper.step_itersolve(self.cmove) + self.next_cmd_time += move_t + self.sync_print_time() + def do_homing_move(self, movepos, speed, triggered): + if not self.can_home: + raise self.gcode.error("No endstop for this manual stepper") + # Notify endstops of upcoming home + endstops = self.stepper.get_endstops() + for mcu_endstop, name in endstops: + mcu_endstop.home_prepare() + # Start endstop checking + self.sync_print_time() + for mcu_endstop, name in endstops: + min_step_dist = min([s.get_step_dist() + for s in mcu_endstop.get_steppers()]) + mcu_endstop.home_start( + self.next_cmd_time, ENDSTOP_SAMPLE_TIME, ENDSTOP_SAMPLE_COUNT, + min_step_dist / speed, triggered=triggered) + # Issue move + self.do_move(movepos, speed) + # Wait for endstops to trigger + error = None + for mcu_endstop, name in endstops: + try: + mcu_endstop.home_wait(self.next_cmd_time) + except mcu_endstop.TimeoutError as e: + if error is None: + error = "Failed to home %s: %s" % (name, str(e)) + for mcu_endstop, name in endstops: + try: + mcu_endstop.home_finalize() + except homing.EndstopError as e: + if error is None: + error = str(e) + self.sync_print_time() + if error is not None: + raise self.gcode.error(error) + cmd_MANUAL_STEPPER_help = "Command a manually configured stepper" + def cmd_MANUAL_STEPPER(self, params): + if 'ENABLE' in params: + self.do_enable(self.gcode.get_int('ENABLE', params)) + if 'SET_POSITION' in params: + setpos = self.gcode.get_float('SET_POSITION', params) + self.do_set_position(setpos) + homing_move = self.gcode.get_int('STOP_ON_ENDSTOP', params, 0) + if homing_move: + movepos = self.gcode.get_float('MOVE', params) + speed = self.gcode.get_float('SPEED', params, above=0.) + if 'ENABLE' not in params and not self.stepper.is_motor_enabled(): + self.do_enable(True) + self.do_homing_move(movepos, speed, homing_move > 0) + elif 'MOVE' in params: + movepos = self.gcode.get_float('MOVE', params) + speed = self.gcode.get_float('SPEED', params, above=0.) + if 'ENABLE' not in params and not self.stepper.is_motor_enabled(): + self.do_enable(True) + self.do_move(movepos, speed) + def handle_motor_off(self, print_time): + self.do_enable(0) + +def load_config_prefix(config): + return ManualStepper(config) diff --git a/klippy/extras/tmc2130.py b/klippy/extras/tmc2130.py index acb1ca51..0374a747 100644 --- a/klippy/extras/tmc2130.py +++ b/klippy/extras/tmc2130.py @@ -129,7 +129,7 @@ def get_config_stealthchop(config, tmc_freq): velocity = config.getfloat('stealthchop_threshold', 0., minval=0.) if not velocity: return mres, False, 0 - stepper_name = config.get_name().split()[1] + stepper_name = " ".join(config.get_name().split()[1:]) stepper_config = config.getsection(stepper_name) step_dist = stepper_config.getfloat('step_distance') step_dist_256 = step_dist / (1 << mres) @@ -144,7 +144,7 @@ def get_config_stealthchop(config, tmc_freq): class TMC2130: def __init__(self, config): self.printer = config.get_printer() - self.name = config.get_name().split()[1] + self.name = config.get_name().split()[-1] self.spi = bus.MCU_SPI_from_config(config, 3, default_speed=4000000) # Allow virtual endstop to be created self.diag1_pin = config.get('diag1_pin', None) diff --git a/klippy/extras/tmc2208.py b/klippy/extras/tmc2208.py index 60bf5a20..ef476e3b 100644 --- a/klippy/extras/tmc2208.py +++ b/klippy/extras/tmc2208.py @@ -259,7 +259,7 @@ def decode_tmc2208_read(reg, data): class TMC2208: def __init__(self, config): self.printer = config.get_printer() - self.name = config.get_name().split()[1] + self.name = config.get_name().split()[-1] self.printer.register_event_handler("klippy:connect", self.handle_connect) # pin setup diff --git a/klippy/toolhead.py b/klippy/toolhead.py index 9c7369e8..32bda0fc 100644 --- a/klippy/toolhead.py +++ b/klippy/toolhead.py @@ -372,6 +372,7 @@ class ToolHead: self.kin.motor_off(last_move_time) for ext in kinematics.extruder.get_printer_extruders(self.printer): ext.motor_off(last_move_time) + self.printer.send_event("toolhead:motor_off", last_move_time) self.dwell(STALL_TIME) logging.debug('; Max time of %f', last_move_time) def wait_moves(self): |