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
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);
}