From 48499664fe9eaa7bdf01926d834b9b8943dcb01f Mon Sep 17 00:00:00 2001 From: esto-openscan <193278706+esto-openscan@users.noreply.github.com> Date: Fri, 13 Feb 2026 15:13:07 +0000 Subject: [PATCH 1/3] added custom model and board - added reverse logic endstop --- .local/state/lesshst | 1 + .local/state/wireplumber/stream-properties | 2 ++ openscan_firmware/config/endstop.py | 1 + .../controllers/hardware/endstops.py | 3 +- openscan_firmware/models/scanner.py | 4 ++- settings/device/default_miciomax.json | 34 +++++++++++++++++++ 6 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 .local/state/lesshst create mode 100644 .local/state/wireplumber/stream-properties create mode 100644 settings/device/default_miciomax.json diff --git a/.local/state/lesshst b/.local/state/lesshst new file mode 100644 index 0000000..4d1c30b --- /dev/null +++ b/.local/state/lesshst @@ -0,0 +1 @@ +.less-history-file: diff --git a/.local/state/wireplumber/stream-properties b/.local/state/wireplumber/stream-properties new file mode 100644 index 0000000..447bb5f --- /dev/null +++ b/.local/state/wireplumber/stream-properties @@ -0,0 +1,2 @@ +[stream-properties] +Audio/Sink:node.name:auto_null={"channelMap":["FL", "FR"], "mute":false, "channelVolumes":[1.000000, 1.000000], "volume":1.000000} diff --git a/openscan_firmware/config/endstop.py b/openscan_firmware/config/endstop.py index 25ea729..d751ff5 100644 --- a/openscan_firmware/config/endstop.py +++ b/openscan_firmware/config/endstop.py @@ -19,3 +19,4 @@ class EndstopConfig(BaseModel): pull_up: Optional[bool] = Field(True, description="Whether to use a pull-up resistor") bounce_time: Optional[float] = Field(0.005, description="Debounce time for the button in seconds") + active_high: Optional[bool] = Field(False, description="Useful for normally closed switches") diff --git a/openscan_firmware/controllers/hardware/endstops.py b/openscan_firmware/controllers/hardware/endstops.py index 929d93d..75aa4ea 100644 --- a/openscan_firmware/controllers/hardware/endstops.py +++ b/openscan_firmware/controllers/hardware/endstops.py @@ -87,10 +87,11 @@ def get_status(self) -> dict: Returns: dict: A dictionary containing the status of the endstop. """ + pressed = is_button_pressed(self.settings.pin) return {"assigned_motor": self.settings.motor_name, "position": self.settings.angular_position, "pin": self.settings.pin, - "is_pressed": not is_button_pressed(self.settings.pin)} + "is_pressed": pressed if self.settings.active_high else (not pressed)} async def _move_back_task(self): diff --git a/openscan_firmware/models/scanner.py b/openscan_firmware/models/scanner.py index 25547e7..6d60160 100644 --- a/openscan_firmware/models/scanner.py +++ b/openscan_firmware/models/scanner.py @@ -11,10 +11,12 @@ class ScannerModel(Enum): CLASSIC = "classic" MINI = "mini" + CUSTOM = "custom" class ScannerShield(Enum): GREENSHIELD = "greenshield" BLACKSHIELD = "blackshield" + CUSTOM = "custom" class ScannerDevice(BaseModel): name: str @@ -25,4 +27,4 @@ class ScannerDevice(BaseModel): lights: dict[str, Light] endstops: Optional[dict[str, Endstop]] - initialized: bool \ No newline at end of file + initialized: bool diff --git a/settings/device/default_miciomax.json b/settings/device/default_miciomax.json new file mode 100644 index 0000000..444a0e5 --- /dev/null +++ b/settings/device/default_miciomax.json @@ -0,0 +1,34 @@ +{ + "name": "OpenScan.eu MicioMax", + "model": "custom", + "shield": "custom", + "cameras": {}, + "motors": { + "rotor": { + "direction_pin": 5, + "enable_pin": 23, + "step_pin": 6, + "acceleration": 20000, + "max_speed": 5000, + "direction": 1, + "steps_per_rotation": 42667, + "min_angle": 12, + "max_angle": 125 + }, + "turntable": { + "direction_pin": 9, + "enable_pin": 22, + "step_pin": 11, + "acceleration": 5000, + "max_speed": 5000, + "direction": 1, + "steps_per_rotation": 3200 + } + }, + "lights": { + "Openscan.eu Ringlight": { + "pins": [17,27], + "pwm_support": true + } + } +} From f0c6a5be2a5e76cd653847e72652e14895c8a2b4 Mon Sep 17 00:00:00 2001 From: esto-openscan <193278706+esto-openscan@users.noreply.github.com> Date: Sun, 15 Feb 2026 00:47:54 +0000 Subject: [PATCH 2/3] Removed spurious folder from tracking --- .local/state/lesshst | 1 - .local/state/wireplumber/stream-properties | 2 -- 2 files changed, 3 deletions(-) delete mode 100644 .local/state/lesshst delete mode 100644 .local/state/wireplumber/stream-properties diff --git a/.local/state/lesshst b/.local/state/lesshst deleted file mode 100644 index 4d1c30b..0000000 --- a/.local/state/lesshst +++ /dev/null @@ -1 +0,0 @@ -.less-history-file: diff --git a/.local/state/wireplumber/stream-properties b/.local/state/wireplumber/stream-properties deleted file mode 100644 index 447bb5f..0000000 --- a/.local/state/wireplumber/stream-properties +++ /dev/null @@ -1,2 +0,0 @@ -[stream-properties] -Audio/Sink:node.name:auto_null={"channelMap":["FL", "FR"], "mute":false, "channelVolumes":[1.000000, 1.000000], "volume":1.000000} From eac124bb0367f55f648a3727e8893efb79fe8c05 Mon Sep 17 00:00:00 2001 From: esto-openscan <193278706+esto-openscan@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:00:50 +0000 Subject: [PATCH 3/3] Added homing through endstop routine - no check nor normalize angle --- .../controllers/hardware/motors.py | 23 +++++++++++++++- openscan_firmware/routers/next/motors.py | 4 +-- settings/device/default_miciomax.json | 27 ++++++++++++++----- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/openscan_firmware/controllers/hardware/motors.py b/openscan_firmware/controllers/hardware/motors.py index 903dee6..3d98c0b 100644 --- a/openscan_firmware/controllers/hardware/motors.py +++ b/openscan_firmware/controllers/hardware/motors.py @@ -268,6 +268,27 @@ async def _move_to_target_angle(self, target_angle: float) -> None: logger.debug(f"Motor {self.model.name} will move {step_count} steps.") await self._execute_movement(step_count, target_angle) + async def move_to_endstop(self) -> None: + """Internal method to move motor to endstop. + + Args: + none """ + + if self.endstop is None: + return + + logger.debug(f"Will move motor {self.model.name} to endstop") + + spr = self.settings.steps_per_rotation + direction = self.settings.direction + + # Some high count degrees, rotor could be in a weird position + degrees_to_move = 270 + + step_count = int(degrees_to_move * spr / 360) * direction + logger.debug(f"Motor {self.model.name} will move {step_count} steps.") + await self._execute_movement(step_count, 0.0) + def _pre_calculate_step_times(self, steps: int, min_interval=0.0001) -> List[float]: """ Pre-calculate the exact time for each step in the movement. @@ -521,4 +542,4 @@ async def move_to_point(point: PolarPoint3D): rotor.move_to(point.theta) ) - logger.debug(f"Moved to {point}") \ No newline at end of file + logger.debug(f"Moved to {point}") diff --git a/openscan_firmware/routers/next/motors.py b/openscan_firmware/routers/next/motors.py index 51dc8d3..631126a 100644 --- a/openscan_firmware/routers/next/motors.py +++ b/openscan_firmware/routers/next/motors.py @@ -150,7 +150,7 @@ async def move_motor_to_home_position(motor_name: str): if controller.endstop and not controller.is_busy(): # Trigger Endstop controller.model.angle = 0 - await controller.move_degrees(140) + await controller.move_to_endstop() # Wait for Endstop and move motor to home position await asyncio.sleep(3) await controller.move_to(90) @@ -164,4 +164,4 @@ async def move_motor_to_home_position(motor_name: str): resource_name="motor_name", get_controller=get_motor_controller, settings_model=MotorConfig -) \ No newline at end of file +) diff --git a/settings/device/default_miciomax.json b/settings/device/default_miciomax.json index 444a0e5..7217939 100644 --- a/settings/device/default_miciomax.json +++ b/settings/device/default_miciomax.json @@ -6,29 +6,42 @@ "motors": { "rotor": { "direction_pin": 5, - "enable_pin": 23, + "enable_pin": 0, "step_pin": 6, "acceleration": 20000, "max_speed": 5000, "direction": 1, - "steps_per_rotation": 42667, - "min_angle": 12, - "max_angle": 125 + "steps_per_rotation": 122880, + "min_angle": 13, + "max_angle": 180 }, "turntable": { "direction_pin": 9, - "enable_pin": 22, + "enable_pin": 10, "step_pin": 11, "acceleration": 5000, "max_speed": 5000, "direction": 1, - "steps_per_rotation": 3200 + "steps_per_rotation": 6400 } }, "lights": { "Openscan.eu Ringlight": { - "pins": [17,27], + "pins": [12], "pwm_support": true } + }, + "endstops": { + "rotor-endstop": { + "name": "rotor-endstop", + "settings": { + "pin": 27, + "angular_position": 165.0, + "motor_name": "rotor", + "pull_up": true, + "bounce_time": 0.005, + "active_high": true + } + } } }