Carrito Seguidor de Línea con Esquivado de Obstáculos
Notas importantes: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); } }
sensorFrontal, conectado al pin 3, que se utiliza para detectar un objeto al frente.Talk to Flux to get started.