Problemas con robot: programa para 3 sensores ultrasonido

Buenas tardes,
Antes de empezar a describir el problema quiero aclarar que soy un novato (la verdad es que mucho) y que había subido un topic parecido hace unos meses, por motivos personales tuve que dejarlo una temporada y ahora que me he decidido a continuarlo quiero probar un enfoque distinto.
Ahora el problemas: estoy creando un robot, a la hora de usar un solo módulo ultrasonido (conectado a una Mega) no he tenido problemas sin embargo al poner tres a la vez no funciona... Lo que se pretende es que se mueva hacia delante, si detecta un obstáculo frontal que retroceda, que gire a la derecha por ejemplo y que continué, si detecta un obstáculo por la derecha pues que gire a la izquierda y un obstáculo por la izquierda pues a la derecha. Luego tengo pensado ir añadiendo cosas para concederle mas autonomía pero de momento...
Les paso el código:

int IN1 = 22; 
int IN2 = 23;
int IN3 = 24; 
int IN4 = 25;

#include <NewPing.h>

#define TRIGGER_PIN  2  
#define ECHO_PIN  3 
#define TRIGGER_PIN2  4
#define ECHO_PIN2  5
#define TRIGGER_PIN3 6
#define ECHO_PIN3  7
#define MAX_DISTANCE 200 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
NewPing sonar1(TRIGGER_PIN2, ECHO_PIN2, MAX_DISTANCE);
NewPing sonar2(TRIGGER_PIN3, ECHO_PIN3, MAX_DISTANCE); 


void setup() {

 pinMode (IN1, OUTPUT);    // entrada 1
 pinMode (IN2, OUTPUT);    // entrada 2
 pinMode (IN3, OUTPUT);    // entrada 3
 pinMode (IN4, OUTPUT);    // entrada 4

Serial.begin(115200);

}

void loop() {

Adelante ();
if(sonar.ping_cm() < 10)
 {Atras();
  delay(3000);
  derecha();
  delay(3000);
  }
 else{
  Adelante();
 }

  if(sonar1.ping_cm() < 10)
  {Derecha();
  delay(3000);
  }
 else {
  Adelante();
 }


if(sonar2.ping_cm() < 10)
  {Izquierda();
  delay(3000);
}
else{
  Adelante();
}
  delay(1000);               
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); 
  Serial.println("cm");

  delay(1000);               
  Serial.print("Ping1: ");
  Serial.print(sonar1.ping_cm()); 
  Serial.println("cm");

  delay(1000);                
  Serial.print("Ping2: ");
  Serial.print(sonar2.ping_cm()); 
  Serial.println("cm");
}

void Adelante ()
{
 //Direccion motor A
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, LOW);
 //Direccion motor B
 digitalWrite (IN3, HIGH);
 digitalWrite (IN4, LOW);
}

void Atras ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, HIGH);
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, HIGH);
}

void Derecha ()
{
 //Direccion motor A
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, LOW);
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, HIGH);
}

void Izquierda ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, HIGH);
 //Direccion motor B
 digitalWrite (IN3, HIGH);
 digitalWrite (IN4, LOW);
}

void Parar ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, LOW);
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, LOW);
}

Agradecería mucho la ayuda ya que me encanta Arduino y es una pena quedar atrancado y espero que haya sido descriptivo con el problema, aun así sino se entiende por favor decirlo.

Porque usas delay()?
Delay frena el flujo del programa o sea tu robot por 2, 3 o N segundos deja de percibir obstáculos.

Si haces un robot no puedes usar delay().

A cada momento un delay, miro que lees un sensor delay(1000) lees el otro delay(1000), y terminas con 3 segundos entre cada sensor.. dime.. crees que la medicion se hace mas estable por hacerlo de ese modo?

Probaste quitando los 3 delay() y leyendo los 3 simultáneos.. ahhh dan lo mismo.. y por supuesto. El delay() no cumple ninguna funcion mas que dejar que el robot choque o no gire.

Ve a Documentacion => indice de temas tutoriales => millis() y también lee el otro apartado de Maquina de estados.

Luego que lo hagas nos comentas y re escribiremos tu código.

Bueno ya he leído las diferencias entre delay y millis, ahora me han surgido dudas a la hora de usar esta nueva función, seria establecer un tiempo de inicio, la función unsigned long tiempoinicio, darle un valor 0, luego ese tiempo de inicio igualarlo a millis y establecer una condición en la que se tiene que dar una substracción para sacar el valor deseado, ahora en lo que me pierdo es en la relación con el intervalo... a ver si podéis ayudarme a aclararme, gracias

No.
Tal vez no me he explicado bien porque cuando veo delay() muchas veces solo veo eso y olvido el contexto. No siempre pero tal vez este sea el caso.

Vamos otra vez.

Tienes 3 sensores ultrasónicos que buscas obstáculos de modo que hay que leerlos simultáneamente o lo mas cercano a eso. Por esta razón, no se debe usar delay() porque cualquier valor entre sensores ultrasónicos será un tiempo que no vemos que hay delante y por lo tanto perdemos tiempo de reacción.

Prueba asi y me dices.

int IN1 = 22; 
int IN2 = 23;
int IN3 = 24; 
int IN4 = 25;

#include <NewPing.h>

#define TRIGGER_PIN1  2  
#define ECHO_PIN1     3 
#define TRIGGER_PIN2  4
#define ECHO_PIN2     5
#define TRIGGER_PIN3  6
#define ECHO_PIN3     7
#define MAX_DISTANCE  200 

NewPing sonar1(TRIGGER_PIN1, ECHO_PIN1, MAX_DISTANCE); 
NewPing sonar2(TRIGGER_PIN2, ECHO_PIN2, MAX_DISTANCE);
NewPing sonar3(TRIGGER_PIN3, ECHO_PIN3, MAX_DISTANCE); 


void setup() {
  pinMode (IN1, OUTPUT);    // entrada 1
  pinMode (IN2, OUTPUT);    // entrada 2
  pinMode (IN3, OUTPUT);    // entrada 3
  pinMode (IN4, OUTPUT);    // entrada 4

  Serial.begin(115200);
}

void loop() {

  //Adelante ();
  Serial.print("Ping1: ");
  Serial.print(sonar1.ping_cm()); 
  Serial.println("cm");

  if (sonar1.ping_cm() < 10) {
      Atras();
      delay(3000);
      derecha();
      delay(3000);
  }
  else{
      Adelante();
  }

  Serial.print("Ping2: ");
  Serial.print(sonar2.ping_cm()); 
  Serial.println("cm");
  
  if (sonar2.ping_cm() < 10) {
      Derecha();
      delay(3000);
  }
  else {
      Adelante();
  }

  Serial.print("Ping3: ");
  Serial.print(sonar3.ping_cm()); 
  Serial.println("cm");
  
  if (sonar3.ping_cm() < 10) {
      Izquierda();
      delay(3000);
  }
  else{
      Adelante();
  }
}

void Adelante ()
{
 //Direccion motor A
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, LOW);
 //Direccion motor B
 digitalWrite (IN3, HIGH);
 digitalWrite (IN4, LOW);
}

void Atras ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, HIGH);
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, HIGH);
}

void Derecha ()
{
 //Direccion motor A
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, LOW);
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, HIGH);
}

void Izquierda ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, HIGH);
 //Direccion motor B
 digitalWrite (IN3, HIGH);
 digitalWrite (IN4, LOW);
}

void Parar ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, LOW);
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, LOW);
}