FRC LabVIEW Tutorials - Limit-Switch - RoboRIO

Using Limit Switches

It is often advantageous to use limit switches to set how far an actuator can go. It is possible to configure hardware using limit switches and Talons, so that the limit switch directly inputs to the Talon, but presented here is a software solution.


Connect the Signal and Ground pins from a DIO port to the COM (Common) and either NO (Normally Open) or NC (Normally Closed) terminals on a switch. In general choose the NO terminal as that makes the circuit on when the switch is pressed, and off when the switch is not pressed which makes the most since to most peoples’ brains. However, there are some cases when you would want to use the NC terminal. For example, in a security system the NC terminal would be preferred since if someone were to cut one of the wires, the circuit would break triggering the system (know there may be even better systems than that).

It may seem odd to use the Ground pin instead of the 5V pin on the roboRIO but behind the scenes the Signal wire voltage is being pulled high when not connected to anything. When the Signal and Ground wires connect, the Signal wire voltage is pulled low more firmly.

Opening the limit switch in

Image from the FRC Limit Switch example installed with LabVIEW for FRC.

Insertable VI

For the sake of this tutorial, we will construct a VI that takes in the DevRef’s for each piece of hardware associated with this example, and performs the logic to set the motor. This will allow this VI to be used in Autonomous and/or Teleop, or if it needs to be run all the time, can be placed in Periodic Tasks.

Just a formality, but we will start by opening the necessary hardware in For this example, we will use two limit switches, a joystick, and a motor.

Opening the limit switch in

Notice the Normally Closed false constants connected to the Limit Switch Open VIs. They work similarly to the Invert constant on the Motor Open VI. If you find the switch reports true when you expect false and false when you expect true, change the value of the Normally Closed input for that switch.

Limit Switch Open Context Help

In this example, we are constructing a vi, that can be called frequently to set the values of the motor based on joystick input, and we will add front panel controls in to allow for running this VI in Autonomous and passing in constants to control the motor.

For an example on having a motor remain in a state until a new input, we will refer you to our State Machine Tutorial

Block Diagram

We are assuming that the hardware has already been opened. To allow this VI to execute as quickly as possible, we will rely on the calling VI to provide the DevRef’s as opposed to Refnums.

Let’s start simple and use two buttons and some selects to set the motor.

Using Joystick values to set motor

Now, this is good, but we wanted the limit switches to turn off the motor at its limits, so let’s add that in. One way to do this is to use more selects such that when a limit switch is pressed, it allows the value to be anywhere within a range that is either stopped or goes the other way. Like below.

Basic use of limit switch

NOTE: If the Limit Switch Get VI reports true when you expect false and false when you expect true, you have a few options:

  1. Change your choice of wiring the NO or NC terminal on the physical switch.
  2. Change the value of the Normally Closed input on the Switch Open VI.
  3. Insert a Not function between the Switch Read VI and the Select function.

Ussually #2 is recomended since it is both quick and affects everywhere you get the value of that Switch.

At this point, the wiring is becoming a little chaotic, but we want to keep our constants so that this vi is generic and can be used year after year and by multiple teams, so we will switch to using multiple nested case structures.

Using case switches for limit switch

This is good, we have the motor set by the joystick buttons and using the limit switch to not allow the motor to continue past the limit switches.

Now we want to add some Boolean controls in that will allow us to call this VI in Auto and ignore the joystick input.

Add boolean controls

Now we will go to the front panel and clean it up a little bit.

Front Panel

At this point, we just want to tidy up a bit by doing some alignments and fitting horizontally and vertically by aligning the tops of the clusters and one of the buttons, then a horizontal gap between them and finally the second button was aligned left and vertically compressed.

Tyding up the front panel

For this VI to truly be universal, we need to set the buttons to latch mode allowing the VI to be called once, setting them to true in autonomous, then called again without passing anything so it reads the joystick.

Setting button action mode

Connector Pane

By convention, inputs are on the left so we wire the DevRef’s and buttons to terminals on the left.

1- Select appropriate Terminal,

Setting the terminal

2 - Select Control or Indicator

Setting the control for that terminal


And with that, this vi is ready to be brought into the robot project and called to set the actuator motor from anywhere. - Auto, Teleop, or Timed Tasks.

click here to download finished version

Some Possible Improvements

Request More Details

Google Form to request details


Table of Contents