Repetir acción sólo una vez - Establecer más de un condicional

Buenos días, soy nuevo en arduino y tengo que presentar un proyecto el lunes, el proyecto es de mi autoría y pues estoy teniendo problemas. Lo que quiero hacer es un carro robot que sea capaz de buscar objetos autonomamente, los recoja y los lleve a otro objeto, para esto he puesto sensores de ultrasonido y servos. Sin emargo los problemas que tengo ahora son:

  • Necesito que él busque una ruta, si encuentra un objeto, lo recoja y busque otra ruta para llevarlo, pero que no recoja más. Entonces, el código lo hace pero no como quiero, busca ruta, recoje, busca nueva ruta sin recojer, vuelve a bucar ruta pero esta vez sí recoje, es decir, se repitió el proceso.
  • Ahora, el más importante, necesito establecer varias condiciones con respecto a la distancia, si la distancia del ultrasonido cuando mira al frente es menor que las laterales, avanza. Si la distancia izquierda es menor que distancia frente y distancia derecha, gira izquierda, y si distancia derecha es menor a distancia frente y distancia izquierda, gira derecha.

Les agradecería mucho que me ayudaran lo más antes posible, ya necesito presentar el proyecto en dos días y por más que busco e intento, nada funciona :cry:

Les dejaré el código para que me ayuden

Robotz.ino (5.49 KB)

Es decir que lo que recoge de la ruta 1 lo debe dejar en la ruta 2.
Luego reiniciar buscando una ruta 3 y volver a la 2 o que lo guarde en una nueva ruta 4?

Al final ira acumulando de a 2 y luego repite hasta tener todo en un solo sitio?

No, él se encuentra en un punto inicial 1, debe buscar el objeto en un punto 2 y solamente cuando está frente al objeto, lo recoje. Luego, como no almacena la ubicación incial, debe buscar un punto 3, donde asumirá que es el punto inicial (aunque no lo sea). Esto lo hace el código, solo que después de completar este fase, se repite, es decir, es un ciclo. Yo no quiero que sea así, sólo que cuando lo recoja busque la siguiente ruta solamente(Punto 3), sin recojer ni nada, simplemente búsqueda.

Lo primero que veo en tu código es que tendrías que haber creado una máquina de estados donde estuviese mas claro que pasos esta dando el robot.

Haciendo lo mejor que pude con el poco tiempo que tienes ya que para mi gusto habría que rehacer todo, prueba este comportamiento del código

#include <Servo.h>      

int izqA = 5;
int izqB = 4;
int derA = 3;
int derB = 2;

int leda = 12;
int ledr = 13;

int Trig = 8;
int Echo = 9;
int Trig2 = 10;
int Echo2 = 11;

int servopin = 6;
int servoPin2 = 7; 

int vel = 200;           // Velocidad de los motores (0 - 200)
long distanciaizquierda = 0;
long distanciaderecha = 0;
long distanciafrente = 0;
     
long distancia;
long distancia2;
long distancia3;
long distancia4;

Servo Servo1;                     

Servo myservo;
enum modo {BUSCAR = 0, RECOGER}
modo = BUSCAR;


void setup ()
{
  Serial.begin(9600);
  pinMode(izqA,OUTPUT);  
  pinMode(izqB,OUTPUT);
  pinMode(derA,OUTPUT);
  pinMode(derB,OUTPUT);
  pinMode(ledr,OUTPUT);
  pinMode(leda,OUTPUT);
  pinMode(Trig,OUTPUT);
  pinMode(Echo,INPUT);
  pinMode(Trig2,OUTPUT);
  pinMode(Echo2,INPUT);
  myservo.attach(servopin);
  Servo1.attach(servoPin2); 
  myservo.write(90);
  delay(500);

}

void loop() {
  buscarruta();
  
  if (distancia <= 5) { 
     if (modo == RECOGER)
        recoger();
     else {
        detenerse();
        delay(5000); // pausa detenido en sitio donde no recoge objeto.
        modo = RECOGER;
     }
  }
}

void recoger() {
  detenerse();  
  distancia = leo_ultrasonico2();

  Serial.println("Distancia objeto =");
  Serial.println(distancia);
  Serial.println(" cm");

  
  delay(4000);             
  Servo1.write(-180);
  delay(2000);
  modo = BUSCAR;  // siguiente objeto no sera recogido.
}

void buscarruta() {                       
  detenerse();     
  busca_objeto();                      
  
  if ((distanciafrente < distanciaizquierda) && 
      (distanciafrente < distanciaderecha))  { 
      adelanta(); 
  }           
                    
  else 
  if ((distanciaizquierda < distanciaderecha) && 
      (distanciaizquierda < distanciafrente)) {
      giraizquierda();
      adelanta();
  }
  else {
      giraderecha ();
      adelanta();
  }
}


void adelanta() {                         //Se mueve hacia adelante.
  digitalWrite(leda, HIGH);
  digitalWrite(ledr, LOW);
  analogWrite(derA, 0);
  analogWrite(derB,vel);  
  analogWrite(izqA, 0);
  analogWrite(izqB,vel);
}

void retrocede() {                            
  digitalWrite(leda, LOW);
  digitalWrite(ledr, HIGH);
  analogWrite(izqA,vel);
  analogWrite(izqB,0);
  analogWrite(derA,vel);
  analogWrite(derB,0);
  delay(400);
  detenerse();
}

void detenerse() {                          
  digitalWrite(leda, LOW);
  digitalWrite(ledr, LOW); 
  analogWrite(izqA,0);
  analogWrite(izqB,0);
  analogWrite(derA,0);
  analogWrite(derB,0);
  delay(400);                
}

void busca_objeto() {
  miraizquierda();                        
  mirafrente();
  miraderecha();                          
}
 
void miraizquierda() {                      //Se configuran los pasos a seguir cuando mira a la izquierda.
  myservo.write(170);
  delay(2000);
   
  distanciaizquierda = leo_ultrasonico1();
  Serial.println("Distancia Izquierda =");
  Serial.println(distanciaizquierda);
  Serial.println(" cm");                                                       
}

void mirafrente() {
  myservo.write(90);
  delay(2000); 
   
  distanciafrente = leo_ultrasonico1();
  Serial.println("Distancia frente    =");
  Serial.println(distanciafrente);
  Serial.println(" cm");
                          
  myservo.write(10);
  delay(2000);                       
}

void miraderecha()  {                      //Se configuran los pasos a seguir cuando mira a la derecha.
    
  distanciaderecha = leo_ultrasonico1();

  Serial.println("Distancia Derecha   =");
  Serial.println(distanciaderecha);
  Serial.println(" cm");
                          
  myservo.write(90);                                  
  delay(2000);                       
}

void giraizquierda () {                   //Se configuran los pasos a seguir cuando gira a la izquierda.
  digitalWrite(leda, LOW);
  digitalWrite(ledr, HIGH);
  analogWrite(izqA,0);      
  analogWrite(izqB,vel);     
  analogWrite(derA,vel);
  analogWrite(derB,0);
  delay(2000);                    
  adelanta();
  delay(3000);
}

void giraderecha () {                    //Se configuran los pasos a seguir cuando gira a la derecha.
  digitalWrite(leda, LOW);
  digitalWrite(ledr, HIGH);
  analogWrite(izqA,vel);       
  analogWrite(izqB,0);   
  analogWrite(derA,0);
  analogWrite(derB,vel);
  delay(2000); 
  adelanta();
  delay(3000);
}

long leo_ultrasonico1() {
  int tmp;

  digitalWrite(Trig, LOW);
  delayMicroseconds(5);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);

  tmp = pulseIn(Echo, HIGH)/2;
  return tmp;
}

long leo_ultrasonico2() {
  long tmp;

  digitalWrite(Trig2, LOW);
  delayMicroseconds(5);
  digitalWrite(Trig2, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig2, LOW);

  tmp = pulseIn(Echo2, HIGH)/2;
   
  return tmp/29;
}