Código de búsqueda

Lección 26/31: Coche Inteligente Parte 4: Evitando Obstáculos Usando Sensor Ultrasónico | SunFounder Robojax

Lección 26/31: Coche Inteligente Parte 4: Evitando Obstáculos Usando Sensor Ultrasónico | SunFounder Robojax

En esta lección, mejoramos tu auto inteligente con la capacidad de ver y reaccionar a su entorno utilizando un sensor ultrasónico. Al medir la distancia a los objetos frente a él, el auto puede tomar decisiones inteligentes: avanzará cuando el camino esté despejado, se detendrá cuando un objeto esté dentro de una zona de precaución y retrocederá cuando un obstáculo esté demasiado cerca. Este proyecto se basa en los fundamentos de control de motores y sensores que ya has aprendido, dando como resultado un vehículo verdaderamente autónomo.

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009

Esto no es solo un juguete; es un paso fundamental hacia la construcción de proyectos robóticos más complejos. La lógica que implementarás aquí—detectar, pensar, actuar—es la misma que se usa en todo, desde aspiradoras robóticas hasta automatización industrial. Aquí tienes algunas ideas para inspirar tus propias creaciones:

  • Rover autónomo: Crea un robot que pueda explorar una habitación o pasillo sin chocar con paredes o muebles.
  • Sistema de alarma de proximidad: Monta el sensor ultrasónico en un servo para escanear un área y activar una alarma o luz cuando un intruso entre en una zona definida.
  • Asistente de estacionamiento inteligente: Construye un sistema que use lecturas de distancia para guiar un vehículo hacia un espacio reducido, proporcionando retroalimentación visual o audible.

Esta guía se basa en el kit Arduino 3 en 1 de SunFounder y su proyecto "Play with Ultrasonic Module". Revisaremos el cableado, explicaremos el código de toma de decisiones y demostraremos el auto en acción.

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146

Cómo funciona la lógica de evitación de obstáculos

El núcleo de este proyecto es un árbol de decisiones simple pero poderoso. El sensor ultrasónico mide constantemente la distancia al objeto directamente frente a él. Este valor de distancia se usa luego para controlar los motores del auto, como se muestra en el diagrama a continuación.

  • Si la distancia > 25 cm: El camino está despejado, por lo que el auto avanza.
  • Si 10 cm < distancia <= 25 cm: Se detecta un objeto en una "zona de precaución", por lo que el auto se detiene para evitar una colisión.
  • Si 2 cm < distancia <= 10 cm: Un objeto está peligrosamente cerca. El auto retrocede para crear más espacio.
  • Si la distancia <= 2 cm: La lectura probablemente sea un error (demasiado cerca para medir con precisión), por lo que el auto se detiene como medida de seguridad.

Componentes de hardware

Para construir este proyecto, necesitarás los siguientes componentes, todos incluidos en el kit 3 en 1 de SunFounder.

  • 1x Arduino Uno (o placa compatible)
  • 1x Chasis de auto inteligente con dos motores con engranajes
  • 1x Módulo controlador de motor L298N
  • 1x Sensor ultrasónico de distancia HC-SR04
  • 1x Protoboard
  • Cables de conexión
  • Fuente de alimentación para el auto (por ejemplo, paquete de baterías)
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000

Guía de cableado

El cableado conecta el controlador de motor, el sensor ultrasónico y el Arduino. El controlador de motor controla las ruedas del auto, mientras que el sensor ultrasónico actúa como sus "ojos".

Aquí está el diagrama de conexión de la documentación de SunFounder:

Desglosemos las conexiones. Primero, alimenta los rieles positivo y negativo de la protoboard desde los pines 5V y GND del Arduino. Luego, el sensor ultrasónico se conecta de la siguiente manera:

  • VCC (Alimentación): Conectado al riel positivo de la protoboard.
  • GND (Tierra): Conectado al riel negativo de la protoboard.
  • Trig (Disparo): Conectado al pin digital 3 del Arduino. Este pin envía el pulso ultrasónico.
  • Echo (Recepción): Conectado al pin digital 4 del Arduino. Este pin recibe el pulso reflejado.

Las conexiones del controlador de motor son las mismas que en lecciones anteriores. Los cuatro pines de control (IN1, IN2, IN3, IN4) están conectados a los pines digitales 5, 6, 9 y 10 del Arduino. Estos pines controlan la velocidad y dirección de los dos motores. Asegúrate de que la alimentación y tierra del controlador de motor estén correctamente conectadas al paquete de baterías y a la tierra del Arduino. (en el video en 02:24)

Explicación del código

El código de este proyecto controla el comportamiento del auto según la lectura de distancia del sensor ultrasónico. La lógica es sencilla y fácil de personalizar. Veamos las partes clave y configurables por el usuario.

1. Definiciones de pines

En la parte superior del boceto, se definen los pines para los motores y el sensor ultrasónico. Puedes cambiarlos si has cableado tus componentes a diferentes pines del Arduino.

const int A_1B = 5;
  const int A_1A = 6;
  const int B_1B = 9;
  const int B_1A = 10;
  
  const int trigPin = 3;
  const int echoPin = 4;

Aquí, A_1A, A_1B, B_1A y B_1B controlan los motores izquierdo y derecho a través del controlador L298N. trigPin y echoPin son para el sensor ultrasónico.

2. Variables de comportamiento y lógica

El comportamiento principal se controla dentro de la función loop(). Aquí es donde puedes ajustar la "personalidad" del auto.

void loop() {
    float distancia = leerDatosDelSensor();
    if (distancia > 25) {
      moverAdelante(200);
    }
    else if (distancia < 10 && distancia > 2) {
      moverAtras(200);
    } else {
      detenerMovimiento();
    }
  }

Así es como puedes personalizarlo:

  • Umbrales de distancia: Los números 25 y 10 definen las zonas "segura" y "de peligro" en centímetros. Aumenta 25 para que el coche se detenga antes, o disminúyelo para permitir que se acerque más a los obstáculos. El 2 es un margen de seguridad para ignorar lecturas erróneas de objetos demasiado cercanos.
  • Velocidad del motor: El 200 pasado a moverAdelante() y moverAtras() establece la velocidad del coche. Este valor puede variar de 0 a 255. Un valor más bajo, como 150, hará que el coche se mueva más lento y con más precaución.

El resto del código consiste en la función leerDatosDelSensor(), que maneja el tiempo del sensor ultrasónico para calcular la distancia, y las funciones moverAdelante(), moverAtras() y detenerMovimiento(), que controlan el driver del motor para ejecutar la acción deseada.

Abordando un error común

Es posible que encuentres un error como 'moverAdelante' no fue declarado en este ámbito. Esto ocurre porque el IDE de Arduino lee el código de arriba hacia abajo. Cuando llega a la función loop(), aún no conoce las funciones definidas más abajo. Para solucionarlo, debes agregar "prototipos de funciones" antes de la función setup(). Estos son simplemente declaraciones del nombre de la función y su tipo de retorno, terminando con un punto y coma.

void moverAdelante(int velocidad);
  void moverAtras(int velocidad);
  void detenerMovimiento();
  float leerDatosDelSensor();

Agregar estas líneas le dice al compilador: "Estas funciones existen y se definirán más tarde", lo que resuelve el error. (en el video en 09:21)

Mejorando la estabilidad del sensor

Durante las pruebas, puedes notar que el coche se detiene o tartamudea incluso cuando el camino está despejado. Esto suele ocurrir porque el bucle se ejecuta demasiado rápido y el sensor ultrasónico no tiene suficiente tiempo para recibir la señal de eco, lo que resulta en una lectura de 0 cm. Para solucionarlo, agrega un pequeño retraso al final de la función loop() para darle tiempo al sensor de trabajar.

void loop() {
    float distancia = leerDatosDelSensor();
    if (distancia > 25) {
      moverAdelante(200);
    }
    else if (distancia < 10 && distancia > 2) {
      moverAtras(200);
    } else {
      detenerMovimiento();
    }
    retraso(100); // Agrega un retraso de 100ms para lecturas estables
  }

Un retraso de 100 milisegundos suele ser suficiente para obtener lecturas de distancia estables y consistentes. (en el video en 10:56)

Demostración en vivo del proyecto

Una vez que el código esté cargado, abre el Monitor Serial. Verás texto que indica el estado del coche, como "Adelante", "Atrás" o "Detenido".

En la demostración, el coche se coloca frente a un obstáculo. Cuando el obstáculo está a más de 25 cm, el coche avanza. A medida que acercas tu mano, el coche se detiene cuando la distancia cae por debajo de 25 cm. Si acercas tu mano muy cerca, dentro de 10 cm, el coche retrocederá. Este comportamiento es claramente visible en el video y confirma que la lógica de evitación de obstáculos está funcionando correctamente. (en el video en 11:53)

Conclusión

¡Felicidades! Has construido con éxito un coche inteligente que puede navegar su entorno y evitar obstáculos. Este proyecto combina la entrada del sensor, la lógica de toma de decisiones y el control del motor en un solo sistema funcional. No solo has aprendido a usar un sensor ultrasónico, sino también a implementar un algoritmo de control simple que es la base para robots autónomos mucho más complejos.

Capítulos

  • [00:00] Introducción a la evitación de obstáculos
  • [01:16] Resumen del proyecto y requisitos previos
  • [02:24] Conexión del sensor ultrasónico y el driver del motor
  • [04:56] Abriendo el código del proyecto
  • [05:12] Explicación del código: lógica y funciones
  • [08:34] Cargando el código y prueba inicial
  • [09:21] Solución de problemas: prototipos de funciones
  • [10:56] Solución de problemas: agregar un retraso para estabilidad
  • [11:53] Demostración en vivo de la evitación de obstáculos

Imágenes

27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
899-Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
Idioma: C++
/*
Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor 
Get this code and watch video Download and resource page https://robojax.com/RJT609
YouTube video https://www.youtube.com/watch?v=uLBmRvaemxA

*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int trigPin = 3;
const int echoPin = 4;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}

void loop() {
  float distance = readSensorData();
  if (distance > 25) {
    moveForward(200);
  }
  else if (distance < 10 && distance > 2) {
    moveBackward(200);
  } else {
    stopMove();
  }
}

float readSensorData() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
  return distance;
}


void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

Archivos📁

Bibliotecas de Arduino (zip)