|
|
@@ -30,8 +30,10 @@ class MagDistributor:
|
|
|
self.full_rot_steps = 3200 # Assuming 3200 steps for a full rotation
|
|
|
self.linear_length_mm = config.mag_distributor.length_mm
|
|
|
self.steps_per_mm = self.full_rot_steps / 40 # Assuming 40mm per rotation
|
|
|
- self.max_speed = config.mag_distributor.max_speed # mm/s
|
|
|
- self.home_speed = config.mag_distributor.home_speed # mm/s
|
|
|
+ self.max_speed_mms = config.mag_distributor.max_speed_mms # mm/s
|
|
|
+ self.home_speed_mms = config.mag_distributor.home_speed_mms # mm/s
|
|
|
+
|
|
|
+ self.debug = config.mag_distributor.debug
|
|
|
|
|
|
# Current position tracking (steps or mm/deg)
|
|
|
self.curr_pos_mm = 0
|
|
|
@@ -57,7 +59,7 @@ class MagDistributor:
|
|
|
"""Home both axes using endstops."""
|
|
|
self.logger.info("Homing linear axis...")
|
|
|
max_linear_steps = int(self.linear_length_mm * self.steps_per_mm)
|
|
|
- home_step_delay = self._speed_to_step_delay(self.home_speed)
|
|
|
+ home_step_delay = self._speed_to_step_delay(self.home_speed_mms)
|
|
|
await self._home_axis(self.linear_dir_pin, self.linear_step_pin, self.linear_limit_pin, axis='linear', max_steps=max_linear_steps, step_delay=home_step_delay)
|
|
|
self.curr_pos_mm = 0
|
|
|
self.logger.info("Homing rotational axis...")
|
|
|
@@ -66,6 +68,8 @@ class MagDistributor:
|
|
|
self.logger.info("Mag distributor homed successfully.")
|
|
|
|
|
|
async def _home_axis(self, dir_pin, step_pin, endstop_pin, axis='linear', max_steps = 10000, step_delay=200):
|
|
|
+ if self.debug:
|
|
|
+ return
|
|
|
# Move in negative direction until endstop is triggered
|
|
|
for _ in range(max_steps):
|
|
|
if self.gpio.get_pin(endstop_pin):
|
|
|
@@ -77,6 +81,8 @@ class MagDistributor:
|
|
|
self.logger.info(f"{axis} axis homed.")
|
|
|
|
|
|
def move_mag_distributor_at_pos(self, pos_target, rot_target, step_delay=None):
|
|
|
+ if self.debug:
|
|
|
+ return
|
|
|
self.logger.info(f"Moving mag distributor to linear: {pos_target} mm, rot: {rot_target} deg")
|
|
|
linear_steps = int(abs(pos_target - self.curr_pos_mm) * self.steps_per_mm)
|
|
|
rot_steps = int(abs(rot_target - self.curr_rot_deg) / 360 * self.full_rot_steps)
|
|
|
@@ -84,7 +90,7 @@ class MagDistributor:
|
|
|
rot_dir = True if rot_target > self.curr_rot_deg else False
|
|
|
# Use max speed for normal moves if not specified
|
|
|
if step_delay is None:
|
|
|
- step_delay = self._speed_to_step_delay(self.max_speed)
|
|
|
+ step_delay = self._speed_to_step_delay(self.max_speed_mms)
|
|
|
if linear_steps > 0:
|
|
|
self.gpio.do_step(self.linear_dir_pin, self.linear_step_pin, linear_steps, step_delay, linear_dir)
|
|
|
self.curr_pos_mm = pos_target
|
|
|
@@ -101,7 +107,7 @@ class MagDistributor:
|
|
|
Move a cell from a magazine to the feeder.
|
|
|
If magazine_id is None, use current_magazine and try next if pick fails.
|
|
|
"""
|
|
|
- magazines = self.config.feeder.magazines
|
|
|
+ magazines = self.config.feeder_magazines
|
|
|
if magazine_id is not None:
|
|
|
mags_to_try = [magazine_id]
|
|
|
else:
|
|
|
@@ -111,15 +117,12 @@ class MagDistributor:
|
|
|
|
|
|
# Check if cell can be picked from magazines, if not add to empty magazines and continue
|
|
|
for mag_id in mags_to_try:
|
|
|
- x_pos = magazines[mag_id].x_pos
|
|
|
- rot_deg = magazines[mag_id].rot_deg
|
|
|
- self.move_mag_distributor_at_pos(x_pos, rot_deg)
|
|
|
+ pos = magazines[mag_id].mag_pos
|
|
|
+ self.move_mag_distributor_at_pos(pos.pos_mm, pos.rot_deg)
|
|
|
# Check cell pick sensor
|
|
|
- if self.gpio.get_pin(self.mag_dist_sensor_pin):
|
|
|
+ if self.mag_dist_sensor_pin and self.gpio.get_pin(self.mag_dist_sensor_pin):
|
|
|
pos = self.config.feeder.mag_pos
|
|
|
- x_pos = magazines[mag_id].x_pos
|
|
|
- rot_deg = magazines[mag_id].rot_deg
|
|
|
- self.move_mag_distributor_at_pos(pos[0], pos[1])
|
|
|
+ self.move_mag_distributor_at_pos(pos.pos_mm, pos.rot_deg)
|
|
|
self.logger.info(f"Cell successfully picked from magazine {mag_id} and deposited to feeder.")
|
|
|
self.current_magazine = mag_id # update current
|
|
|
return
|
|
|
@@ -135,22 +138,23 @@ class MagDistributor:
|
|
|
Includes checks for valid magazine_id and sensor confirmation.
|
|
|
"""
|
|
|
# Check magazine_id validity
|
|
|
- magazines = self.config.defeeder.magazines
|
|
|
+ magazines = self.config.defeeder_magazines
|
|
|
if magazine_id < 0 or magazine_id >= len(magazines):
|
|
|
self.logger.error(f"Invalid magazine_id: {magazine_id}")
|
|
|
return
|
|
|
|
|
|
# Move to defeeder position
|
|
|
pos = self.config.defeeder.mag_pos
|
|
|
- self.move_mag_distributor_at_pos(pos[0], pos[1])
|
|
|
+ self.move_mag_distributor_at_pos(pos.pos_mm, pos.rot_deg)
|
|
|
|
|
|
# Optionally check for cell presence at defeeder (if sensor available)
|
|
|
- if not self.gpio.get_pin(self.mag_dist_sensor_pin):
|
|
|
+ if self.mag_dist_sensor_pin and not self.gpio.get_pin(self.mag_dist_sensor_pin):
|
|
|
self.logger.warning("No cell detected at defeeder position.")
|
|
|
return
|
|
|
|
|
|
# Move to target magazine position
|
|
|
- self.move_mag_distributor_at_pos(magazines[magazine_id].x_pos, magazines[magazine_id].rot_deg)
|
|
|
+ pos = magazines[magazine_id].mag_pos
|
|
|
+ self.move_mag_distributor_at_pos(pos.pos_mm, pos.rot_deg)
|
|
|
|
|
|
# Optionally check for successful placement (if sensor logic applies)
|
|
|
self.logger.info(f"Cell collected from defeeder and moved to magazine {magazine_id}.")
|