Example #1
0
 def __init__(self, toolhead, config):
     # Setup axis steppers
     stepper_bed = stepper.PrinterStepper(config.getsection('stepper_bed'),
                                          units_in_radians=True)
     rail_arm = stepper.PrinterRail(config.getsection('stepper_arm'))
     rail_z = stepper.LookupMultiRail(config.getsection('stepper_z'))
     stepper_bed.setup_itersolve('polar_stepper_alloc', 'a')
     rail_arm.setup_itersolve('polar_stepper_alloc', 'r')
     rail_z.setup_itersolve('cartesian_stepper_alloc', 'z')
     self.rails = [rail_arm, rail_z]
     self.steppers = [stepper_bed
                      ] + [s for r in self.rails for s in r.get_steppers()]
     for s in self.get_steppers():
         s.set_trapq(toolhead.get_trapq())
         toolhead.register_step_generator(s.generate_steps)
     config.get_printer().register_event_handler("stepper_enable:motor_off",
                                                 self._motor_off)
     # Setup boundary checks
     max_velocity, max_accel = toolhead.get_max_velocity()
     self.max_z_velocity = config.getfloat('max_z_velocity',
                                           max_velocity,
                                           above=0.,
                                           maxval=max_velocity)
     self.max_z_accel = config.getfloat('max_z_accel',
                                        max_accel,
                                        above=0.,
                                        maxval=max_accel)
     self.limit_z = (1.0, -1.0)
     self.limit_xy2 = -1.
     # Setup stepper max halt velocity
     max_halt_velocity = toolhead.get_max_axis_halt()
     stepper_bed.set_max_jerk(max_halt_velocity, max_accel)
     rail_arm.set_max_jerk(max_halt_velocity, max_accel)
     rail_z.set_max_jerk(max_halt_velocity, max_accel)
Example #2
0
 def __init__(self, config):
     self.printer = config.get_printer()
     self.name = config.get_name()
     shared_heater = config.get('shared_heater', None)
     pheater = self.printer.lookup_object('heater')
     if shared_heater is None:
         self.heater = pheater.setup_heater(config)
     else:
         self.heater = pheater.lookup_heater(shared_heater)
     self.stepper = stepper.PrinterStepper(config)
     self.nozzle_diameter = config.getfloat('nozzle_diameter', above=0.)
     filament_diameter = config.getfloat('filament_diameter',
                                         minval=self.nozzle_diameter)
     self.filament_area = math.pi * (filament_diameter * .5)**2
     max_cross_section = config.getfloat('max_extrude_cross_section',
                                         4. * self.nozzle_diameter**2,
                                         above=0.)
     self.max_extrude_ratio = max_cross_section / self.filament_area
     logging.info("Extruder max_extrude_ratio=%.6f", self.max_extrude_ratio)
     toolhead = self.printer.lookup_object('toolhead')
     max_velocity, max_accel = toolhead.get_max_velocity()
     self.max_e_velocity = config.getfloat('max_extrude_only_velocity',
                                           max_velocity *
                                           self.max_extrude_ratio,
                                           above=0.)
     self.max_e_accel = config.getfloat('max_extrude_only_accel',
                                        max_accel * self.max_extrude_ratio,
                                        above=0.)
     self.stepper.set_max_jerk(9999999.9, 9999999.9)
     self.max_e_dist = config.getfloat('max_extrude_only_distance',
                                       50.,
                                       minval=0.)
     self.activate_gcode = config.get('activate_gcode', '')
     self.deactivate_gcode = config.get('deactivate_gcode', '')
     self.pressure_advance = config.getfloat('pressure_advance',
                                             0.,
                                             minval=0.)
     self.pressure_advance_lookahead_time = config.getfloat(
         'pressure_advance_lookahead_time', 0.010, minval=0.)
     self.need_motor_enable = True
     self.extrude_pos = 0.
     # Setup iterative solver
     ffi_main, ffi_lib = chelper.get_ffi()
     self.cmove = ffi_main.gc(ffi_lib.move_alloc(), ffi_lib.free)
     self.extruder_move_fill = ffi_lib.extruder_move_fill
     sk = ffi_main.gc(ffi_lib.extruder_stepper_alloc(), ffi_lib.free)
     self.stepper.setup_itersolve(sk)
     # Setup SET_PRESSURE_ADVANCE command
     gcode = self.printer.lookup_object('gcode')
     if self.name in ('extruder', 'extruder0'):
         gcode.register_mux_command("SET_PRESSURE_ADVANCE",
                                    "EXTRUDER",
                                    None,
                                    self.cmd_default_SET_PRESSURE_ADVANCE,
                                    desc=self.cmd_SET_PRESSURE_ADVANCE_help)
     gcode.register_mux_command("SET_PRESSURE_ADVANCE",
                                "EXTRUDER",
                                self.name,
                                self.cmd_SET_PRESSURE_ADVANCE,
                                desc=self.cmd_SET_PRESSURE_ADVANCE_help)
Example #3
0
 def __init__(self, printer, config):
     self.heater = heater.PrinterHeater(printer, config)
     self.stepper = stepper.PrinterStepper(printer, config)
     self.nozzle_diameter = config.getfloat('nozzle_diameter', above=0.)
     filament_diameter = config.getfloat('filament_diameter',
                                         minval=self.nozzle_diameter)
     self.filament_area = math.pi * (filament_diameter * .5)**2
     max_cross_section = config.getfloat('max_extrude_cross_section',
                                         4. * self.nozzle_diameter**2,
                                         above=0.)
     self.max_extrude_ratio = max_cross_section / self.filament_area
     toolhead = printer.objects['toolhead']
     max_velocity, max_accel = toolhead.get_max_velocity()
     self.max_e_velocity = config.getfloat('max_extrude_only_velocity',
                                           max_velocity *
                                           self.max_extrude_ratio,
                                           above=0.)
     self.max_e_accel = config.getfloat('max_extrude_only_accel',
                                        max_accel * self.max_extrude_ratio,
                                        above=0.)
     self.stepper.set_max_jerk(9999999.9, 9999999.9)
     self.max_e_dist = config.getfloat('max_extrude_only_distance',
                                       50.,
                                       minval=0.)
     self.activate_gcode = config.get('activate_gcode', '')
     self.deactivate_gcode = config.get('deactivate_gcode', '')
     self.pressure_advance = config.getfloat('pressure_advance',
                                             0.,
                                             minval=0.)
     self.pressure_advance_lookahead_time = 0.
     if self.pressure_advance:
         self.pressure_advance_lookahead_time = config.getfloat(
             'pressure_advance_lookahead_time', 0.010, minval=0.)
     self.need_motor_enable = True
     self.extrude_pos = 0.
Example #4
0
 def __init__(self, printer, config):
     self.config = config
     self.heater = heater.PrinterHeater(printer, config)
     self.stepper = stepper.PrinterStepper(printer, config, 'extruder')
     self.nozzle_diameter = config.getfloat('nozzle_diameter', above=0.)
     filament_diameter = config.getfloat('filament_diameter',
                                         minval=self.nozzle_diameter)
     filament_area = math.pi * (filament_diameter * .5)**2
     max_cross_section = config.getfloat('max_extrude_cross_section',
                                         4. * self.nozzle_diameter**2,
                                         above=0.)
     self.max_extrude_ratio = max_cross_section / filament_area
     self.max_e_dist = config.getfloat('max_extrude_only_distance',
                                       50.,
                                       minval=0.)
     self.max_e_velocity = self.max_e_accel = None
     self.activate_gcode = config.get('activate_gcode', '')
     self.deactivate_gcode = config.get('deactivate_gcode', '')
     self.pressure_advance = config.getfloat('pressure_advance',
                                             0.,
                                             minval=0.)
     self.pressure_advance_lookahead_time = 0.
     if self.pressure_advance:
         self.pressure_advance_lookahead_time = config.getfloat(
             'pressure_advance_lookahead_time', 0.010, minval=0.)
     self.need_motor_enable = True
     self.extrude_pos = 0.
Example #5
0
 def __init__(self, toolhead, config):
     # Setup axis steppers
     stepper_bed = stepper.PrinterStepper(config.getsection('stepper_bed'))
     rail_arm = stepper.PrinterRail(config.getsection('stepper_arm'))
     rail_z = stepper.LookupMultiRail(config.getsection('stepper_z'))
     stepper_bed.setup_itersolve('polar_stepper_alloc', 'a')
     rail_arm.setup_itersolve('polar_stepper_alloc', 'r')
     rail_z.setup_itersolve('cartesian_stepper_alloc', 'z')
     self.rails = [rail_arm, rail_z]
     self.steppers = [stepper_bed
                      ] + [s for r in self.rails for s in r.get_steppers()]
     # Setup boundary checks
     max_velocity, max_accel = toolhead.get_max_velocity()
     self.max_z_velocity = config.getfloat('max_z_velocity',
                                           max_velocity,
                                           above=0.,
                                           maxval=max_velocity)
     self.max_z_accel = config.getfloat('max_z_accel',
                                        max_accel,
                                        above=0.,
                                        maxval=max_accel)
     self.need_motor_enable = True
     self.limit_z = [(1.0, -1.0)]
     self.limit_xy2 = -1.
     # Setup stepper max halt velocity
     max_halt_velocity = toolhead.get_max_axis_halt()
     stepper_bed.set_max_jerk(max_halt_velocity, max_accel)
     rail_arm.set_max_jerk(max_halt_velocity, max_accel)
     rail_z.set_max_jerk(max_halt_velocity, max_accel)
Example #6
0
 def __init__(self, toolhead, config):
     # Setup steppers at each anchor
     self.steppers = []
     self.anchors = []
     for i in range(26):
         name = 'stepper_' + chr(ord('a') + i)
         if i >= 3 and not config.has_section(name):
             break
         stepper_config = config.getsection(name)
         s = stepper.PrinterStepper(stepper_config)
         self.steppers.append(s)
         a = tuple([stepper_config.getfloat('anchor_' + n) for n in 'xyz'])
         self.anchors.append(a)
         s.setup_itersolve('winch_stepper_alloc', *a)
         s.set_trapq(toolhead.get_trapq())
         toolhead.register_step_generator(s.generate_steps)
     # Setup stepper max halt velocity
     max_velocity, max_accel = toolhead.get_max_velocity()
     max_halt_velocity = toolhead.get_max_axis_halt()
     for s in self.steppers:
         s.set_max_jerk(max_halt_velocity, max_accel)
     # Setup boundary checks
     acoords = list(zip(*self.anchors))
     self.axes_min = toolhead.Coord(*[min(a) for a in acoords], e=0.)
     self.axes_max = toolhead.Coord(*[max(a) for a in acoords], e=0.)
     self.set_position([0., 0., 0.], ())
Example #7
0
 def __init__(self, config):
     self.printer = config.get_printer()
     if config.get('endstop_pin', None) is not None:
         self.can_home = True
         self.rail = stepper.PrinterRail(config,
                                         need_position_minmax=False,
                                         default_position_endstop=0.)
         self.steppers = self.rail.get_steppers()
     else:
         self.can_home = False
         self.rail = stepper.PrinterStepper(config)
         self.steppers = [self.rail]
     self.velocity = config.getfloat('velocity', 5., above=0.)
     self.accel = config.getfloat('accel', 0., minval=0.)
     self.next_cmd_time = 0.
     # Setup iterative solver
     ffi_main, ffi_lib = chelper.get_ffi()
     self.trapq = ffi_main.gc(ffi_lib.trapq_alloc(), ffi_lib.trapq_free)
     self.trapq_append = ffi_lib.trapq_append
     self.trapq_free_moves = ffi_lib.trapq_free_moves
     self.rail.setup_itersolve('cartesian_stepper_alloc', 'x')
     self.rail.set_trapq(self.trapq)
     self.rail.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)
Example #8
0
 def __init__(self, config):
     self.printer = config.get_printer()
     self.name = config.get_name().split()[-1]
     self.pressure_advance = self.pressure_advance_smooth_time = 0.
     # Setup stepper
     self.stepper = stepper.PrinterStepper(config)
     ffi_main, ffi_lib = chelper.get_ffi()
     self.sk_extruder = ffi_main.gc(ffi_lib.extruder_stepper_alloc(),
                                    ffi_lib.free)
     self.stepper.set_stepper_kinematics(self.sk_extruder)
     # Register commands
     self.printer.register_event_handler("klippy:connect",
                                         self._handle_connect)
     gcode = self.printer.lookup_object('gcode')
     if self.name == 'extruder':
         gcode.register_mux_command("SET_PRESSURE_ADVANCE", "EXTRUDER", None,
                                    self.cmd_default_SET_PRESSURE_ADVANCE,
                                    desc=self.cmd_SET_PRESSURE_ADVANCE_help)
     gcode.register_mux_command("SET_PRESSURE_ADVANCE", "EXTRUDER",
                                self.name, self.cmd_SET_PRESSURE_ADVANCE,
                                desc=self.cmd_SET_PRESSURE_ADVANCE_help)
     gcode.register_mux_command("SET_EXTRUDER_STEP_DISTANCE", "EXTRUDER",
                                self.name, self.cmd_SET_E_STEP_DISTANCE,
                                desc=self.cmd_SET_E_STEP_DISTANCE_help)
     gcode.register_mux_command("SYNC_STEPPER_TO_EXTRUDER", "STEPPER",
                                self.name, self.cmd_SYNC_STEPPER_TO_EXTRUDER,
                                desc=self.cmd_SYNC_STEPPER_TO_EXTRUDER_help)
Example #9
0
 def __init__(self, config, extruder_num):
     self.printer = config.get_printer()
     self.name = config.get_name()
     shared_heater = config.get('shared_heater', None)
     pheater = self.printer.lookup_object('heater')
     gcode_id = 'T%d' % (extruder_num,)
     if shared_heater is None:
         self.heater = pheater.setup_heater(config, gcode_id)
     else:
         self.heater = pheater.lookup_heater(shared_heater)
     self.stepper = stepper.PrinterStepper(config)
     self.nozzle_diameter = config.getfloat('nozzle_diameter', above=0.)
     filament_diameter = config.getfloat(
         'filament_diameter', minval=self.nozzle_diameter)
     self.filament_area = math.pi * (filament_diameter * .5)**2
     def_max_cross_section = 4. * self.nozzle_diameter**2
     def_max_extrude_ratio = def_max_cross_section / self.filament_area
     max_cross_section = config.getfloat(
         'max_extrude_cross_section', def_max_cross_section, above=0.)
     self.max_extrude_ratio = max_cross_section / self.filament_area
     logging.info("Extruder max_extrude_ratio=%.6f", self.max_extrude_ratio)
     toolhead = self.printer.lookup_object('toolhead')
     max_velocity, max_accel = toolhead.get_max_velocity()
     self.max_e_velocity = config.getfloat(
         'max_extrude_only_velocity', max_velocity * def_max_extrude_ratio
         , above=0.)
     self.max_e_accel = config.getfloat(
         'max_extrude_only_accel', max_accel * def_max_extrude_ratio
         , above=0.)
     self.stepper.set_max_jerk(9999999.9, 9999999.9)
     self.max_e_dist = config.getfloat(
         'max_extrude_only_distance', 50., minval=0.)
     gcode_macro = self.printer.try_load_module(config, 'gcode_macro')
     self.activate_gcode = gcode_macro.load_template(
         config, 'activate_gcode', '')
     self.deactivate_gcode = gcode_macro.load_template(
         config, 'deactivate_gcode', '')
     self.pressure_advance = config.getfloat(
         'pressure_advance', 0., minval=0.)
     self.pressure_advance_lookahead_time = config.getfloat(
         'pressure_advance_lookahead_time', 0.010, minval=0.)
     self.extrude_pos = 0.
     # Setup iterative solver
     ffi_main, ffi_lib = chelper.get_ffi()
     self.extruder_add_move = ffi_lib.extruder_add_move
     self.trapq = ffi_main.gc(ffi_lib.trapq_alloc(), ffi_lib.trapq_free)
     self.trapq_free_moves = ffi_lib.trapq_free_moves
     self.stepper.setup_itersolve('extruder_stepper_alloc')
     self.stepper.set_trapq(self.trapq)
     toolhead.register_step_generator(self.stepper.generate_steps)
     toolhead.register_step_generator(self._free_moves)
     # Setup SET_PRESSURE_ADVANCE command
     gcode = self.printer.lookup_object('gcode')
     if self.name == 'extruder':
         gcode.register_mux_command("SET_PRESSURE_ADVANCE", "EXTRUDER", None,
                                    self.cmd_default_SET_PRESSURE_ADVANCE,
                                    desc=self.cmd_SET_PRESSURE_ADVANCE_help)
     gcode.register_mux_command("SET_PRESSURE_ADVANCE", "EXTRUDER",
                                self.name, self.cmd_SET_PRESSURE_ADVANCE,
                                desc=self.cmd_SET_PRESSURE_ADVANCE_help)
Example #10
0
 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)
Example #11
0
 def __init__(self, config):
     self.printer = printer = config.get_printer()
     self.name = config.get_name()
     self.logger = printer.logger.getChild(self.name)
     self.config = config
     self.index = int(self.name[8:])
     self.heater = printer.lookup_object(config.get('heater'))
     self.heater.set_min_extrude_temp(config.getfloat('min_extrude_temp',
                                                      170.0))
     self.stepper = stepper.PrinterStepper(config, self.logger)
     self.nozzle_diameter = config.getfloat('nozzle_diameter', above=0.)
     filament_diameter = config.getfloat(
         'filament_diameter', minval=self.nozzle_diameter)
     self.filament_area = math.pi * (filament_diameter * .5)**2
     max_cross_section = config.getfloat(
         'max_extrude_cross_section', 4. * self.nozzle_diameter**2
         , above=0.)
     self.max_extrude_ratio = max_cross_section / self.filament_area
     self.logger.info("Extruder max_extrude_ratio=%.6f", self.max_extrude_ratio)
     self.toolhead = toolhead = printer.lookup_object('toolhead')
     max_velocity, max_accel = toolhead.get_max_velocity()
     self.max_e_velocity = config.getfloat(
         'max_extrude_only_velocity', max_velocity * self.max_extrude_ratio
         , above=0.)
     self.max_e_accel = config.getfloat(
         'max_extrude_only_accel', max_accel * self.max_extrude_ratio
         , above=0.)
     self.stepper.set_max_jerk(9999999.9, 9999999.9)
     self.max_e_dist = config.getfloat(
         'max_extrude_only_distance', 50., minval=0.)
     self.activate_gcode = config.get('activate_gcode', '')
     self.deactivate_gcode = config.get('deactivate_gcode', '')
     self.pressure_advance = config.getfloat(
         'pressure_advance', 0., minval=0.)
     self.pressure_advance_lookahead_time = config.getfloat(
         'pressure_advance_lookahead_time', 0.010, minval=0.)
     self.need_motor_enable = True
     self.extrude_pos = 0.
     self.raw_filament = 0.
     self.extrude_factor = config.getfloat(
         'extrusion_factor', 1.0, minval=0.1)
     # Setup iterative solver
     ffi_main, ffi_lib = chelper.get_ffi()
     self.cmove = ffi_main.gc(ffi_lib.move_alloc(), ffi_lib.free)
     self.extruder_move_fill = ffi_lib.extruder_move_fill
     sk = ffi_main.gc(ffi_lib.extruder_stepper_alloc(), ffi_lib.free)
     self.stepper.setup_itersolve(sk)
     # Setup SET_PRESSURE_ADVANCE command
     gcode = self.printer.lookup_object('gcode')
     if self.name in ('extruder', 'extruder0'):
         gcode.register_mux_command("SET_PRESSURE_ADVANCE", "EXTRUDER", None,
                                    self.cmd_default_SET_PRESSURE_ADVANCE,
                                    desc=self.cmd_SET_PRESSURE_ADVANCE_help)
     for key in [self.name.upper(), str(self.index)]:
         gcode.register_mux_command("SET_PRESSURE_ADVANCE", "EXTRUDER", key,
                                    self.cmd_SET_PRESSURE_ADVANCE,
                                    desc=self.cmd_SET_PRESSURE_ADVANCE_help)
     self.logger.debug("index={}, heater={}".
                       format(self.index, self.heater.name))
Example #12
0
 def __init__(self, config):
     self.printer = config.get_printer()
     self.extruder_name = config.get('extruder', 'extruder')
     self.stepper = stepper.PrinterStepper(config)
     self.stepper.set_max_jerk(9999999.9, 9999999.9)
     self.stepper.setup_itersolve('extruder_stepper_alloc')
     self.printer.register_event_handler("klippy:connect",
                                         self.handle_connect)
Example #13
0
 def __init__(self, printer, config):
     self.steppers = [
         stepper.PrinterStepper(printer, config.getsection('stepper_' + n),
                                n) for n in ['x', 'y', 'z']
     ]
     self.max_z_velocity = config.getfloat('max_z_velocity', 9999999.9)
     self.max_z_accel = config.getfloat('max_z_accel', 9999999.9)
     self.need_motor_enable = True
     self.limits = [(1.0, -1.0)] * 3
Example #14
0
 def __init__(self, config):
     self.printer = config.get_printer()
     stepper_name = config.get_name().split()[1]
     self.extruder_name = config.get('extruder', 'extruder')
     self.stepper = stepper.PrinterStepper(config)
     self.stepper.setup_itersolve('extruder_stepper_alloc')
     self.printer.register_event_handler("klippy:connect",
                                         self.handle_connect)
     gcode = self.printer.lookup_object('gcode')
     gcode.register_mux_command("SYNC_STEPPER_TO_EXTRUDER",
                                "STEPPER",
                                stepper_name,
                                self.cmd_SYNC_STEPPER_TO_EXTRUDER,
                                desc=self.cmd_SYNC_STEPPER_TO_EXTRUDER_help)
Example #15
0
 def __init__(self, printer, config):
     self.config = config
     self.heater = heater.PrinterHeater(printer, config)
     self.stepper = stepper.PrinterStepper(printer, config, 'extruder')
     nozzle_diameter = config.getfloat('nozzle_diameter')
     filament_diameter = config.getfloat('filament_diameter')
     filament_area = math.pi * (filament_diameter * .5)**2
     max_cross_section = config.getfloat(
         'max_extrude_cross_section', 4. * nozzle_diameter**2)
     self.max_extrude_ratio = max_cross_section / filament_area
     self.max_e_dist = config.getfloat('max_extrude_only_distance', 50.)
     self.max_e_velocity = self.max_e_accel = None
     self.pressure_advance = config.getfloat('pressure_advance', 0.)
     self.need_motor_enable = True
     self.extrude_pos = 0.
Example #16
0
    def __init__(self, printer, config):
        self.config = config
        self.steppers = [
            stepper.PrinterStepper(printer, config.getsection('stepper_' + n),
                                   n) for n in ['a', 'b', 'c']
        ]
        self.need_motor_enable = self.need_home = True
        self.max_velocity = self.max_z_velocity = self.max_accel = 0.
        radius = config.getfloat('delta_radius', above=0.)
        arm_length = config.getfloat('delta_arm_length', above=radius)
        self.arm_length2 = arm_length**2
        self.limit_xy2 = -1.
        tower_height_at_zeros = math.sqrt(self.arm_length2 - radius**2)
        self.max_z = min([s.position_endstop for s in self.steppers])
        self.limit_z = self.max_z - (arm_length - tower_height_at_zeros)
        logging.info(
            "Delta max build height %.2fmm (radius tapered above %.2fmm)" %
            (self.max_z, self.limit_z))
        # Determine tower locations in cartesian space
        angles = [
            config.getsection('stepper_a').getfloat('angle', 210.),
            config.getsection('stepper_b').getfloat('angle', 330.),
            config.getsection('stepper_c').getfloat('angle', 90.)
        ]
        self.towers = [(math.cos(math.radians(angle)) * radius,
                        math.sin(math.radians(angle)) * radius)
                       for angle in angles]
        # Find the point where an XY move could result in excessive
        # tower movement
        half_min_step_dist = min([s.step_dist for s in self.steppers]) * .5

        def ratio_to_dist(ratio):
            return (
                ratio * math.sqrt(self.arm_length2 /
                                  (ratio**2 + 1.) - half_min_step_dist**2) +
                half_min_step_dist)

        self.slow_xy2 = (ratio_to_dist(SLOW_RATIO) - radius)**2
        self.very_slow_xy2 = (ratio_to_dist(2. * SLOW_RATIO) - radius)**2
        self.max_xy2 = min(radius, arm_length - radius,
                           ratio_to_dist(4. * SLOW_RATIO) - radius)**2
        logging.info(
            "Delta max build radius %.2fmm (moves slowed past %.2fmm and %.2fmm)"
            % (math.sqrt(self.max_xy2), math.sqrt(
                self.slow_xy2), math.sqrt(self.very_slow_xy2)))
        self.set_position([0., 0., 0.])
Example #17
0
 def __init__(self, printer, config):
     self.printer = printer
     self.name = config.get_name()
     shared_heater = config.get('shared_heater', None)
     pheater = printer.lookup_object('heater')
     if shared_heater is None:
         self.heater = pheater.setup_heater(config)
     else:
         self.heater = pheater.lookup_heater(shared_heater)
     self.stepper = stepper.PrinterStepper(printer, config)
     self.nozzle_diameter = config.getfloat('nozzle_diameter', above=0.)
     filament_diameter = config.getfloat('filament_diameter',
                                         minval=self.nozzle_diameter)
     self.filament_area = math.pi * (filament_diameter * .5)**2
     max_cross_section = config.getfloat('max_extrude_cross_section',
                                         4. * self.nozzle_diameter**2,
                                         above=0.)
     self.max_extrude_ratio = max_cross_section / self.filament_area
     toolhead = printer.lookup_object('toolhead')
     max_velocity, max_accel = toolhead.get_max_velocity()
     self.max_e_velocity = config.getfloat('max_extrude_only_velocity',
                                           max_velocity *
                                           self.max_extrude_ratio,
                                           above=0.)
     self.max_e_accel = config.getfloat('max_extrude_only_accel',
                                        max_accel * self.max_extrude_ratio,
                                        above=0.)
     self.stepper.set_max_jerk(9999999.9, 9999999.9)
     self.max_e_dist = config.getfloat('max_extrude_only_distance',
                                       50.,
                                       minval=0.)
     self.activate_gcode = config.get('activate_gcode', '')
     self.deactivate_gcode = config.get('deactivate_gcode', '')
     self.pressure_advance = config.getfloat('pressure_advance',
                                             0.,
                                             minval=0.)
     self.pressure_advance_lookahead_time = config.getfloat(
         'pressure_advance_lookahead_time', 0.010, minval=0.)
     self.need_motor_enable = True
     self.extrude_pos = 0.
     self.printer.lookup_object('gcode').register_command(
         "SET_PRESSURE_ADVANCE",
         self.cmd_SET_PRESSURE_ADVANCE,
         desc=self.cmd_SET_PRESSURE_ADVANCE_help)
Example #18
0
 def __init__(self, printer, config):
     self.steppers = [
         stepper.PrinterStepper(printer, config.getsection('stepper_' + n),
                                n) for n in ['a', 'b', 'c']
     ]
     self.need_motor_enable = True
     self.max_z_velocity = config.getfloat('max_z_velocity', 9999999.9)
     radius = config.getfloat('delta_radius')
     arm_length = config.getfloat('delta_arm_length')
     self.arm_length2 = arm_length**2
     self.max_xy2 = min(radius, arm_length - radius)**2
     self.limit_xy2 = -1.
     tower_height_at_zeros = math.sqrt(self.arm_length2 - radius**2)
     self.max_z = self.steppers[0].position_max
     self.limit_z = self.max_z - (arm_length - tower_height_at_zeros)
     sin = lambda angle: math.sin(math.radians(angle))
     cos = lambda angle: math.cos(math.radians(angle))
     self.towers = [(cos(210.) * radius, sin(210.) * radius),
                    (cos(330.) * radius, sin(330.) * radius),
                    (cos(90.) * radius, sin(90.) * radius)]
Example #19
0
 def __init__(self, toolhead, config):
     # Setup steppers at each anchor
     self.steppers = []
     self.anchors = []
     for i in range(26):
         name = 'stepper_' + chr(ord('a') + i)
         if i >= 3 and not config.has_section(name):
             break
         stepper_config = config.getsection(name)
         s = stepper.PrinterStepper(stepper_config)
         self.steppers.append(s)
         a = tuple([stepper_config.getfloat('anchor_' + n) for n in 'xyz'])
         self.anchors.append(a)
         s.setup_itersolve('winch_stepper_alloc', *a)
     # Setup stepper max halt velocity
     max_velocity, max_accel = toolhead.get_max_velocity()
     max_halt_velocity = toolhead.get_max_axis_halt()
     for s in self.steppers:
         s.set_max_jerk(max_halt_velocity, max_accel)
     # Setup boundary checks
     self.need_motor_enable = True
     self.set_position([0., 0., 0.], ())
Example #20
0
 def __init__(self, config, extruder_num):
     self.printer = config.get_printer()
     self.name = config.get_name()
     shared_heater = config.get('shared_heater', None)
     pheater = self.printer.lookup_object('heater')
     gcode_id = 'T%d' % (extruder_num, )
     if shared_heater is None:
         self.heater = pheater.setup_heater(config, gcode_id)
     else:
         self.heater = pheater.lookup_heater(shared_heater)
     self.stepper = stepper.PrinterStepper(config)
     self.nozzle_diameter = config.getfloat('nozzle_diameter', above=0.)
     filament_diameter = config.getfloat('filament_diameter',
                                         minval=self.nozzle_diameter)
     self.filament_area = math.pi * (filament_diameter * .5)**2
     def_max_cross_section = 4. * self.nozzle_diameter**2
     def_max_extrude_ratio = def_max_cross_section / self.filament_area
     max_cross_section = config.getfloat('max_extrude_cross_section',
                                         def_max_cross_section,
                                         above=0.)
     self.max_extrude_ratio = max_cross_section / self.filament_area
     logging.info("Extruder max_extrude_ratio=%.6f", self.max_extrude_ratio)
     toolhead = self.printer.lookup_object('toolhead')
     max_velocity, max_accel = toolhead.get_max_velocity()
     self.max_e_velocity = config.getfloat('max_extrude_only_velocity',
                                           max_velocity *
                                           def_max_extrude_ratio,
                                           above=0.)
     self.max_e_accel = config.getfloat('max_extrude_only_accel',
                                        max_accel * def_max_extrude_ratio,
                                        above=0.)
     self.stepper.set_max_jerk(9999999.9, 9999999.9)
     self.max_e_dist = config.getfloat('max_extrude_only_distance',
                                       50.,
                                       minval=0.)
     self.instant_corner_v = config.getfloat(
         'instantaneous_corner_velocity', 1., minval=0.)
     self.pressure_advance = self.pressure_advance_smooth_time = 0.
     pressure_advance = config.getfloat('pressure_advance', 0., minval=0.)
     smooth_time = config.getfloat('pressure_advance_smooth_time',
                                   0.040,
                                   above=0.,
                                   maxval=.200)
     # Setup iterative solver
     ffi_main, ffi_lib = chelper.get_ffi()
     self.trapq = ffi_main.gc(ffi_lib.trapq_alloc(), ffi_lib.trapq_free)
     self.trapq_append = ffi_lib.trapq_append
     self.trapq_free_moves = ffi_lib.trapq_free_moves
     self.sk_extruder = ffi_main.gc(ffi_lib.extruder_stepper_alloc(),
                                    ffi_lib.free)
     self.stepper.set_stepper_kinematics(self.sk_extruder)
     self.stepper.set_trapq(self.trapq)
     toolhead.register_step_generator(self.stepper.generate_steps)
     self.extruder_set_smooth_time = ffi_lib.extruder_set_smooth_time
     self._set_pressure_advance(pressure_advance, smooth_time)
     # Register commands
     gcode = self.printer.lookup_object('gcode')
     if self.name == 'extruder':
         toolhead.set_extruder(self, 0.)
         gcode.register_command("M104", self.cmd_M104)
         gcode.register_command("M109", self.cmd_M109)
         gcode.register_mux_command("SET_PRESSURE_ADVANCE",
                                    "EXTRUDER",
                                    None,
                                    self.cmd_default_SET_PRESSURE_ADVANCE,
                                    desc=self.cmd_SET_PRESSURE_ADVANCE_help)
     gcode.register_mux_command("SET_PRESSURE_ADVANCE",
                                "EXTRUDER",
                                self.name,
                                self.cmd_SET_PRESSURE_ADVANCE,
                                desc=self.cmd_SET_PRESSURE_ADVANCE_help)
     gcode.register_mux_command("ACTIVATE_EXTRUDER",
                                "EXTRUDER",
                                self.name,
                                self.cmd_ACTIVATE_EXTRUDER,
                                desc=self.cmd_ACTIVATE_EXTRUDER_help)