#define BUTTON SENSOR_1 #define LEFT OUT_A #define RIGHT OUT_C #define PFAC 1/2 #define IFAC 1/4 #define DFAC -1/3 task main() { SetSensor(BUTTON, SENSOR_ROTATION); ClearSensor(BUTTON); int pos = 0, // The 'P' in PID prev_pos = 0, differential = 0, // The 'D' integral_sum = 0; // The 'I' int motor_power = 0; // Our output. The RCX // powers motors on // a scale from 0 to 7 while(abs(pos)/100 < 40) // while it hasn't tipped // over hopelessly far { prev_pos = pos; pos = BUTTON * 100; // increase precision differential = pos - prev_pos; integral_sum = integral_sum + pos; motor_power = PFAC*pos + DFAC*differential + IFAC*integral_sum; // Apply the PID motor_power = motor_power / 100; // fix precision if(abs(motor_power) > OUT_FULL) SetPower(RIGHT+LEFT, OUT_FULL); else SetPower(RIGHT+LEFT,abs(motor_power)); if(motor_power < 0) { Rev(RIGHT+LEFT); On(LEFT+RIGHT); } else if(motor_power > 0) { Fwd(RIGHT+LEFT); On(LEFT+RIGHT); } else { Float(LEFT+RIGHT); } } Float(LEFT+RIGHT); }