From a5deb88d13273eb85d5b976c5dcfee2d5a7a1276 Mon Sep 17 00:00:00 2001 From: SyntaxBreak <> Date: Mon, 19 Jan 2026 17:00:22 +1100 Subject: [PATCH 1/4] made the motor run in position control mode --- components/climber.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/components/climber.py b/components/climber.py index fc4b9c5..846ec68 100644 --- a/components/climber.py +++ b/components/climber.py @@ -9,14 +9,22 @@ class ClimberComponent: setpoint = will_reset_to(0.0) climb_speed = tunable(0.2) + kP, kI, kD = 0, 0, 0 + kMinOutput, kMaxOutput = 0, 0 + def __init__(self): # create motor with correct forward direction sparkmax controller self.motor = SparkMax(SparkId.CLIMBER, SparkMax.MotorType.kBrushless) + self.controller = self.motor.getClosedLoopController() + config = SparkMaxConfig() config.inverted(True) config.setIdleMode(SparkMaxConfig.IdleMode.kBrake) configure_spark_reset_and_persist(self.motor, config) + config.closedLoop.pid(self.kP, self.kI, self.kD) + config.closedLoop.outputRange(self.kMinOutput, self.kMaxOutput) + def deploy(self): self.setpoint = -self.climb_speed @@ -24,4 +32,4 @@ def climb(self): self.setpoint = self.climb_speed def execute(self): - self.motor.set(self.setpoint) + self.controller.setSetpoint(self.setpoint, SparkMax.ControlType.kPosition) \ No newline at end of file From 370603bdd6016a25671a605cda1bcf2e8872d101 Mon Sep 17 00:00:00 2001 From: SyntaxBreak <> Date: Mon, 19 Jan 2026 18:38:27 +1100 Subject: [PATCH 2/4] Fixed whitespace --- components/climber.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/climber.py b/components/climber.py index 846ec68..d129cd0 100644 --- a/components/climber.py +++ b/components/climber.py @@ -32,4 +32,4 @@ def climb(self): self.setpoint = self.climb_speed def execute(self): - self.controller.setSetpoint(self.setpoint, SparkMax.ControlType.kPosition) \ No newline at end of file + self.controller.setSetpoint(self.setpoint, SparkMax.ControlType.kPosition) From 7f8b4e09edf9618dab3d08b1700347f7fe2c7c3e Mon Sep 17 00:00:00 2001 From: SyntaxBreak <> Date: Thu, 29 Jan 2026 12:20:24 +1100 Subject: [PATCH 3/4] fixed unapplied config --- components/climber.py | 40 +++++++++++++++++++++++++++------------- robot.py | 7 ++++--- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/components/climber.py b/components/climber.py index d129cd0..50a0e40 100644 --- a/components/climber.py +++ b/components/climber.py @@ -1,35 +1,49 @@ from magicbot import tunable, will_reset_to -from rev import SparkMax, SparkMaxConfig +from rev import LimitSwitchConfig, SparkMax, SparkMaxConfig from ids import SparkId from utilities.rev import configure_spark_reset_and_persist class ClimberComponent: - setpoint = will_reset_to(0.0) - climb_speed = tunable(0.2) + MAX_FORWARD_EXTENSION, MAX_REVERSE_EXTENSION = 120, -120 - kP, kI, kD = 0, 0, 0 - kMinOutput, kMaxOutput = 0, 0 + current_climber_speed = will_reset_to(0) + forward_climber_speed, reverse_climber_speed = tunable(0.8), tunable(0.8) def __init__(self): # create motor with correct forward direction sparkmax controller self.motor = SparkMax(SparkId.CLIMBER, SparkMax.MotorType.kBrushless) - self.controller = self.motor.getClosedLoopController() + self.forward_limit_switch = self.motor.getForwardLimitSwitch() + self.reverse_limit_switch = self.motor.getReverseLimitSwitch() + self.encoder = self.motor.getEncoder() config = SparkMaxConfig() + config.inverted(True) config.setIdleMode(SparkMaxConfig.IdleMode.kBrake) - configure_spark_reset_and_persist(self.motor, config) - config.closedLoop.pid(self.kP, self.kI, self.kD) - config.closedLoop.outputRange(self.kMinOutput, self.kMaxOutput) + config.limitSwitch.forwardLimitSwitchType( + LimitSwitchConfig.Type.kNormallyOpen + ).forwardLimitSwitchTriggerBehavior( + LimitSwitchConfig.Behavior.kStopMovingMotor + ).reverseLimitSwitchType( + LimitSwitchConfig.Type.kNormallyOpen + ).reverseLimitSwitchTriggerBehavior(LimitSwitchConfig.Behavior.kStopMovingMotor) + + config.softLimit.forwardSoftLimit( + self.MAX_FORWARD_EXTENSION + ).forwardSoftLimitEnabled(True).reverseSoftLimit( + self.MAX_REVERSE_EXTENSION + ).reverseSoftLimitEnabled(True) + + configure_spark_reset_and_persist(self.motor, config) def deploy(self): - self.setpoint = -self.climb_speed + self.current_climber_speed = self.forward_climber_speed - def climb(self): - self.setpoint = self.climb_speed + def retract(self): + self.current_climber_speed = self.reverse_climber_speed def execute(self): - self.controller.setSetpoint(self.setpoint, SparkMax.ControlType.kPosition) + self.motor.set(self.current_climber_speed) diff --git a/robot.py b/robot.py index 8bab46a..94a7871 100644 --- a/robot.py +++ b/robot.py @@ -194,6 +194,7 @@ def testInit(self) -> None: def testPeriodic(self) -> None: allowed_to_drive = self.gamepad.getRightBumperButton() + if allowed_to_drive: # Set max speed max_speed = self.lower_max_speed @@ -216,11 +217,11 @@ def testPeriodic(self) -> None: self.shooter.shoot() self.intake.intake() - if self.gamepad.getAButton(): + if self.gamepad.getAButtonPressed(): self.climber.deploy() - if self.gamepad.getYButton(): - self.climber.climb() + if self.gamepad.getBButtonPressed(): + self.climber.retract() self.shooter.execute() self.climber.execute() From 0584b8ac8190e9cb89ccbd7bb1bb7e43366a6105 Mon Sep 17 00:00:00 2001 From: SyntaxBreak <> Date: Thu, 29 Jan 2026 17:18:44 +1100 Subject: [PATCH 4/4] changed tunable to a float --- components/climber.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/climber.py b/components/climber.py index 50a0e40..bda2791 100644 --- a/components/climber.py +++ b/components/climber.py @@ -8,7 +8,7 @@ class ClimberComponent: MAX_FORWARD_EXTENSION, MAX_REVERSE_EXTENSION = 120, -120 - current_climber_speed = will_reset_to(0) + current_climber_speed = will_reset_to(0.0) forward_climber_speed, reverse_climber_speed = tunable(0.8), tunable(0.8) def __init__(self):