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

Arduino-Controlled Obstacle-Avoiding Robot with Ultrasonic and IR Sensors

View and Edit Project In Cirkit DesignerImage of Arduino-Controlled Obstacle-Avoiding Robot with Ultrasonic and IR Sensors

Circuit Documentation

Summary

This circuit is designed to control a pair of DC motors using an L298N motor driver, with inputs from an HC-SR04 ultrasonic sensor and two IR sensors for object detection and line following capabilities. The brain of the circuit is an Arduino UNO microcontroller, which processes sensor inputs and controls the motor driver accordingly. A 4 x AAA battery mount provides the power source, and a rocker switch is included for power control.

Component List

4 x AAA Battery Mount

HC-SR04 Ultrasonic Sensor

Arduino UNO

IR Sensor

L298N DC Motor Driver

Rocker Switch

Hobby Gearmotor with 48:1 Gearbox

Wiring Details

4 x AAA Battery Mount

HC-SR04 Ultrasonic Sensor

Arduino UNO

IR Sensors

L298N DC Motor Driver

Rocker Switch

Hobby Gearmotors

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("Iz