Hola.
El caso es que me estoy haciendo un pequeño robot con un sensor de ultrasonidos, y la idea es que vaya para alante, y cuando la distancia sea menor que 5cm, dé la vuelta.
Estoy usando para ello un sensor de ultrasonidos y dos motores controlados con un L293.
He hecho dos funciones, una que se llama adelante() que mueve los dos motores hacia alante, y otra que se llama vuelta(), que mueve uno para cada lado.
Tengo más o menos claro como hacerlo, pero me falla la funcion de dar la vuelta, ya que quiero que esta funcion se ejecute durante x segundos, y luego se ejecute la de ir para adealnte. Es decir:
On>>> Distancia mayor que 5 >>> Adelante
Distancia menor que 5>>>Vuelta >>>Adelante (así sucesivamente)
El problema que veo es que la funcion vuelta() se ejecuta mientras la distancia sea menor a 5, por lo que si hay un obstáculo de frente, el robot empezará a dar la vuelta, y parará de darla cuando ya no encuentre el obstáculo, mientras que yo lo que quiero es que la dé durante 3 segundos (es lo que tarda el robot en girar 180º lentamente) y entonces se pregunte si sigue adelante.
No sé si me he explicado bien. Alguien tiene alguna idea sobre cómo hacerlo?
Os pego el código que tengo pensado:
void loop()
{
dist = ultrasonic.Ranging(CM);
//modo de dar la vuelta
if (dist > 5)
{
adelante();
}
else
{
vuelta();
}
}
void adelante(){
digitalWrite(motor1a, HIGH);
digitalWrite(motor1b, HIGH);
analogWrite(motor1run, 255);
digitalWrite(motor2a, HIGH);
digitalWrite(motor2b, HIGH);
analogWrite(motor2run, 255);
}
void vuelta(){
//apaga motores
analogWrite(motor1run, LOW);
analogWrite(motor2run, LOW);
delay(2000);
// vuelta despacio
digitalWrite(motor1a, LOW);
digitalWrite(motor1b, HIGH);
analogWrite(motor1run, 100);
digitalWrite(motor2a, HIGH);
digitalWrite(motor2b, LOW);
analogWrite(motor2run, 100);
//espera 5
delay(5000);
}
Muchas gracias de antemano!!!