// Incluimos librería e instanciamos el objeto servo
#include <Servo.h>
Servo myservo;
// Definición pines EnA y EnB para el control de la velocidad
int VelocidadMotor1 = 5;
int VelocidadMotor2 = 6;
// Definición pines sensor distancia y variables para el cálculo de la distancia
int echoPin = 2;
int trigPin = 3;
long duration;
int distance;
int delayVal;
// Definición de los pines de control de giro de los motores In1, In2, In3 e In4
int Motor1A = 13;
int Motor1B = 12;
int Motor2C = 8;
int Motor2D = 10;
// Variable control posición servo y observaciones
int servoPos = 0;
int servoReadLeft = 0;
int servoReadRight = 0;
// Configuración inicial
void setup() {
  delay(1000);
 // Vinculamos el pin digital 9 al servo instanciado arriba
 myservo.attach(9);
 // Establecemos modo de los pines del sensor de ultrasonidos
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 // Establecemos modo de los pines del control de motores
 pinMode(Motor1A,OUTPUT);
 pinMode(Motor1B,OUTPUT);
 pinMode(Motor2C,OUTPUT);
 pinMode(Motor2D,OUTPUT);
 pinMode(VelocidadMotor1, OUTPUT);
 pinMode(VelocidadMotor2, OUTPUT);
 // Configuramos velocidad de los dos motores
 analogWrite(VelocidadMotor1, 75);
 analogWrite(VelocidadMotor2, 80);
    myservo.write(90);
    Serial.begin(9600);
}
// Ejecución contínua
void loop() {
  delay(50);
    distance = medirDistancia();
    Serial.println(distance);
    if(distance < 15){
      stopCar();
        // Miramos a la derecha
        myservo.write(10);
        delay(600);
        servoReadRight = medirDistancia();
        // Miramos a la izquierda
        myservo.write(170);
        delay(600);
        servoReadLeft = medirDistancia();
        // Miramos de frente
        myservo.write(90);
        delay(600);
        if(servoReadLeft > servoReadRight){
          Serial.println("Giro izquierda");
          turnLeftCar();
        }
        if(servoReadRight >= servoReadLeft){
          Serial.println("Giro derecha");
          turnRightCar();
        }
    }
    if(distance > 15){
      Serial.println("Recto");
      moveForwardCar();
    }
void stopCar(){
    // Paramos el carrito
    digitalWrite(Motor1A, LOW);
    digitalWrite(Motor2D, LOW);
    digitalWrite(Motor1A, LOW);
    digitalWrite(Motor2D,LOW);
}
void turnRightCar(){
  // Configuramos sentido de giro para dirar a la derecha
  digitalWrite(Motor1A, LOW);
  digitalWrite(Motor2D,LOW);
  digitalWrite(Motor1A, HIGH);
  digitalWrite(Motor2D,LOW);
  delay(250);
}
void turnLeftCar(){
  // Configuramos sentido de giro para dirar a la izquierda
  digitalWrite(Motor1A,LOW);
  digitalWrite(Motor2D, LOW);
  digitalWrite(Motor1A,LOW);
  digitalWrite(Motor2D, HIGH);
  delay(250);
}
void moveForwardCar(){
  // Configuramos sentido de giro para avanzar
  digitalWrite(Motor1A, LOW);
  digitalWrite(Motor2D, LOW);
  digitalWrite(Motor1A, HIGH);
  digitalWrite(Motor2D,HIGH);
}
int medirDistancia(){
  // Lanzamos pulso de sonido
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
    // Leemos lo que tarda el pulso en llegar al sensor y calculamos distancia
    duration = pulseIn(echoPin, HIGH);
    distance = duration * 0.034 / 2;
    // Devolver distancia calculada
    return distance;
}