Robocar con ultrasonidos lento

Buenos días,

Recientemente me estoy montando un coche autonomo con arduino. Para esto estoy utilizando diferentes guías y mis conocimientos del grado.
Pues bien mi objetivo es que el coche esquive los obstáculos mediante ultrasonidos. La cosa es que para cuando ejecuta el código de marcha atrás, ya se ha comido la pared.
He añadido la función "Serial.println("obstaculo");" cuando ejecuta el código para esquivar. Cuando conecto el arduino nano al PC y pruebo a acercar mi mano al sensor, rapidamente me escribe "obstaculo" en el monitor serial. No entiendo por que tarda tanto en reaccionar en un caso real. He probado a modificar tiempos y nada.

Os dejo las guías que vi y los componentes que uso (ademas del programa). Haber si alguién sabría decirme. LLevo 5 días y nada :frowning:

Sensor ultrasónico, mideindo la distancia en un sistema de aparcamiento.
Cómo hacer un robot esquiva obstáculos V2 | Arduino - YouTube

Y otras dos que no me acuerdo (sobre el L298n)

#include <Drive.h>
#include <L298N.h>




const int pinIN1 = 5;
const int pinIN2 = 6;
const int pinIN3 = 7;
const int pinIN4 = 8;
const int pinENA = 9;
const int pinENB = 10;

const int waitTime = 2000;   //espera entre fases
const int speed = 200;      //velocidad de giro

const int pinMotorA[3] = { pinENA, pinIN1, pinIN2 };
const int pinMotorB[3] = { pinENB, pinIN4, pinIN3 };


#define TRIGGER 3
#define ECHO 4
const float sonido = 34300.0; // Velocidad del sonido en cm/s
const float umbral1 = 20.0;


void setup()
{
  Serial.begin(9600);
  //PARA SACAR ALIMENTACIÓN PARA EL SENSOR-
  pinMode (12, OUTPUT);
  digitalWrite (12, HIGH);
  pinMode(pinIN1, OUTPUT);
  pinMode(pinIN2, OUTPUT);
  pinMode(pinENA, OUTPUT);
  pinMode(pinIN3, OUTPUT);
  pinMode(pinIN4, OUTPUT);
  pinMode(pinENB, OUTPUT);
  pinMode(TRIGGER, OUTPUT);
  pinMode(ECHO, INPUT);
}

void loop()
{
  iniciarTrigger();
  float distancia = calcularDistancia();
  Serial.print (distancia);
  Serial.println ("cm");
  delay(75);                      // esperar 50ms entre pings (29ms como minimo)
 
  if (distancia < umbral1){
  stop (pinMotorA);
  stop (pinMotorB);
  Serial.println("obstaculo");
  delay (500);
  moveBackward(pinMotorA, 180);
  moveBackward(pinMotorB, 180);
  delay (1000);
  moveBackward(pinMotorA, 180);
  moveForward(pinMotorB, 180);
  delay (100);
  }
  else {
  moveForward(pinMotorA, 180);
  moveForward(pinMotorB, 180);
  delay(100);
  }
 
 
}
void iniciarTrigger()
{
 // Ponemos el Triiger en estado bajo y esperamos 2 ms
 digitalWrite(TRIGGER, LOW);
 delayMicroseconds(2);

 // Ponemos el pin Trigger a estado alto y esperamos 10 ms
 digitalWrite(TRIGGER, HIGH);
 delayMicroseconds(10);

 // Comenzamos poniendo el pin Trigger en estado bajo
 digitalWrite(TRIGGER, LOW);
}


// Método que calcula la distancia a la que se encuentra un objeto.
// Devuelve una variable tipo float que contiene la distancia
float calcularDistancia()
{
 // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
 unsigned long tiempo = pulseIn(ECHO, HIGH);


 // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
 // por eso se multiplica por 0.000001
 float distancia = tiempo * 0.000001 * sonido / 2.0;
 Serial.print(distancia);
 Serial.print("cm");
 Serial.println();
 delay(500);


 return distancia;
}




void moveForward(const int pinMotor[3], int speed)
{
  digitalWrite(pinMotor[1], HIGH);
  digitalWrite(pinMotor[2], LOW);

  analogWrite(pinMotor[0], speed);
}

void moveBackward(const int pinMotor[3], int speed)
{
  digitalWrite(pinMotor[1], LOW);
  digitalWrite(pinMotor[2], HIGH);

  analogWrite(pinMotor[0], speed);
}

void stop(const int pinMotor[3])
{
  digitalWrite(pinMotor[1], LOW);
  digitalWrite(pinMotor[2], LOW);

  analogWrite(pinMotor[0], 0);
}

Por favor, antes de que te lo digan lee las norms del foro y cambia tu post y el código, gracias

Te doy una pista (como para empezar a ver), para calcular la distancia manda el ping, calcula la distancia , peeero... ¡espera medio segundo para enviar la respuesta!
El pequeño detalle es que en ese medio segundo que el micro no hace nada el "bicho" sigue moviéndose.

Imaginate detrás de un volante, ves que vas a chocar y en lugar de clavar los frenos te quedas medio segundo sin reaccionar. ¡Paff! :smiley:

Pues de echo estaba haciendo lo contrario!!! Subía más el tiempo del delay jajajajajaja
Gracias por tu ayuda! Mañana en cuanto llegue del trabajo probaré a bajarlo jejejejeje
En las guías que leí ponía que mínimo usar 29ms, así que pensé que cuanto más alto más preciso!

Un saludo!

PD: Revisando los delay me acabo de dar cuenta que le puse (100) en marcha alante... En total son 175 lo que tengo hasta que da otra orden. Probaré quitando los dos

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.