Espera activa.

Buenas tengo una placa orangutan LV-168 que la programamos con arduino, tenemos que hacer una espera activa, o eso nos han dixo los profesores. EL ROBOT se encuentra dando vueltas, cuando detecte presencia cn GP2d12 tiene que empujar el oponente y si mientras que empuja o da vueltas detecta linea blanca con el sensores de linea tiene q salir de empujar o dar vueltas y modificar la posicion hasta que no detecte linea blanca XX's segundos, y que vuela al bucle otra vez, este es el codigo que tenemos hasta ahora:

void loop() // S'executa permanentment en forma de bucle
{
gp2d12Adc = analog.readAverage(GP2D12, NUM_MOSTRES_GP2); // Llegeix el canal 5 del ADC corresponent al sensor GP2D12
// Retorna un valor entre 0 - 1023 (0V - 5V)
// Fa 'NUM_MOSTRES_GP2' mostres (en el nostre cas 20) i en fa la mitja
// Cada mostra tarda aprox. 100us, per tant, una lectura completa en el
// nostre cas, suposa aprox. 100us x 20 = 2ms
gp2d12mV = analog.toMillivolts(gp2d12Adc); // Converteix el valor format 10bits a Milivolts de l'entrada Analògica (0 - 5000mV)

lcd.gotoXY(0,0); // Situa cursor a XY=(0,0) -> posició 0, línea 0
lcd.print("GP2:"); // Mostra text per LCD (8 caràcters) sobrescriu contingut
lcd.print(gp2d12Adc); // Printa valor format 10bits a continuació de "GP2:"
lcd.print(" "); // Printa 4 espais a continuació per si es passa d'escriure 4 dígits a 3, 2 o 1

lcd.gotoXY(2,1); // Situa cursor a XY=(2,1) -> posició 2, línea 1
lcd.print(gp2d12mV); // Printa valor format Milivolts
lcd.print("mV"); // Printa "mV" a continuació del valor en milivolts
lcd.print(" "); // Printa 4 espais a continuació per si es passa d'escriure 4 dígits a 3, 2 o 1

qtr.read(sensorsLinea); // Llegeix els sensors configurats, escriu lectures a 'sensorsLinea[]'

if (sensorsLinea[0] < LLINDAR_LINEA)
{
motors.setSpeeds(-motorSpeed, motorSpeed); //Quan detecta sensor dret es mou eskerra
delay(750);
motors.setSpeeds(motorSpeed, motorSpeed);
delay(300);
}

else if (sensorsLinea[5] < LLINDAR_LINEA) //Quan detecta sensor eskerre es mou dreta
{
motors.setSpeeds(motorSpeed, -motorSpeed);
delay(750);
motors.setSpeeds(motorSpeed, motorSpeed);
delay(300);
}

else // QUAN ESTEM SOBRE NEGRE
{

for(int i=0; i<300; i++)
{
gp2d12mV = analog.toMillivolts(analog.readAverage(GP2D12, NUM_MOSTRES_GP2)); // Llegeix el canal 5 del ADC corresponent al sensor GP2D12

if(gp2d12mV > LLINDAR_GP2D12) // DETECTEM RIVAL
{
leds.red(HIGH); // Si detecta, Enciende LED vermell
motors.setSpeeds(motorSpeed, motorSpeed);

if((sensorsLinea[0] < LLINDAR_LINEA) | (sensorsLinea[5] < LLINDAR_LINEA)) // QUAN DETECTEM LA LÍNEA, TIREM ENRERE DURANT 2SEGONS
{
motors.setSpeeds(0,0);

//if (i>10) //evitar rebots
i=300; //sortida
}

}
else
{
leds.red(LOW); // Apaguem LED vermell
motors.setSpeeds(-motorSpeed, motorSpeed); // girem

if((sensorsLinea[0] < LLINDAR_LINEA) | (sensorsLinea[5] < LLINDAR_LINEA)) // QUAN DETECTEM LA LÍNEA, TIREM ENRERE DURANT 2SEGONS
{
motors.setSpeeds(0,0);
//if (i>10)
i=300;
}
}

delay (10);

llinadr linea= al valor que nos dice si es blanco o negro

el problema que tenemos es que cuando detecta oponente empuja pero pasa por la linea blanca y no retrocede, nose si es mejor parar los motores un instante y luego retrocenda o no se que podemos hacer..

Gracias

Buenoo!! ya esta solucionado lo solucionamos un rato despues de poner este post, el problema estaba que cuando entrbamos en el FOR no le deciamos que leiera el sensor por eso no salia de la rutina!!

Graicas