From faec33984d1e4df573539ab00ebee27818da445d Mon Sep 17 00:00:00 2001 From: Bradley Bickford Date: Tue, 10 Feb 2026 17:19:17 -0500 Subject: [PATCH] Preliminary Hood Subsystem --- .../frc/robot/constants/HoodConstants.java | 43 +++++++++++++ src/main/java/frc/robot/subsystems/Hood.java | 60 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 src/main/java/frc/robot/constants/HoodConstants.java create mode 100644 src/main/java/frc/robot/subsystems/Hood.java diff --git a/src/main/java/frc/robot/constants/HoodConstants.java b/src/main/java/frc/robot/constants/HoodConstants.java new file mode 100644 index 0000000..161f7e0 --- /dev/null +++ b/src/main/java/frc/robot/constants/HoodConstants.java @@ -0,0 +1,43 @@ +package frc.robot.constants; + +import com.revrobotics.spark.FeedbackSensor; +import com.revrobotics.spark.config.SparkMaxConfig; +import com.revrobotics.spark.config.SparkBaseConfig.IdleMode; + +public class HoodConstants { + // TODO Real Values + public static final int kMotorCANID = 0; + + public static final double kP = 0; + public static final double kI = 0; + public static final double kD = 0; + public static final double kS = 0; + public static final double kV = 0; + public static final double kA = 0; + public static final double kStartupAngle = 0; + + public static final int kCurrentLimit = 15; + + public static final boolean kInverted = false; + + public static final IdleMode kIdleMode = IdleMode.kBrake; + + // YOU SHOULDN'T NEED TO CHANGE ANYTHING BELOW THIS LINE UNLESS YOU'RE ADDING A CONFIGURATION ITEM + + public static final SparkMaxConfig kConfig = new SparkMaxConfig(); + + static { + kConfig + .idleMode(kIdleMode) + .inverted(kInverted) + .smartCurrentLimit(kCurrentLimit); + kConfig.closedLoop + .feedbackSensor(FeedbackSensor.kAbsoluteEncoder) + .pid(kP, kI, kD) + .outputRange(-1, 1) + .positionWrappingEnabled(true) + .positionWrappingInputRange(0, Math.PI * 2) + .feedForward + .sva(kS, kV, kA); + } +} diff --git a/src/main/java/frc/robot/subsystems/Hood.java b/src/main/java/frc/robot/subsystems/Hood.java new file mode 100644 index 0000000..710bad4 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/Hood.java @@ -0,0 +1,60 @@ +package frc.robot.subsystems; + +import java.util.function.DoubleSupplier; + +import org.littletonrobotics.junction.Logger; + +import com.revrobotics.AbsoluteEncoder; +import com.revrobotics.spark.SparkClosedLoopController; +import com.revrobotics.spark.SparkMax; +import com.revrobotics.spark.SparkBase.ControlType; +import com.revrobotics.spark.SparkLowLevel.MotorType; + +import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import frc.robot.constants.HoodConstants; + +public class Hood extends SubsystemBase { + private SparkMax motor; + + private AbsoluteEncoder encoder; + + private SparkClosedLoopController controller; + + private double currentTargetRadians; + + public Hood() { + motor = new SparkMax(HoodConstants.kMotorCANID, MotorType.kBrushless); + + encoder = motor.getAbsoluteEncoder(); + + controller = motor.getClosedLoopController(); + + currentTargetRadians = HoodConstants.kStartupAngle; + } + + @Override + public void periodic() { + Logger.recordOutput("Hood/CurrentTarget", currentTargetRadians); + Logger.recordOutput("Hood/CurrentAngle", encoder.getPosition()); + Logger.recordOutput("Hood/AtSetpoint", controller.isAtSetpoint()); + } + + public Command trackToAngle(DoubleSupplier radianAngleSupplier) { + return run(() -> { + currentTargetRadians = radianAngleSupplier.getAsDouble(); + + controller.setSetpoint(currentTargetRadians, ControlType.kPosition); + }); + } + + public Command stop() { + return run(() -> { + motor.disable(); + }); + } + + public double getTargetRadians() { + return currentTargetRadians; + } +}