CANSparkMax vs Talons - Robot adaptability
WesleyMcGinn opened this issue ยท 5 comments
Introduction
On Saturday, February 18th, our team had a plentiful dose of motor errors and major concerns for the CANSparkMaxs. Last year, we had several major Talon SRX issues at the Lakeview competition. In the midst of competition, if one motor type stops working, we may want to immediately change over to the other and diagnose the problem later. Because of this, I suggest that we incorporate functionality for CANSparkMaxs and Talons into our robot code.
Proposal
Similar to what is done in Weswerve.java
, line 17, we could use a boolean statement at the beginning of each system class that reads true
if we are using Talons and false
if we are using CANSparkMaxs. Although this would add more code to the robot that may not be absolutely necessary, I think that it is worth the backup plan that it would provide us with.
Differences In Code Between CANSparkMaxs and Talons
CANSparkMax Code | Talon SRX Code | |
---|---|---|
Import 1 | import com.revrobotics.CANSparkMax; |
import com.ctre.phoenix.motorcontrol.can.TalonSRX; |
Import 2 | import com.revrobotics.CANSparkMaxLowLevel.MotorType; |
import com.ctre.phoenix.motorcontrol.ControlMode; |
Declaration | public CANSparkMax myMotor; |
public TalonSRX myMotor; |
Initialization | myMotor = new CANSparkMax(<CAN_ID>, MotorType.kBrushless); |
myMotor = new TalonSRX(<CAN_ID>); |
Set Speed | myMotor.set(<SPEED>); |
myMotor.set(ControlMode.PercentOutput, <SPEED>); |
Note: Replace <CAN_ID>
with the CAN ID of the motor and replace <SPEED>
with a value from -1 to 1.
Something else to keep in mind is the different references to encoder values from Talons and CANSparkMaxs:
CANSparkMax Encoder Code | Talon SRX Code | |
---|---|---|
Import | import com.revrobotics.RelativeEncoder; |
No Encoder Import Needed |
Initialization | myEncoder = myMotor.getEncoder(); |
No Encoder Initialization Needed |
Set Value | myEncoder.setPosition(<ticks>); |
myMotor.setSelectedSensorPosition(<ticks>); |
Get Value | myEncoder.getPosition() |
myMotor.getSelectedSensorPosition() |
Additionally, NEOs and Talons spin in opposite directions. The following function may be needed, which works the same for both NEOs and Talons:
myMotor.setInverted(true);
This issue was solved with the robot-motor-adaptability branch.
The new Motor.java
class can be used as follows:
Action: | Code for Action: |
---|---|
Import | import frc.robot.systems.Motor; |
Declaration | public Motor myMotor; |
Initialization | myMotor = new Motor(<CAN_ID>, <IS_TALON?>, <DIRECTION>); |
Set Speed | myMotor.set(<SPEED>); |
Get Encoder Value | myMotor.getEnc() |
Set Encoder Value | myMotor.setEnc(<ENCODER_TICKS>); |
Set Motor Position | myMotor.goTo(<ENCODER_TICKS_FROM_START>); |
Update* | myMotor.update(); |
*This function must be called periodically if you used the .goTo
function. It will update the speed of the motor based on how far it is from the desired encoder value.
ERROR!
The motor function myMotor.goTo(<ENCODER_TICKS_FROM_START>);
was just found to have an issue:
The motor will adjust to go to its original location, but will not go to any other position.
This will be worked on immediately.
Fixed Issue
This issue was resolved by the last commit. The motors should now automatically adjust to reach their set positions when the update()
function is called.