Added C++ Encoder samples to Eclipse Plugin.

Reads values from quadrature encoder and displays them on the
SmartDashbord.

Also added Encoder with Motor Control example, which is identical to the
Motor Control sample but displays an encoder value on the
SmartDashboard.
This commit is contained in:
James Kuszmaul
2014-10-23 12:17:42 -04:00
parent 66b7a8b66e
commit 20c60a5fe6
3 changed files with 172 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
#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()
{
while (IsOperatorControl())
{
// 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);

View File

@@ -0,0 +1,55 @@
#include "WPILib.h"
/**
* This sample program shows how to control a motor using a joystick. In the operator
* control part of the program, the joystick is read and the value is written to the motor.
* An Encoder is then used to read the total distance that the motor has turned and
* to display it on the SmartDashboard.
*
* Joystick analog values range from -1 to 1 and speed controller inputs as range from
* -1 to 1 making it easy to work together. The program also delays a short time in the loop
* to allow other threads to run. This is generally a good idea, especially since the joystick
* values are only transmitted from the Driver Station once every 20ms.
*/
class Robot : public SampleRobot {
Joystick m_stick;
// The motor to control with the Joystick.
// This uses a Talon speed controller; use the Victor or Jaguar classes for
// other speed controllers.
Talon m_motor;
// update every 0.005 seconds/5 milliseconds.
double kUpdatePeriod = 0.005;
Encoder m_encoder;
public:
Robot() :
m_stick(0), // Initialize Joystick on port 0.
m_motor(2), // Initialize the Talon on channel 0.
m_encoder(1, 2) // Iniitialize encoder connected on DIO ports 1 and 2.
{
// Distance will give total rotations of the motor, assuming a 360 count encoder.
m_encoder.SetDistancePerPulse(1.0 / 360.0);
}
/**
* Runs the motor from the output of a Joystick.
* Simultaneously displays encoder values on the SmartDashboard.
*/
void OperatorControl() {
while (IsOperatorControl()) {
// Set the motor controller's output.
// This takes a number from -1 (100% speed in reverse) to +1 (100% speed forwards).
m_motor.Set(m_stick.GetY());
// Display the total displacement of the encoder, in rotations.
SmartDashboard::PutNumber("Encoder Distance", m_encoder.GetDistance());
Wait(kUpdatePeriod); // Wait 5ms for the next update.
}
}
};
START_ROBOT_CLASS(Robot);

View File

@@ -104,6 +104,25 @@
</files>
</example>
<example>
<name>Motor Control With Encoder</name>
<description>Demonstrate controlling a single motor with a Joystick and displaying the net movement of the motor using an encoder.</description>
<tags>
<tag>Robot and Motor</tag>
<tag>Digital</tag>
<tag>Sensors</tag>
<tag>Actuators</tag>
<tag>Joystick</tag>
<tag>Complete List</tag>
</tags>
<packages>
<package>src</package>
</packages>
<files>
<file source="examples/MotorControl/src/Robot.cpp" destination="src/Robot.cpp"></file>
</files>
</example>
<example>
<name>Relay</name>
<description>Demonstrate controlling a Relay from Joystick buttons.</description>
@@ -153,6 +172,22 @@
</files>
</example>
<example>
<name>Encoder</name>
<description>Demonstrate displaying the value of a quadrature encoder on the SmartDashboard.</description>
<tags>
<tag>Complete List</tag>
<tag>Digital</tag>
<tag>Sensors</tag>
</tags>
<packages>
<package>src</package>
</packages>
<files>
<file source="examples/Encoder/src/Robot.cpp" destination="src/Robot.cpp"></file>
</files>
</example>
<example>
<name>Arcade Drive</name>
<description>An example program which the use of Arcade Drive with the RobotDrive class</description>