My team is using a potentiometer for our lift. However we are having trouble programming it to stop at a certain value. Some times it will go too far and other times it will go to short.
Our lift is on a 5:1 gear ratio with the potentiometer on the 60 tooth gear. We want the lift to raise to the middle height of the fence. Also, our lift rests at around a 30 degree angle, and is about and 1 1/2 inches below the 18" Limit.
Any estimations of the value we need would be helpful.
You are looking to control the power sent to the arm motors proportionally… which is the P in PID. It doesn’t have to be super complicated. Here is an example of a task to apply P control to an arm motor based on potentiometer values:
// PD control constants
static float armP_Kp = 0.28; // arm proportion
static int max_Error = 25; // maximum error allowed
int armTarget; // global variable that holds the desired arm potentiometer value
task armControl()
{
while (true)
{
// calculate armError... how far is the arm from armTarget
int armError = (armTarget - SensorValue[arm_Pot]);
if (abs(armError) > max_Error) // if pot value is off by max_Error+
{
int armPower = (armP_Kp * armError); // P control for arm motor
// set motors to armPower
motor[arm_R1] = motor[arm_R2] = motor[arm_R3] = armPower;
motor[arm_L1] = motor[arm_L2] = motor[arm_L3] = armPower;
}
wait1Msec(25); // don't hog cpu
}
}
task main()
{
startTask(armControl);
while (true)
{
// arm control on 8
if (vexRT[Btn8R] == 1) {armTarget = 3450;}
if (vexRT[Btn8U] == 1) {armTarget = 1900;}
if (vexRT[Btn8L] == 1) {armTarget = 1200;}
if (vexRT[Btn8D] == 1) {armTarget = 1000;}
}
}
This is relatively simple control, and will not work as well as full PID. You will need to fiddle with the value for the armP_Kp constant to work for your particular bot. You might also find you want to limit armPower when the arm is moving down. This control will likely overshoot going down, then adjust itself back to the target.
Also, if you’re having trouble getting consistent values, consider working with the reading divided by 10. It’s generally still precise enough, but the values become less noisy.
PID does work well for arm control. The down direction does have the help of gravity along the way, so a second set of constants and additional tuning can be an option to fix that. More rubber bands is another method, but not always feasible.
But that example should work very well. Start with a small armP_Kp and work up from there. 0.15 is a good low number on arms. Arm values on a P controller that I have seen our kids do were in the 0.2 - 0.35 range depending upon the arm.
@PNayak Do you mean the arm is swinging past the desired point over and over? If that is the case, you need to adjust the P constant until it meets the goal. The code I posted above has run correctly on an actual bot. If I were to change the constant to .5, it would fail comically.
If you are using something like PID control, it will reach the target while the motors are at some low value and the arm will rest in that position with the motors remaining at that value. In fact, if you forcibly lift or lower the arm, it will return to the last target value.
I guess I don’t understand what your exact problem is, but hope this reply might steer you in the right direction.