2014-10-23 12:17:42 -04:00
|
|
|
#include "WPILib.h"
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sample program displaying the value of a quadrature encoder on the SmartDashboard.
|
|
|
|
|
* Quadrature Encoders are digital sensors which can detect the amount the encoder
|
|
|
|
|
* has rotated since starting as well as the direction in which the encoder
|
|
|
|
|
* shaft is rotating. However, encoders can not tell you the absolute
|
|
|
|
|
* position of the encoder shaft (ie, it considers where it starts to be the
|
|
|
|
|
* zero position, no matter where it starts), and so can only tell you how
|
|
|
|
|
* much the encoder has rotated since starting.
|
|
|
|
|
* Depending on the precision of an encoder, it will have fewer or greater
|
|
|
|
|
* ticks per revolution; the number of ticks per revolution will affect the
|
|
|
|
|
* conversion between ticks and distance, as specified by DistancePerPulse.
|
|
|
|
|
* One of the most common uses of encoders is in the drivetrain, so that the
|
|
|
|
|
* distance that the robot drives can be precisely controlled during the
|
|
|
|
|
* autonomous mode.
|
|
|
|
|
*/
|
|
|
|
|
class Robot: public SampleRobot
|
|
|
|
|
{
|
|
|
|
|
Encoder m_encoder;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Time to wait between updating SmartDashboard values.
|
|
|
|
|
* It is generally a good idea to stick a short wait in these loops
|
|
|
|
|
* to avoid hogging CPU power, especially as there will be no
|
|
|
|
|
* perceivable difference in the SmartDashboard display.
|
|
|
|
|
*/
|
|
|
|
|
const double kUpdatePeriod = 0.005; // 5milliseconds / 0.005 seconds.
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
/**
|
|
|
|
|
* The Encoder object is constructed with 4 parameters, the last two being optional.
|
|
|
|
|
* The first two parameters (1, 2 in this case) refer to the ports on the
|
|
|
|
|
* roboRIO which the encoder uses. Because a quadrature encoder has
|
|
|
|
|
* two signal wires, the signal from two DIO ports on the roboRIO are used.
|
|
|
|
|
* The third (optional) parameter is a boolean which defaults to false.
|
|
|
|
|
* If you set this parameter to true, the direction of the encoder will
|
|
|
|
|
* be reversed, in case it makes more sense mechanically.
|
|
|
|
|
* The final (optional) parameter specifies encoding rate (k1X, k2X, or k4X)
|
|
|
|
|
* and defaults to k4X. Faster (k4X) encoding gives greater positional
|
|
|
|
|
* precision but more noise in the rate.
|
|
|
|
|
*/
|
|
|
|
|
Robot() : m_encoder(1, 2, false, Encoder::k4X)
|
|
|
|
|
{
|
|
|
|
|
// Defines the number of samples to average when determining the rate.
|
|
|
|
|
// On a quadrature encoder, values range from 1-255; larger values
|
|
|
|
|
// result in smoother but potentially less accurate rates than lower values.
|
|
|
|
|
m_encoder.SetSamplesToAverage(5);
|
|
|
|
|
|
|
|
|
|
// Defines how far the mechanism attached to the encoder moves per pulse.
|
|
|
|
|
// In this case, we assume that a 360 count encoder is directly attached
|
|
|
|
|
// to a 3 inch diameter (1.5inch radius) wheel, and that we want to
|
|
|
|
|
// measure distance in inches.
|
|
|
|
|
m_encoder.SetDistancePerPulse(1.0 / 360.0 * 2.0 * 3.1415 * 1.5);
|
|
|
|
|
|
|
|
|
|
// Defines the lowest rate at which the encoder will not be considered
|
|
|
|
|
// stopped, for the purposes of the GetStopped() method.
|
|
|
|
|
// Units are in distance / second, where distance refers to the units
|
|
|
|
|
// of distance that you are using, in this case inches.
|
|
|
|
|
m_encoder.SetMinRate(1.0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Retrieve various information from the encoder and display it
|
|
|
|
|
* on the SmartDashboard.
|
|
|
|
|
*/
|
|
|
|
|
void OperatorControl()
|
|
|
|
|
{
|
2014-10-27 15:52:37 -04:00
|
|
|
while (IsOperatorControl() && IsEnabled())
|
2014-10-23 12:17:42 -04:00
|
|
|
{
|
|
|
|
|
// Retrieve the net displacement of the Encoder since the lsat Reset.
|
|
|
|
|
SmartDashboard::PutNumber("Encoder Distance", m_encoder.GetDistance());
|
|
|
|
|
|
|
|
|
|
// Retrieve the current rate of the encoder.
|
|
|
|
|
SmartDashboard::PutNumber("Encoder Rate", m_encoder.GetRate());
|
|
|
|
|
|
|
|
|
|
Wait(kUpdatePeriod); // Wait a short bit before updating again.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
START_ROBOT_CLASS(Robot);
|