Go Down

Topic: [SOLUCIONADO] Ayuda con programacion de una funcion (Read 446 times) previous topic - next topic

UndercoverNerd

Apr 05, 2012, 11:09 am Last Edit: Apr 05, 2012, 12:53 pm by UndercoverNerd Reason: 1
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:



Code: [Select]
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!!!

chocala

¿Por que no cambias el valor del último delay por 3000?
Saludos

UndercoverNerd

Hola.
Bueno, lo del 5000 es lo de menos. Aún no he calculado que sea 5 o 3 seg, lo que tarda en dar la vuelta. Quiero decir, que el problema viene en que la funcion vuelta() deja de ejecutarse cuando la condicion de arriba deja de cumplirse.

Es decir, si la funcion de vuelta tarda 5 seg en ejecutarse completa, pero entre tanto, detecta que la distancia del sensor es de mas de 5cm, dejará de ejecutarse, y ejecutará la otra condición, la funcion adelante();

UndercoverNerd

Vale. Creo que me he liado demasiado.

Parece que con poner el delay al tiempo necesario es suficiente.

Cambio el post a SOLUCIONADO
gracias!! :)

Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview