User Tools

Site Tools


ballandbeam_code

Ball and Beam NXC Code

Use the additional library (dist-nx) to get the Infra Red sensor data. ( save it on the same folder of your NXC Code and include it using #include).

dist-nx-lib.rar nxc_codes.rar

NXT CODE

TUNING THE CODE

After introducing the file saving function and the necessary commands to get the data , the system response was slowed down. ( oscillating more than before ). So i made some tuning:

  • KP=1 and KD=0.60
  • No waiting time inside the if statements
  • 50ms waiting before starting the control loop again.

The new result is:

Modifying the Code

One way to make the motor movement smoother is to change the rotation commands “PosRegAddAngle” for power commands “OnFwd” and use the power input as the PID equation ( Power=KP*(delta distance) + KD*(ball velocity). ).

Insted of using :


if (position >21)
{
PosRegAddAngle(OUT_A,-position);
Wait(18);
time=time+40;
}

// Ball is close to set point


if (position<21 & position >0)
{
PosRegAddAngle(OUT_A,0);
time=time+60;

}

if (position <0 & position>-21)
{
PosRegAddAngle(OUT_A,0);
time=time+60;
}


// Ball is far from the set point (negative side)
//Rotating positive angles make the beam go down
if (position < -21)
{
PosRegAddAngle(OUT_A,-position);
Wait(18);
time=time+40;
}


Wait(40);


// After rotating an angle , goes back to 0 degree ( equilibrium position ).
PosRegSetAngle(OUT_A,0);

You can just use:


power = KP*(dist-d_setpoint) + KD*(velocity);
OnFwd(OUT_A,power)

Depending on the direction of the ball , the power variable can change from positive to negative. And the “OnFwd” command with negative power argument runs exactly like the “OnRev”. You will have to change the gains a little bit (from using rotation commands to power commands ) , but it will make the platform to move smoother

ballandbeam_code.txt · Last modified: 2016/07/25 21:53 by joaomatos