Table of Contents
On this page we'll describe the 10 “DIO” Digital I/O connections on the RoboRIO.
Introduction
By “digital” or “binary” we mean that each connector can convey a piece of information that is in one of two conditions. There are several ways of saying this:
- on / off
- one / zero
- Positive voltage / zero volts
When acting as an input, the RoboRIO interprets any voltage between 0 and 0.8v
By “IO” we mean that the direction can be either:
- Input: from an external switch or sensor to the RoboRIO
- Output: from the RoboRIO to an external light or other device
The direction is controlled by the software that runs on the roborio (see below).
Each “DIO” consists of a header with 3 pins. Typically, we connect a 3-wire “PWM” cable to each header.
- Ground (black)
- +5v power (red)
- Signal (white)
The interesting pin is the “signal” pin. When configured as an output, the signal pin is driven to 0 volts for a “zero”, and 3.3 volts for a “one”. More on outputs later.
When acting as an input, the RoboRIO interprets the voltage seen on the “Signal” pin as:
- any voltage between 0 and 0.8v is a “zero”
- a voltage between 2.0v and 5.5v i a “one.”
- A voltage in between those ranges results in either a zero or a one being delivered to the software program. We generally want to avoid this indeterminate region.
There is a “pullup” or “pulldown” resistor internal to the RoboRIO that helps ensure that the voltage on a disconnected DIO does not drift into that “unknown” region. For the ten basic DIOs on the RoboRIO, the resistor is a pullup, so an unconnected DIO will be read by software as a “one”.
So, to cause a DIO to be read as “zero” by software, all we have to do is connect the signal pin to ground, for example with a switch:
Software
Here's a Java code fragment:
package edu.wpi.first.wpilib.templates; import edu.wpi.first.wpilib.DigitalInput; import edu.wpi.first.wpilib.SimpleRobot; import edu.wpi.first.wpilib.Timer; public class RobotTemplate extends SimpleRobot { DigitalInput mySwitch; public void robotInit() { mySwitch = new DigitalInput(1); } public void operatorControl() { // more code here switch_now = mySwitch.get(); if(switch_now) { // do somthing if the switch is open ("one"); } else { // do somthing else if the switch is closed ("zero"); } // more code here } }
Notice somthing there that is true of most simple test programs: there's a whole lot more “java stuff” then there is specifics about what we're trying to do. There are really only two interesting lines. The first one is:
mySwitch = new DigitalInput(1);
This creates an object which represents our DIO pin in software. The “1” in DigitalInput(1), means that its associtated with DIO number 1.
The other interesting line is:
switch_now = mySwitch.get();
which reads the current state of the DIO and stores it in a boolean variable called switch_now.
We can then use switch_now in an if() or other statements.
There's some more software discussion here: * https://wpilib.screenstepslive.com/s/3120/m/7912/l/599687-using-limit-switches-to-control-behavior
What if we want to select between more than two choices? See “fun with switches” on the page Switches as Digital IO
Conclusion
This discussion also applies to the 16 additional DIO pins located on the roborio expansion connector.

