Carrito Seguidor de Línea con Esquivado de Obstáculos

A continuación se muestra el código corregido que incorpora un tercer sensor infrarrojo (por ejemplo, conectado al pin 3) para detectar objetos al frente y elimina el control de velocidad (es decir, ya no se utiliza analogWrite para controlar la velocidad de los motores):

Cpp


// Definición pines EnA y EnB para el control de la dirección (se elimina control de velocidad PWM)
int VelocidadMotor1 = 6; 
int VelocidadMotor2 = 5;

// 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 = 11; 
int Motor2D = 10; 

// Sensores infrarrojos para seguimiento de línea: izquierdo y derecho
int infraPin  = 2;    
int infraPin1 = 4;

// Nuevo sensor infrarrojo para detección frontal de objeto
int sensorFrontal = 3;

// Variables para la captura de valores: 0 = fondo claro o sin objeto; 1 = línea negra o objeto presente
int valorInfra = 0;  
int valorInfra1 = 0;
int valorFrontal = 0;  

// Función para ejecutar maniobra de esquiva de objeto detectado al frente
void esquivarObjetoFrontal() {
  Serial.println("Objeto detectado al frente, esquivando...");
  
  // Paso 1: Retrocede brevemente
  digitalWrite(Motor1B, HIGH);
  digitalWrite(Motor2C, HIGH);
  delay(300);
  digitalWrite(Motor1B, LOW);
  digitalWrite(Motor2C, LOW);
  
  // Paso 2: Gira a la derecha (se activa el motor izquierdo en avance)
  digitalWrite(Motor1A, HIGH);
  digitalWrite(Motor2D, LOW);
  delay(200);
  digitalWrite(Motor1A, LOW);
  
  // Paso 3: Avanza para retomar trayectoria
  digitalWrite(Motor1A, HIGH);
  digitalWrite(Motor2D, HIGH);
  delay(200);
  digitalWrite(Motor1A, LOW);
  digitalWrite(Motor2D, LOW);
}

void setup() {
  Serial.begin(9600);
  delay(1000);

  // Configuración de pines para sensores de línea y sensor frontal
  pinMode(infraPin, INPUT);    
  pinMode(infraPin1, INPUT);
  pinMode(sensorFrontal, INPUT);
  
  // Configuración de pines para el control de motores (dirección)
  pinMode(Motor1A, OUTPUT);
  pinMode(Motor1B, OUTPUT);
  pinMode(Motor2C, OUTPUT);
  pinMode(Motor2D, OUTPUT);
  
  // (Se omite configuración PWM, ya que no se usará control de velocidad)
  
  // Inicialmente, se establecen a reposo los motores
  digitalWrite(Motor1A, LOW);
  digitalWrite(Motor1B, LOW);
  digitalWrite(Motor2C, LOW);
  digitalWrite(Motor2D, LOW);
}

void loop() {
  // Lectura de los sensores infrarrojos para seguimiento de línea
  valorInfra = digitalRead(infraPin);   
  valorInfra1 = digitalRead(infraPin1);
  // Lectura del sensor infrarrojo frontal para detección de objeto
  valorFrontal = digitalRead(sensorFrontal);
  
  Serial.print("Sensor izquierdo: ");
  Serial.println(valorInfra);
  Serial.print("Sensor derecho: ");
  Serial.println(valorInfra1);
  Serial.print("Sensor frontal: ");
  Serial.println(valorFrontal);

  // Prioridad: si se detecta objeto al frente, se esquiva, sin procesar seguimiento de línea
  if (valorFrontal == 1) {
    esquivarObjetoFrontal();
  }
  // Caso 1: Ningún sensor de línea detecta la línea (fondo claro)
  else if (valorInfra == 0 && valorInfra1 == 0) {
    Serial.println("Ninguno en línea");
    
    // Movimiento en pulso hacia adelante
    digitalWrite(Motor1A, HIGH);
    digitalWrite(Motor2D, HIGH);
    delay(20);                      
    digitalWrite(Motor1A, LOW);
    digitalWrite(Motor2D, LOW);
    delay(20);                     
  }
  // Caso 2: Sensor infrarrojo derecho detecta línea negra -> corregir girando a la derecha
  else if (valorInfra == 0 && valorInfra1 == 1) {  
    Serial.println("Derecho en línea");
    
    digitalWrite(Motor1A, LOW);
    digitalWrite(Motor2D, LOW);
    delay(25);
    digitalWrite(Motor1A, HIGH);
    digitalWrite(Motor2D, LOW);
    delay(20);
  }
  // Caso 3: Sensor infrarrojo izquierdo detecta línea negra -> corregir girando a la izquierda
  else if (valorInfra == 1 && valorInfra1 == 0) { 
    Serial.println("Izquierdo en línea");
    
    digitalWrite(Motor1A, LOW);
    digitalWrite(Motor2D, LOW);
    delay(25);
    digitalWrite(Motor1A, LOW);
    digitalWrite(Motor2D, HIGH);
    delay(20);
  }
  // Caso 4: Ambos sensores de línea detectan línea negra
  else if (valorInfra == 1 && valorInfra1 == 1) { 
    Serial.println("Ambos sensores en línea");
    
    // En este caso se puede detener el vehículo o realizar otra acción
    digitalWrite(Motor1A, LOW);
    digitalWrite(Motor1B, LOW);
    digitalWrite(Motor2C, LOW);
    digitalWrite(Motor2D, LOW);
  }
}
Notas importantes:
  • Se ha añadido el tercer sensor infrarrojo denominado sensorFrontal, conectado al pin 3, que se utiliza para detectar un objeto al frente.
  • Se eliminaron las funciones de control de velocidad (PWM) mediante analogWrite; ahora el control se realiza únicamente con digitalWrite para definir el sentido (avance, retroceso, giro).
  • La rutina de esquiva se ejecuta con prioridad si el sensor frontal detecta un objeto (valor 1), independientemente del estado de los sensores de línea.
  • Los tiempos (delay) de la maniobra de esquiva se pueden ajustar según las características y dimensiones del vehículo.
Este ejemplo puede servirte de base; adapta las rutinas y tiempos según tus necesidades específicas.
Test the new code
Adjust sensor connections
Implement in physical setup
No schematic yet

Talk to Flux to get started.

No files yet

Documents

    Documents are markdown text files which describe project goals, capture details, or even simulation outputs.

    Assets

    No assets added.

    Ruling Peach R2-D2

    Ruling Peach R2-D2 thumbnail
    Welcome to your new project. Imagine what you can build here.

    Properties

    Properties describe core aspects of the project.

    Pricing & Availability

    Distributor

    Qty 1

    Controls