Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino-Controlled Line-Following Robot with Ultrasonic Obstacle Detection

View and Edit Project In Cirkit DesignerImage of Arduino-Controlled Line-Following Robot with Ultrasonic Obstacle Detection

Circuit Documentation

Summary

This circuit is designed to control a robot with two gearmotors, using an Arduino UNO as the central processing unit. It includes an HC-SR04 Ultrasonic Sensor for distance measurement, two IR sensors for line tracking, an L298N DC motor driver for motor control, a rocker switch for power management, and a 18650 Li-Ion battery as the power source.

Component List

HC-SR04 Ultrasonic Sensor

Arduino UNO

L298N DC Motor Driver

Rocker Switch

Hobby Gearmotor with 48:1 Gearbox (x2)

IR Sensor (x2)

18650 Li-Ion Battery

Wiring Details

HC-SR04 Ultrasonic Sensor

Arduino UNO

L298N DC Motor Driver

Rocker Switch

Hobby Gearmotor with 48:1 Gearbox

IR Sensor

18650 Li-Ion Battery

Documented Code

// 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;  
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;  

// Ultrasonicos
#define PIN_TRIG 9
#define PIN_ECHO 8
 
long duration, distancia;
// Configuración inicial
void setup() {
  Serial.begin(9600);
  
  delay(1000);
  //configuración del ultrasonico
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  // Establecemos modo de los pines de los sensores infrarrojo
  pinMode(infraPin, INPUT);    
  pinMode(infraPin1, 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 los dos motores a velocidad 150/255
  analogWrite(VelocidadMotor1, 150); 
  analogWrite(VelocidadMotor2, 180);  

  // Configuramos sentido de giro
  digitalWrite(Motor1A, LOW);
  digitalWrite(Motor1B, LOW);
  digitalWrite(Motor2C, LOW);
  digitalWrite(Motor2D, LOW);
}

// Ejecución contínua
void loop() {
  // Ultrasonico: Primero, generar un pulso corto de 2-5 microsegundos.
  digitalWrite(PIN_TRIG, LOW);
  delayMicroseconds(5);
  digitalWrite(PIN_TRIG, HIGH);
  // Después de ajustar un nivel de señal alto, esperamos unos 10 microsegundos. En este punto el sensor enviará señales con una frecuencia de 40 kHz.
  delayMicroseconds(10);
  digitalWrite(PIN_TRIG, LOW);
  // Tiempo de retardo de la señal acústica en el sonar.
  duration = pulseIn(PIN_ECHO, HIGH);
  // Ahora es el momento de convertir el tiempo a distancia
  distancia = (duration / 2) / 29.1;
  Serial.print("Distancia al objeto: ");
  Serial.print(distancia);
  Serial.println(" см.");
  
  // Leemos el valor de los infrarrojo: 0 - fondo claro y 1 - línea negra
  valorInfra = digitalRead(infraPin);   
  valorInfra1 = digitalRead(infraPin1);

  Serial.println(valorInfra);
  Serial.println(valorInfra1);
  if (distancia > 10){ //mientras no detecte nada a cierta distancia no se detiene   
      // Cuatro escenarios: De frente      
      if(valorInfra == 0 && valorInfra1 == 0){
        Serial.println("Ninguno en linea");
        
        // Modificamos sentido de giro de los motores
        digitalWrite(Motor1A, HIGH);
        digitalWrite(Motor2D, HIGH);
        delay(20);                      
        digitalWrite(Motor1A, LOW);
        digitalWrite(Motor2D,LOW);
        delay(20);                     
      }
    
      // El robot encuentra línea negra con el infrarrojo derecho y hay que corregir girando a la derecha
      if(valorInfra == 0 && valorInfra1 == 1){  
        Serial.println("Derecho en linea");
        
        // Modificamos sentido de giro de los motores
        digitalWrite(Motor1A, LOW);
        digitalWrite(Motor2D,LOW);
        delay(25);
        digitalWrite(Motor1A, HIGH);
        digitalWrite(Motor2D,LOW);
        delay(20);
      }
    
      // El robot encuentra línea negra con el infrarrojo izquierdo y hay que corregir girando a la izquierda
      if(valorInfra == 1 && valorInfra1 == 0){ 
        Serial.println("Izquierdo en linea");
        
        // Modificamos sentido de giro de los motores
        digitalWrite(Motor1A,LOW);
        digitalWrite(Motor2D, LOW);
        delay(25);
        digitalWrite(Motor1A,LOW);
        digitalWrite(Motor2D