Carrito Seguidor de Línea con Evasión de Obstáculos
Cpp
// Definición pines EnA y EnB para el control de la velocidad 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; // Se usa Motor1B en lugar de "MotoBr1" int Motor2C = 11; int Motor2D = 10; // Sensores infrarrojo - izquierdo y derecho int infraPin = 2; int infraPin1 = 4; // Variables para la captura de los valores: 0 - fondo claro y 1 - línea negra int valorInfra = 0; int valorInfra1 = 0; // Definición de pines para el sensor ultrasónico (HC-SR04) int trigPin = 7; int echoPin = 8; long duracion; float distancia; // Umbral para detección de obstáculo (en cm) float umbralObstaculo = 15.0; void setup() { Serial.begin(9600); delay(1000); // Configurar pines de los sensores infrarrojos pinMode(infraPin, INPUT); pinMode(infraPin1, INPUT); // Configurar pines del control de motores pinMode(Motor1A, OUTPUT); pinMode(Motor1B, OUTPUT); pinMode(Motor2C, OUTPUT); pinMode(Motor2D, OUTPUT); pinMode(VelocidadMotor1, OUTPUT); pinMode(VelocidadMotor2, OUTPUT); // Configurar pines del sensor ultrasónico pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // Configurar velocidad de los motores analogWrite(VelocidadMotor1, 300); analogWrite(VelocidadMotor2, 300); // Configurar sentido de giro inicial (motores apagados) digitalWrite(Motor1A, LOW); digitalWrite(Motor1B, LOW); digitalWrite(Motor2C, LOW); digitalWrite(Motor2D, LOW); } float medirDistancia() { // Envío de pulso ultrasónico digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Medición de la duración del eco duracion = pulseIn(echoPin, HIGH); // Calculo de la distancia en cm distancia = (duracion * 0.034) / 2; return distancia; } void esquivarObstaculo() { Serial.println("Obstaculo detectado"); // 1. Parar motores rápidamente digitalWrite(Motor1A, LOW); digitalWrite(Motor1B, LOW); digitalWrite(Motor2C, LOW); digitalWrite(Motor2D, LOW); delay(100); // 2. Retroceder durante 300ms // Se asume que para retroceder se activa Motor1B (motor izquierdo hacia atrás) y Motor2C (motor derecho hacia atrás) digitalWrite(Motor1B, HIGH); digitalWrite(Motor2C, HIGH); delay(300); digitalWrite(Motor1B, LOW); digitalWrite(Motor2C, LOW); // 3. Girar a la derecha durante 400ms para cambiar de carril // En este ejemplo, se activa solo el motor izquierdo hacia adelante digitalWrite(Motor1A, HIGH); digitalWrite(Motor2D, LOW); delay(400); digitalWrite(Motor1A, LOW); // 4. Avanzar durante 300ms para alejarse del obstáculo digitalWrite(Motor1A, HIGH); digitalWrite(Motor2D, HIGH); delay(300); // Se detienen para luego retomar el seguimiento de línea digitalWrite(Motor1A, LOW); digitalWrite(Motor2D, LOW); } void loop() { // Primero: medir distancia con el sensor ultrasónico float dist = medirDistancia(); Serial.print("Distancia: "); Serial.println(dist); // Si se detecta un obstáculo, se ejecuta la rutina de evasión if (dist > 0 && dist < umbralObstaculo) { esquivarObstaculo(); // Tras la maniobra se espera unos instantes para estabilizarse delay(200); } // Seguimiento de línea (mismo código original) valorInfra = digitalRead(infraPin); valorInfra1 = digitalRead(infraPin1); Serial.print("Infra1: "); Serial.println(valorInfra); Serial.print("Infra2: "); Serial.println(valorInfra1); // Caso en el que ninguno de los sensores detecta línea if (valorInfra == 0 && valorInfra1 == 0) { Serial.println("Ninguno en linea"); // Movimiento de corrección digitalWrite(Motor1A, HIGH); digitalWrite(Motor2D, HIGH); delay(20); digitalWrite(Motor1A, LOW); digitalWrite(Motor2D, LOW); delay(20); } // Caso en el que el sensor infrarrojo derecho detecta línea if (valorInfra == 0 && valorInfra1 == 1) { Serial.println("Derecho en linea"); digitalWrite(Motor1A, LOW); digitalWrite(Motor2D, LOW); delay(25); digitalWrite(Motor1A, HIGH); digitalWrite(Motor2D, LOW); delay(20); } // Caso en el que el sensor infrarrojo izquierdo detecta línea if (valorInfra == 1 && valorInfra1 == 0) { Serial.println("Izquierdo en linea"); digitalWrite(Motor1A, LOW); digitalWrite(Motor2D, LOW); delay(25); digitalWrite(Motor1A, LOW); digitalWrite(Motor2D, HIGH); delay(20); } // Caso en que ambos sensores detectan la línea (posible fin de recorrido) if (valorInfra == 1 && valorInfra1 == 1) { Serial.println("Ambos en linea"); digitalWrite(Motor1A, LOW); digitalWrite(Motor1B, LOW); digitalWrite(Motor2C, LOW); digitalWrite(Motor2D, LOW); } }
trigPin y echoPin (usando los pines 7 y 8) y la función medirDistancia() para obtener la distancia en centímetros.esquivarObstaculo().Talk to Flux to get started.