Guest User

Untitled

a guest
Dec 13th, 2024
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.62 KB | None | 0 0
  1. # in klippy/stepper.py:
  2. # change:
  3. # for mname in ['stepper_enable', 'force_move', 'motion_report']:
  4. # to:
  5. # for mname in ['stepper_enable', 'force_move', 'motion_report', 'z_gantry_calibration']:
  6.  
  7. # Add z_gantry_calibration.py to klippy/extras with following content:
  8. import math
  9. import chelper
  10.  
  11. STALL_TIME = 0.100
  12.  
  13. # Calculate a move's accel_t, cruise_t, and cruise_v
  14. def calc_move_time(dist, speed, accel):
  15.     axis_r = 1.
  16.     if dist < 0.:
  17.         axis_r = -1.
  18.         dist = -dist
  19.     if not accel or not dist:
  20.         return axis_r, 0., dist / speed, speed
  21.     max_cruise_v2 = dist * accel
  22.     if max_cruise_v2 < speed**2:
  23.         speed = math.sqrt(max_cruise_v2)
  24.     accel_t = speed / accel
  25.     accel_decel_d = accel_t * speed
  26.     cruise_t = (dist - accel_decel_d) / speed
  27.     return axis_r, accel_t, cruise_t, speed
  28.  
  29. class ZGantryCalibHelper:
  30.     def __init__(self, config):
  31.         self.printer = config.get_printer()
  32.        
  33.         self.initial_z_height = config.getfloat('initial_z_height')
  34.         self.initial_move_speed = config.getfloat('initial_move_speed')
  35.         self.align_step_size = config.getfloat('align_step_size')
  36.         self.align_step_speed = config.getfloat('align_step_speed')
  37.         self.align_step_accel = config.getfloat('align_step_accel')
  38.         self.backtrack_distance = config.getfloat('backtrack_distance')
  39.  
  40.         ppins = self.printer.lookup_object('pins')
  41.         self.z_pin = ppins.setup_pin('endstop', config.get('z_pin'))
  42.         self.z1_pin = ppins.setup_pin('endstop', config.get('z1_pin'))
  43.  
  44.         self.steppers = {}
  45.  
  46.         ffi_main, ffi_lib = chelper.get_ffi()
  47.         self.trapq = ffi_main.gc(ffi_lib.trapq_alloc(), ffi_lib.trapq_free)
  48.         self.trapq_append = ffi_lib.trapq_append
  49.         self.trapq_finalize_moves = ffi_lib.trapq_finalize_moves
  50.         self.stepper_kinematics = ffi_main.gc(
  51.             ffi_lib.cartesian_stepper_alloc(b'x'), ffi_lib.free)
  52.  
  53.     def manual_move(self, stepper, dist, speed, accel=0.):
  54.         toolhead = self.printer.lookup_object('toolhead')
  55.         toolhead.flush_step_generation()
  56.         prev_sk = stepper.set_stepper_kinematics(self.stepper_kinematics)
  57.         prev_trapq = stepper.set_trapq(self.trapq)
  58.         stepper.set_position((0., 0., 0.))
  59.         axis_r, accel_t, cruise_t, cruise_v = calc_move_time(dist, speed, accel)
  60.         print_time = toolhead.get_last_move_time()
  61.         self.trapq_append(self.trapq, print_time, accel_t, cruise_t, accel_t,
  62.                           0., 0., 0., axis_r, 0., 0., 0., cruise_v, accel)
  63.         print_time = print_time + accel_t + cruise_t + accel_t
  64.         stepper.generate_steps(print_time)
  65.         self.trapq_finalize_moves(self.trapq, print_time + 99999.9,
  66.                                   print_time + 99999.9)
  67.         stepper.set_trapq(prev_trapq)
  68.         stepper.set_stepper_kinematics(prev_sk)
  69.         toolhead.note_mcu_movequeue_activity(print_time)
  70.         toolhead.dwell(accel_t + cruise_t + accel_t)
  71.         toolhead.flush_step_generation()
  72.  
  73.     def register_stepper(self, config, mcu_stepper):
  74.         self.steppers[mcu_stepper.get_name()] = mcu_stepper
  75.  
  76.     def do_z_calib(self):
  77.         toolhead = self.printer.lookup_object('toolhead')
  78.         gcode = self.printer.lookup_object('gcode')
  79.         initial_pos = toolhead.get_position()
  80.         initial_pos[2] = self.initial_z_height
  81.  
  82.         gcode = self.printer.lookup_object('gcode')
  83.        
  84.         gcode.respond_info('Alignment started')
  85.         gcode.respond_info('Gantry moving to initial position: Z' + str(self.initial_z_height))
  86.         toolhead.move(initial_pos, self.initial_move_speed)
  87.        
  88.         print_time = toolhead.get_last_move_time()
  89.         z_state = self.z_pin.query_endstop(print_time)
  90.         z1_state = self.z1_pin.query_endstop(print_time)
  91.  
  92.         while not z_state or not z1_state:
  93.             if not z_state:
  94.                 self.manual_move(self.steppers['stepper_z'], self.align_step_size, self.align_step_speed, self.align_step_accel)
  95.             if not z1_state:
  96.                 self.manual_move(self.steppers['stepper_z1'], self.align_step_size, self.align_step_speed, self.align_step_accel)
  97.  
  98.             print_time = toolhead.get_last_move_time()
  99.             z_state = self.z_pin.query_endstop(print_time)
  100.             z1_state = self.z1_pin.query_endstop(print_time)
  101.  
  102.         initial_pos[2] = initial_pos[2] - self.backtrack_distance
  103.         toolhead.move(initial_pos, self.initial_move_speed)
  104.         gcode.respond_info('Alignment finished, Z homing required')
  105.  
  106. class ZGantryCalib:
  107.     cmd_Z_GANTRY_CALIB_help = 'Auto Z gantry alignment'
  108.  
  109.     def __init__(self, config):
  110.         self.printer = config.get_printer()
  111.         self.plugin_helper = ZGantryCalibHelper(config)
  112.         gcode = self.printer.lookup_object('gcode')
  113.  
  114.         # make your gcode recognisable
  115.         gcode.register_command('Z_GANTRY_CALIBRATE', self.cmd_Z_GANTRY_CALIB, self.cmd_Z_GANTRY_CALIB_help)
  116.  
  117.     def register_stepper(self, config, mcu_stepper):
  118.         self.plugin_helper.register_stepper(config, mcu_stepper)
  119.  
  120.     def cmd_Z_GANTRY_CALIB(self, gcmd):
  121.         self.plugin_helper.do_z_calib()
  122.    
  123. def load_config(config):
  124.     return ZGantryCalib(config)
  125.  
  126. # Sample printer.cfg entry:
  127. [z_gantry_calibration]
  128. z_pin: ^PC13
  129. z1_pin: ^PC2
  130. initial_z_height: 200 # It will lift up gantry to this position before alignment for faster operation
  131. initial_move_speed: 10 # initial_z_height will use this speed
  132. align_step_size: 0.5 # Single step of single stepper during alignment operation
  133. align_step_speed: 5
  134. align_step_accel: 100
  135. backtrack_distance: 30 # Move gantry by this distance after alignment
  136.  
Advertisement
Add Comment
Please, Sign In to add comment