Pages: [1]   Go Down
Author Topic: [SOLUCIONADO] Ayuda con programacion de una funcion  (Read 433 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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!!!
« Last Edit: April 05, 2012, 05:53:10 am by UndercoverNerd » Logged

Elche, Spain
Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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();
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vale. Creo que me he liado demasiado.

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

Cambio el post a SOLUCIONADO
gracias!! smiley
Logged

Pages: [1]   Go Up
Jump to: