How many sensors do you have and what kind are they? It makes a big difference.
// taskControl
// This task runs in parallel to taskBalance. This task monitors
// the optical and ultrasonic sensors and sets the global variables motorControlDrive
// and motorControlSteer. Both of these values are in degrees/second.
//
task taskControl()
{
Follows(main);
char pfData[8];
while(true) {
LightSignal = SensorNormalized(LIGHT_SENSE);
LightSignalPrev = LightSignalBar;
// calculate filtered value of light signal for Deriv. control.
LightSignalBar = FCTRACKING*LightSignal + (1.0-FCTRACKING)* LightSignalBar;
// derivitive of light signal
LightSignalDeriv = KDTRACKING*(LightSignalBar - LightSignalPrev);
LightSignalErr = (LightSignal - LIGHT_TARGET);
LightSignalInt += KITRACKING*LightSignalErr;
NumOut(50, LCD_LINE6, LightSignal);
// change over to use ultrasonic sensor for object detection
// stop when object detected - later on we can add u turn after timeout
// JMK
ObjectDistance = SensorUS(ULTRASONIC_SENSOR);
if (ObjectDistance < MIN_DISTANCE) {
// stop here.
motorControlDrive = 0;
motorControlSteer = 0;
}
else {
// Set control Drive and Steer. These are in motor degree/second
// KPTRACKING proportional gain for line following mode
// KITRACKING Integral gain for line following mode
// KDTRACKING Derivitive gain for line following mode - currently set = 0
// FCTRACKING filter constant for derivitive gain
motorControlDrive = NOM_SPEED;
motorControlSteer = (KPTRACKING * LightSignalErr )+ LightSignalDeriv + LightSignalInt
;
// Turn left if the intensity is too low, right if it is too high.
}
//Wait(CONTROL_WAIT);
}