16
16
import static frc .robot .subsystems .drive .DriveConstants .*;
17
17
import static frc .robot .util .SparkUtil .*;
18
18
19
- import com .revrobotics .AbsoluteEncoder ;
20
19
import com .revrobotics .RelativeEncoder ;
21
20
import com .revrobotics .spark .ClosedLoopSlot ;
22
21
import com .revrobotics .spark .SparkBase ;
29
28
import com .revrobotics .spark .SparkMax ;
30
29
import com .revrobotics .spark .config .ClosedLoopConfig .FeedbackSensor ;
31
30
import com .revrobotics .spark .config .SparkBaseConfig .IdleMode ;
32
- import com .revrobotics .spark .config .SparkFlexConfig ;
33
31
import com .revrobotics .spark .config .SparkMaxConfig ;
34
32
import edu .wpi .first .math .MathUtil ;
35
33
import edu .wpi .first .math .filter .Debouncer ;
36
34
import edu .wpi .first .math .geometry .Rotation2d ;
35
+ import edu .wpi .first .wpilibj .AnalogEncoder ;
37
36
import java .util .Queue ;
38
37
import java .util .function .DoubleSupplier ;
39
38
40
39
/**
41
40
* Module IO implementation for Spark Max drive motor controller, Spark Max turn motor controller,
42
- * and duty cycle absolute encoder.
41
+ * and analog absolute encoder.
43
42
*/
44
43
public class ModuleIOSpark implements ModuleIO {
45
44
private final Rotation2d zeroRotation ;
@@ -48,7 +47,8 @@ public class ModuleIOSpark implements ModuleIO {
48
47
private final SparkBase driveSpark ;
49
48
private final SparkBase turnSpark ;
50
49
private final RelativeEncoder driveEncoder ;
51
- private final AbsoluteEncoder turnEncoder ;
50
+ private final RelativeEncoder turnEncoder ;
51
+ private final AnalogEncoder turnAbsoluteEncoder ;
52
52
53
53
// Closed loop controllers
54
54
private final SparkClosedLoopController driveController ;
@@ -92,13 +92,24 @@ public ModuleIOSpark(int module) {
92
92
default -> 0 ;
93
93
},
94
94
MotorType .kBrushless );
95
+ turnAbsoluteEncoder =
96
+ new AnalogEncoder (
97
+ switch (module ) {
98
+ case 0 -> frontLeftEncoder ;
99
+ case 1 -> frontRightEncoder ;
100
+ case 2 -> backLeftEncoder ;
101
+ case 3 -> backRightEncoder ;
102
+ default -> 0 ;
103
+ },
104
+ 2 * Math .PI ,
105
+ 0 );
95
106
driveEncoder = driveSpark .getEncoder ();
96
- turnEncoder = turnSpark .getAbsoluteEncoder ();
107
+ turnEncoder = turnSpark .getEncoder ();
97
108
driveController = driveSpark .getClosedLoopController ();
98
109
turnController = turnSpark .getClosedLoopController ();
99
110
100
111
// Configure drive motor
101
- var driveConfig = new SparkFlexConfig ();
112
+ var driveConfig = new SparkMaxConfig ();
102
113
driveConfig
103
114
.idleMode (IdleMode .kBrake )
104
115
.smartCurrentLimit (driveMotorCurrentLimit )
@@ -134,39 +145,45 @@ public ModuleIOSpark(int module) {
134
145
135
146
// Configure turn motor
136
147
var turnConfig = new SparkMaxConfig ();
148
+
137
149
turnConfig
138
150
.inverted (turnInverted )
139
- .idleMode (IdleMode .kBrake )
151
+ .idleMode (IdleMode .kCoast )
140
152
.smartCurrentLimit (turnMotorCurrentLimit )
141
153
.voltageCompensation (12.0 );
142
154
turnConfig
143
- .absoluteEncoder
144
- .inverted (turnEncoderInverted )
155
+ .encoder
145
156
.positionConversionFactor (turnEncoderPositionFactor )
146
157
.velocityConversionFactor (turnEncoderVelocityFactor )
147
- .averageDepth (2 );
158
+ .uvwMeasurementPeriod (10 )
159
+ .uvwAverageDepth (2 );
148
160
turnConfig
149
161
.closedLoop
150
- .feedbackSensor (FeedbackSensor .kAbsoluteEncoder )
162
+ .feedbackSensor (FeedbackSensor .kPrimaryEncoder )
151
163
.positionWrappingEnabled (true )
152
164
.positionWrappingInputRange (turnPIDMinInput , turnPIDMaxInput )
153
165
.pidf (turnKp , 0.0 , turnKd , 0.0 );
166
+
154
167
turnConfig
155
168
.signals
156
- .absoluteEncoderPositionAlwaysOn (true )
157
- .absoluteEncoderPositionPeriodMs ((int ) (1000.0 / odometryFrequency ))
158
- .absoluteEncoderVelocityAlwaysOn (true )
159
- .absoluteEncoderVelocityPeriodMs (20 )
169
+ .primaryEncoderPositionAlwaysOn (true )
170
+ .primaryEncoderPositionPeriodMs ((int ) (1000.0 / odometryFrequency ))
171
+ .primaryEncoderVelocityAlwaysOn (true )
172
+ .primaryEncoderVelocityPeriodMs (20 )
160
173
.appliedOutputPeriodMs (20 )
161
174
.busVoltagePeriodMs (20 )
162
175
.outputCurrentPeriodMs (20 );
176
+
163
177
tryUntilOk (
164
178
turnSpark ,
165
179
5 ,
166
180
() ->
167
181
turnSpark .configure (
168
182
turnConfig , ResetMode .kResetSafeParameters , PersistMode .kPersistParameters ));
169
183
184
+ turnEncoder .setPosition (
185
+ Rotation2d .fromRadians (turnAbsoluteEncoder .get ()).minus (zeroRotation ).getRadians ());
186
+
170
187
// Create odometry queues
171
188
timestampQueue = SparkOdometryThread .getInstance ().makeTimestampQueue ();
172
189
drivePositionQueue =
@@ -177,7 +194,6 @@ public ModuleIOSpark(int module) {
177
194
178
195
@ Override
179
196
public void updateInputs (ModuleIOInputs inputs ) {
180
- System .out .println ("TurnEncoder: " + turnEncoder .getPosition ());
181
197
// Update drive inputs
182
198
sparkStickyFault = false ;
183
199
ifOk (driveSpark , driveEncoder ::getPosition , (value ) -> inputs .drivePositionRad = value );
@@ -194,7 +210,7 @@ public void updateInputs(ModuleIOInputs inputs) {
194
210
ifOk (
195
211
turnSpark ,
196
212
turnEncoder ::getPosition ,
197
- (value ) -> inputs .turnPosition = new Rotation2d (value ). minus ( zeroRotation ) );
213
+ (value ) -> inputs .turnPosition = new Rotation2d (value ));
198
214
ifOk (turnSpark , turnEncoder ::getVelocity , (value ) -> inputs .turnVelocityRadPerSec = value );
199
215
ifOk (
200
216
turnSpark ,
@@ -210,7 +226,7 @@ public void updateInputs(ModuleIOInputs inputs) {
210
226
drivePositionQueue .stream ().mapToDouble ((Double value ) -> value ).toArray ();
211
227
inputs .odometryTurnPositions =
212
228
turnPositionQueue .stream ()
213
- .map ((Double value ) -> new Rotation2d (value ). minus ( zeroRotation ) )
229
+ .map ((Double value ) -> new Rotation2d (value ))
214
230
.toArray (Rotation2d []::new );
215
231
timestampQueue .clear ();
216
232
drivePositionQueue .clear ();
@@ -241,8 +257,7 @@ public void setDriveVelocity(double velocityRadPerSec) {
241
257
@ Override
242
258
public void setTurnPosition (Rotation2d rotation ) {
243
259
double setpoint =
244
- MathUtil .inputModulus (
245
- rotation .plus (zeroRotation ).getRadians (), turnPIDMinInput , turnPIDMaxInput );
260
+ MathUtil .inputModulus (rotation .plus (zeroRotation ).getRadians (), -Math .PI , Math .PI );
246
261
turnController .setReference (setpoint , ControlType .kPosition );
247
262
}
248
263
}
0 commit comments