mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
Added new sample programs to the eclipse plugins for C++ and Java.
Modified examples.xml for the corresponding added programs. Change-Id: I3d86c570f446ec8cf3013c58dd94215f2907bbb1
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
#include "WPILib.h"
|
||||
|
||||
/**
|
||||
* This is a sample program to demonstrate how to use a soft potentiometer and a PID
|
||||
* Controller to reach and maintain position setpoints on an elevator mechanism.
|
||||
*
|
||||
* WARNING: While it may look like a good choice to use for your code if you're inexperienced,
|
||||
* don't. Unless you know what you are doing, complex code will be much more difficult under
|
||||
* this system. Use IterativeRobot or Command-Based instead if you're new.
|
||||
*/
|
||||
|
||||
class Robot: public SampleRobot {
|
||||
const int potChannel = 1; //analog input pin
|
||||
const int motorChannel = 7; //PWM channel
|
||||
const int joystickChannel = 0; //usb number in DriverStation
|
||||
const int buttonNumber = 4; //button on joystick
|
||||
|
||||
const double setPoints[3] = { 1.0, 2.6, 4.3 }; //bottom, middle, and top elevator setpoints
|
||||
|
||||
//proportional, integral, and derivative speed constants; motor inverted
|
||||
//DANGER: when tuning PID constants, high/inappropriate values for pGain, iGain,
|
||||
//and dGain may cause dangerous, uncontrollable, or undesired behavior!
|
||||
const double pGain = -5.0, iGain = -0.02, dGain = -2.0; //these may need to be positive for a non-inverted motor
|
||||
|
||||
PIDController *pidController;
|
||||
AnalogInput *potentiometer;
|
||||
Victor *elevatorMotor;
|
||||
Joystick *joystick;
|
||||
|
||||
public:
|
||||
Robot() :
|
||||
SampleRobot()
|
||||
{
|
||||
//make objects for potentiometer, the elevator motor controller, and the joystick
|
||||
potentiometer = new AnalogInput(potChannel);
|
||||
elevatorMotor = new Victor(motorChannel);
|
||||
joystick = new Joystick(joystickChannel);
|
||||
|
||||
//potentiometer (AnalogInput) and elevatorMotor (Victor) can be used as a
|
||||
//PIDSource and PIDOutput respectively
|
||||
pidController = new PIDController(pGain, iGain, dGain, potentiometer,
|
||||
elevatorMotor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs during autonomous.
|
||||
*/
|
||||
void Autonomous() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses a PIDController and an array of setpoints to switch and maintain elevator positions.
|
||||
* The elevator setpoint is selected by a joystick button.
|
||||
*/
|
||||
void OperatorControl() {
|
||||
pidController->SetInputRange(0, 5); //0 to 5V
|
||||
pidController->SetSetpoint(setPoints[0]); //set to first setpoint
|
||||
|
||||
int index = 0;
|
||||
bool currentValue;
|
||||
bool previousValue = false;
|
||||
|
||||
while (IsOperatorControl() && IsEnabled()) {
|
||||
pidController->Enable(); //begin PID control
|
||||
|
||||
//when the button is pressed once, the selected elevator setpoint is incremented
|
||||
currentValue = joystick->GetRawButton(buttonNumber);
|
||||
if (currentValue && !previousValue) {
|
||||
pidController->SetSetpoint(setPoints[index]);
|
||||
index = (index + 1) % (sizeof(setPoints)/8); //index of elevator setpoint wraps around
|
||||
}
|
||||
previousValue = currentValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs during test mode.
|
||||
*/
|
||||
void Test() {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
START_ROBOT_CLASS(Robot);
|
||||
Reference in New Issue
Block a user