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