Those using REV ION products on REVLib 2026 or newer must use REV Hardware Client 2.
This guide will help illustrate how to use the REV Hardware Client to run multiple ION motor controllers and motor pairs over CAN using various modes, including position, velocity, and duty cycle.
Connect your SPARK to the REV Hardware Client via a USB-C cable plugged into the SPARK itself or another device on the CAN network. If available, other CAN Devices will appear on the left under "Connected Hardware". In our example, we have plugged into the Power Distribution Hub. Then, click the "Telemetry" tab to continue. Note: For best results, ensure all devices have the latest firmware installed.
As a safety precaution, USB control is disabled on all REV Devices if a roboRIO has been detected at any time while the control system is on. To resolve the lockout, power cycle your control system after disconnecting the roboRIO.

Here, all available devices should be visible on the left. Click the first device you wish to configure.

While the motor is running, you can select different signals to display on the graph, providing valuable telemetry data for prototyping or troubleshooting. To track key metrics, select Voltage, Primary Encoder Position, and Primary Encoder Velocity to visualize these signals on the graph during operation.

After selecting your signals, click the "Start Graph" button to begin data collection before clicking the "Run Motor" button.
Below "Run Motor," you'll find the Mode and Setpoint settings, which determine the motor's behavior while running. For this guide, leave the Mode at Percent and the Setpoint at 0.05. Ensure the motor is securely fastened before clicking "Run Motor."
Congratulations, you've successfully run your SPARK MAX through the REV Hardware Client!

If you are only using multiple SPARK MAXs and a power source, you can terminate both ends of your CAN Bus with 120Ω resistors!
With the Power Distribution Hub and all SPARK devices wired, updated, and connected via CAN, plug the provided orange USB-C cable into the Power Distribution Hub. You should then see all the respective hardware appear on the left. Click the "Telemetry" tab to continue.
A roboRIO lockout can occur when it is active on the CAN bus while the REV Hardware Client is connected. To resolve this issue, power cycle all SPARK motor controllers after disconnecting the roboRIO.

Here, all available devices should be visible on the left. Click the first device you wish to configure.

After selecting your desired signals, click on the "Run Multiple" tab. You'll notice that our SPARK Flex is checked, meaning that it's ready to run. We need to check off the SPARK MAX so that both run at the same time. When you're done, click on the back button highlighted in orange to return to the Telemetry Devices tray.

In the previous step, we selected the signals for our SPARK Flex. The same needs to be done for our SPARK MAX, click on it to continue.

After selecting your signals for the second motor controller, click on the Run Multiple tab.

After selecting your signals, click the "Start Graph" button to begin data collection before clicking the "Run Motor" button.
Below "Run Motor," you'll find the Mode and Setpoint settings, which determine the motor's behavior while running. For this guide, leave the Mode at Percent and the Setpoint at 0.03. Ensure the motor is securely fastened before clicking "Run Motor."
Congratulations, you've successfully run multiple SPARK Motor Controllers through the REV Hardware Client!

If you are only using multiple SPARK MAXs and a power source, you can terminate both ends of your CAN Bus with 120Ω resistors!
Those using REV ION products on REVLib 2026 or newer must use .
Devices available in the REV Hardware Client are shown on the left side of the window. The device that the USB C Cable is connected to will be listed first, followed by any devices connected over CAN.
The below devices are able to provide telemetry and allow the Telemetry Tab to be used.
SPARK MAX
SPARK Flex
Power Distribution Hub
Pneumatic Hub
Devices Connected to the SPARK MAX or SPARK Flex Motor Controllers:
NEO Vortex
NEO Brushless Motor V1.1
Run Motor: Choose setpoints to run a motor connected to a SPARK MAX using various modes, including position, velocity, and duty cycle.
Signals: Select the different signals from the SPARK MAX you want to monitor here
Start & Restart Graph: Start initiates recording of telemetry. Restart will erase the data and start again
Update PIDF parameters on the fly to tune control loops on the SPARK MAX.
Select the arrow to show all configurable parameters within a specific group. For more information on each parameter type see .
Y-Axis Labels: Select the label you want to view by clicking the arrow at the bottom of the label. In this image the Power Distribution Hub Channel Currents are selected.
Y-Axis Scale: Use the drop down arrow next to the parameter you would like to change the scale for. Be sure to un-check the "use defaults" box to apply your changes.
In this example the SPARK MAX and NEO Motor were run at 30% power, switching between forwards and backwards several times. The first switch in direction occurs near t=5s where you can see the Applied Output, Position, and Velocity change.
This will export a .png image of the of the graph. The whole Time Span x-axis will be exported regardless of the time information was collected. The image below exported a 30 second graph while only 8 seconds of data was recorded.
This will export a .csv file of the of the values and timestamps.
Timestamp: This is the timestamp that the data was record for each signal in Unix time. Note that different signals may have their data recorded at different times than other signals.
Signal Name: The Label of signal selected when creating your Telemetry graph.
Device Name: The name of the device and the randomly generated ID assigned to each device when connected to the REV Hardware Client. This is randomly generated each time the device is connected to the REV Hardware Client.
This allows you to select an existing .csv file prior to starting your graph and record the data straight to the .csv file. This allows you export additional data to a previously exported telemetry file without headers to seamlessly add to your existing columns.
Please be aware of the CAN lockout feature of the ION Control System. If it has been connected to the roboRIO's CAN bus, a safety feature within all ION Control System Devices and will lock out USB communication. You may be able to change some parameters on select devices but in order to run motors through the telemetry tab disconnecting from the CAN bus and power-cycling the device will release the lock.
Under the device list, select your SPARK motor controller.
Click the "Advanced" tab.
For a SPARK MAX, under the "Alternate Encoder" section, make sure "kDataPortConfig" is set to "Default".
Brushed DC Motor
Through Bore Encoder
Other inputs connected to the Data Port
Time Span: Change the time span shown on the x-axis of the graph
Scales: Different Signals will have different scales for the y-axis. You can change which are shown by clicking the arrows here
Signal Key and Scale Adjustment: Signals you choose to monitor will be shown here. Click X to delete a signal from the graph and > to adjust the scale of the signal's graph y-axis
Save Data: Save your data as a .CSV or image using this menu
Signal Value: The value recorded for each Signal Name.
Under the "Closed Loop" section, set "kCtrlType" to "Position".
Under the same section, set "kFeedbackSensorPID0" to "Duty Cycle".
Click "Burn Flash" at the bottom of the page. (Burn Flash has been renamed to Persist Perimeters in v 1.7.0)
To tune your PID gains, click the "Telemetry" tab.
Set the "Mode" to "Position".
Under the "Signals" tab, select "Run Setpoint" and "Duty Cycle Position".
Click the "Tuning" tab.
Begin tuning your PID gains! Note that the setpoint in Hardware Client only allows whole numbers, so it would be helpful to set the Duty Cycle Position Factor parameter to something like 360 for degrees.
As of REV Hardware Client version 1.7.0, "Burn Flash" has been renamed to "Persist Perimeters"!

















