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

Arduino UNO-Based Autonomous Obstacle-Avoiding Robot with Ultrasonic Sensors

View and Edit Project In Cirkit DesignerImage of Arduino UNO-Based Autonomous Obstacle-Avoiding Robot with Ultrasonic Sensors

Circuit Documentation

Summary

This document provides a detailed overview of a circuit designed to control a robotic car using an Arduino UNO microcontroller. The circuit includes an H-Bridge motor driver, multiple DC motors, and ultrasonic sensors for obstacle detection. The Arduino UNO is programmed to control the motors based on the distance measurements from the ultrasonic sensors.

Component List

  1. Arduino UNO

    • Description: A microcontroller board based on the ATmega328P.
    • Pins: UNUSED, IOREF, Reset, 3.3V, 5V, GND, Vin, A0, A1, A2, A3, A4, A5, SCL, SDA, AREF, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0
  2. Puente H carrito

    • Description: An H-Bridge motor driver used to control the direction and speed of DC motors.
    • Pins: OUT1, OUT2, OUT3, OUT4, 12V, GND, 5V, ENA, IN1, IN2, IN3, IN4, ENB, 5VEN
  3. DC Motor (2 units)

    • Description: A simple DC motor.
    • Pins: pin 1, pin 2
  4. HC-SR04 Ultrasonic Sensor (3 units)

    • Description: An ultrasonic sensor used for distance measurement.
    • Pins: VCC, TRIG, ECHO, GND
  5. 9V Battery

    • Description: A 9V battery used to power the circuit.
    • Pins: -, +

Wiring Details

Arduino UNO

Puente H carrito

DC Motor 1

DC Motor 2

HC-SR04 Ultrasonic Sensor (front)

HC-SR04 Ultrasonic Sensor (left)

HC-SR04 Ultrasonic Sensor (right)

9V Battery

Documented Code

Arduino UNO Code

int motor_lA = 9;
int motor_lB = 10;
int motor_enableA = 11;
int motor_rA = 3;
int motor_rB = 4;
int motor_enableB = 5;
int trigger_front = A0;
int echo_front = A1;
int trigger_left = A2;
int echo_left = A3;
int trigger_right = A4;
int echo_right = A5;

void setup() {
  // Configuración de pines
  pinMode(motor_lA, OUTPUT);   // Motores izquierdos adelante
  pinMode(motor_lB, OUTPUT);   // Motores izquierdos atrás
  pinMode(motor_enableA, OUTPUT);
  pinMode(motor_rA, OUTPUT);   // Motores derechos adelante
  pinMode(motor_rB, OUTPUT);   // Motores derechos atrás
  pinMode(motor_enableB, OUTPUT);
  pinMode(trigger_front, OUTPUT);
  pinMode(echo_front, INPUT);
  pinMode(trigger_left, OUTPUT);
  pinMode(echo_left, INPUT);
  pinMode(trigger_right, OUTPUT);
  pinMode(echo_right, INPUT);

  // Inicialización de PWM para los motores
  analogWrite(motor_enableA, 80);
  analogWrite(motor_enableB, 88);

  // Inicialización del puerto serial
  Serial.begin(9600);
}

void loop() {
  // Variables para la duración y distancia
  long duration_front, distance_front, duration_left, distance_left, duration_right, distance_right;

  // Calcular distancia del sensor frontal
  digitalWrite(trigger_front, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger_front, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger_front, LOW);
  duration_front = pulseIn(echo_front, HIGH);
  distance_front = duration_front * 0.034 / 2;

  // Calcular distancia del sensor izquierdo
  digitalWrite(trigger_left, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger_left, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger_left, LOW);
  duration_left = pulseIn(echo_left, HIGH);
  distance_left = duration_left * 0.034 / 2;

  // Calcular distancia del sensor derecho
  digitalWrite(trigger_right, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger_right, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger_right, LOW);
  duration_right = pulseIn(echo_right, HIGH);
  distance_right = duration_right * 0.034 / 2;

  // Imprimir distancias en el puerto serial
  Serial.print("front = ");
  Serial.println(distance_front);
  Serial.print("Left = ");
  Serial.println(distance_left);
  Serial.print("Right = ");
  Serial.println(distance_right);
  delay(50);

  // Lógica de movimiento basada en las distancias medidas
  if (distance_front > 20) {
    forward();

    if (distance_left > 10 && distance_left < 20) {
      forward();
    }
    if (distance_left >= 20) {
      left();
      delay(30);
      forward();
    }
    if (distance_left < 10 && distance_left > 0) {
      right();
      delay(30);
      forward();
    }
  }

  if (distance_front <= 20 && distance_right > 20) {
    Stop();
    delay(1000);
    right();
    delay(400);
  }
  if (distance_front <= 20 && distance_right < 20) {
    Stop();
    delay(1000);
    right();
    delay(800);
  }
}

void forward()