The REV ecosystem#
REV Robotics makes the NEO and NEO Vortex brushless motors, driven by the SPARK MAX and SPARK Flex motor controllers. Unlike the Talon FX, the controller and motor are separate (you wire a SPARK MAX to a NEO). They run on CAN and use the REVLib software library and the REV Hardware Client desktop app.
Install REVLib via "Manage Vendor Libraries" using REV's vendordep URL.
The 2025 configuration model#
Starting with REVLib 2025, all SPARK classes moved into a com.revrobotics.spark package and configuration became declarative (similar in spirit to Phoenix 6). Instead of calling setters directly on the controller, you build a SparkMaxConfig (or SparkFlexConfig) and apply it:
import com.revrobotics.spark.SparkMax;
import com.revrobotics.spark.SparkBase;
import com.revrobotics.spark.SparkLowLevel.MotorType;
import com.revrobotics.spark.config.SparkMaxConfig;
import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
SparkMax motor = new SparkMax(2, MotorType.kBrushless); // CAN ID 2, NEO
SparkMaxConfig config = new SparkMaxConfig();
config.idleMode(IdleMode.kBrake);
config.smartCurrentLimit(40);
motor.configure(config,
SparkBase.ResetMode.kResetSafeParameters,
SparkBase.PersistMode.kPersistParameters);
ResetMode/PersistMode control whether old settings are wiped and whether the config survives a power cycle.
Open-loop control#
The simplest output is percent power:
motor.set(0.5); // 50% output
Closed-loop control#
Configure PID gains under the config's closedLoop member, then command the on-board controller through getClosedLoopController(). In REVLib 2025 the controller class was renamed from SparkPIDController to SparkClosedLoopController, and you command it with setReference(value, ControlType) (as of REVLib 2026 setReference(...) is deprecated in favor of an identical setSetpoint(...), so use that on the 2026 library):
config.closedLoop
.feedbackSensor(FeedbackSensor.kPrimaryEncoder)
.pid(0.1, 0.0, 0.0);
motor.configure(config, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
// Run on-board velocity control to 1000 RPM
motor.getClosedLoopController().setReference(1000, ControlType.kVelocity);
REV's on-board smooth-motion feature is MAXMotion (configured under closedLoop.maxMotion with parameters like cruise velocity and max acceleration), commanded with control types such as kMAXMotionPositionControl.
Reading the encoder#
The NEO/NEO Vortex have built-in encoders read through the SPARK:
RelativeEncoder enc = motor.getEncoder();
double position = enc.getPosition(); // rotations
double velocity = enc.getVelocity(); // RPM
In REVLib 2025, read-back parameter getters live on a configAccessor field rather than on the controller directly.
REV Hardware Client#
Use the REV Hardware Client to set CAN IDs, update firmware, and test motors on the bench. As with CTRE, every device on the CAN bus needs a unique ID.
CTRE vs. REV at a glance#
| CTRE Talon FX | REV SPARK MAX/Flex | |
|---|---|---|
| Motor | Kraken X60/X44 / Falcon 500 (integrated) | NEO / NEO Vortex (separate) |
| Library | Phoenix 6 | REVLib |
| Config | TalonFXConfiguration + apply | SparkMaxConfig + configure |
| Command | setControl(request) | set() / getClosedLoopController().setReference() |
Many teams mix both. The patterns rhyme: configure declaratively, then either set open-loop output or command the on-board closed-loop controller.
the part worth keeping
Key takeaways
- REV's NEO / NEO Vortex motors are driven by separate SPARK MAX / SPARK Flex controllers.
- REVLib 2025 uses declarative config: build SparkMaxConfig, then motor.configure(...).
- Open-loop is motor.set(value); closed-loop uses getClosedLoopController().setSetpoint() (setReference is deprecated).
- Configure PID under config.closedLoop; MAXMotion provides on-board smooth motion.
- Use the REV Hardware Client to set unique CAN IDs and update firmware.
Programming, Controls & SensorsMotors, Sensors, and Closed-Loop Controllesson 2 of 4
Keep going
Take the quiz+10 XP with an accountMore in Motors, Sensors, and Closed-Loop Control
where this came from
Sources and corrections
This lesson is AI-assisted: drafted from primary sources, then reviewed and edited by hand. Errors still get through. When one is reported we fix it and write down what changed, in public, in the corrections log.
sources and further reading
- docs.revrobotics.comREVLib Documentation
- docs.revrobotics.comMigrating to REVLib 2025
- codedocs.revrobotics.comSparkClosedLoopController API
clipped to this lesson
Articles that go further on this
The lesson gets you through the topic. These go wider on it, and they read in one sitting.
- 20 min readREV Robotics for FRC: NEO Motors, Spark MAX/Flex, PDH & MAXSwerveA practical guide to the REV Robotics FRC ecosystem: NEO, NEO Vortex and NEO 550 motors, Spark MAX and Spark Flex controllers, the PDH, and MAXSwerve./blogread it
- 8 min readFRC Motors Compared: NEO vs Kraken X60 vs Falcon 500 vs NEO VortexCompare FRC brushless motors: REV NEO, NEO Vortex, Kraken X60, and Falcon 500. Exact specs, FOC explained, and which motor to pick for drivetrain vs mechanisms./blogread it
answer sheet
Lesson quiz
All 3 right completes the lesson. Miss one and only that question comes back, anything you already answered correctly stays banked.
0 of 3 answered
01In the REVLib 2025 configuration model, how do you set up a SPARK MAX?
02How are REV's motors and controllers packaged compared to the CTRE Talon FX?
03How do you command the SPARK's on-board closed-loop controller to a velocity target?
Answer every question to submit.
All 51 lessons in Programming, Controls & Sensorsopenclose
01 / prerequisites
02 / foundations-tools-and-first-program
03 / robot-program-and-command-based
04 / motors-and-control
05 / autonomous-trajectories-simulation
06 / sensing-fundamentals
07 / encoders
08 / gyros-imus-orientation
09 / closed-loop-control
10 / vision-pose-estimation
11 / worked-examples-mini-projects
- Not read yet:Mini-Project: A Closed-Loop Elevator with Motion Magic
- Not read yet:Mini-Project: A Velocity-Controlled Shooter on REVLib
- Not read yet:Mini-Project: A Teleop Swerve Drive Subsystem
- Not read yet:Mini-Project: An Autonomous Routine with PathPlanner
- Not read yet:Mini-Project: Vision-Aligned Scoring with Limelight
12 / common-mistakes-troubleshooting
13 / advanced-techniques-case-studies
- Not read yet:State-Space Control and Kalman Filtering
- Not read yet:Log Replay Architecture with AdvantageKit
- Not read yet:Advanced Pose Estimation: Multi-Tag Fusion and Standard Deviations
- Not read yet:Robot Coordination, Alerts, and Operator Feedback
- Not read yet:Case Study: Hardening Software Before an Event