Lección 28/31: Coche-6 Coche Arduino autoconducido de SunFounder usando | Robojax
En este proyecto, construiremos un coche autónomo básico utilizando un Arduino, un sensor ultrasónico y dos sensores infrarrojos. Este es un proyecto introductorio fantástico para aprender sobre navegación autónoma, fusión de sensores y lógica de toma de decisiones. El coche puede moverse hacia adelante, hacia atrás y girar para evitar obstáculos, encontrando efectivamente un camino despejado por sí mismo. Este proyecto se basa en el kit Arduino 3 en 1 de SunFounder y es parte del curso de Arduino de Robojax.
Este proyecto no se trata solo de construir un juguete; es una introducción práctica a los conceptos centrales detrás de la robótica autónoma. La misma lógica y sensores se utilizan en aplicaciones del mundo real como aspiradoras robóticas, vehículos guiados automatizados en almacenes e incluso los sistemas de navegación de robots más complejos. Al comprender cómo combinar la detección de distancia con reglas simples de navegación, puedes crear una variedad de proyectos, como:
- Construir un pequeño robot que pueda navegar por una habitación y evitar muebles.
- Crear un vehículo automatizado que pueda seguir un camino simple o patrullar un área.
- Aprender a implementar algoritmos básicos de evitación de obstáculos para proyectos de robótica más grandes.
Componentes de Hardware
Este proyecto utiliza los componentes del kit 3 en 1 de SunFounder. Las partes esenciales son:
- Placa Arduino Uno
- Chasis de coche SunFounder 2WD o 3 en 1 con motores
- Módulo controlador de motor (por ejemplo, L298N o similar)
- Sensor de distancia ultrasónico HC-SR04
- Dos sensores de obstáculos IR
- Cables de puente y una fuente de alimentación para los motores
Guía de Cableado
El cableado es el primer paso crítico para dar vida a tu coche autónomo. Las conexiones son sencillas, pero es esencial verificar cada una para evitar dañar tus componentes. La lógica detrás del cableado es conectar los pines de control del Arduino al controlador del motor y a los sensores, permitiendo que el Arduino lea datos y envíe comandos.
- Pines del Controlador de Motor (A-1B, A-1A, B-1B, B-1A): Estos pines controlan la velocidad y dirección de los dos motores. Están conectados a los pines 5, 6, 9 y 10 del Arduino, que son capaces de PWM, lo que permite un control de velocidad variable.
- Sensor Ultrasónico (Trig y Echo): El pin Trig envía un pulso ultrasónico, y el pin Echo recibe la señal reflejada. El pin Trig está conectado al pin 3 del Arduino, y el pin Echo está conectado al pin 4 del Arduino.
- Sensores IR (Izquierdo y Derecho): Estos sensores detectan si hay un obstáculo directamente frente a ellos. El sensor IR izquierdo está conectado al pin 8 del Arduino, y el sensor IR derecho está conectado al pin 7. Se utilizan para verificar el espacio en los lados del coche.
Para una guía visual detallada, consulta el diagrama de cableado a continuación, que mapea cada conexión claramente.
Explicación del Código
El código está escrito en el lenguaje de programación de Arduino (C++). El programa completo está disponible para descargar desde la página de recursos vinculada en la descripción del video. Desglosemos las partes clave y configurables por el usuario de este sketch.
Definiciones de Pines
Al inicio del código, defines los pines que conectan el Arduino a los diversos componentes. Puedes cambiarlos si estás utilizando pines diferentes en tu placa.
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int echoPin = 4;
const int trigPin = 3;
const int rightIR = 7;
const int leftIR = 8;
Los pines A_1B, A_1A, B_1B y B_1A controlan el controlador de motor de puente H. Al establecer estos pines en ALTO o BAJO en diferentes combinaciones, puedes controlar la dirección de cada motor. Los pines echoPin y trigPin son para el sensor ultrasónico, y rightIR y leftIR son para los sensores infrarrojos.
Variables de Comportamiento y Lógica
La lógica central del comportamiento autónomo está en la función loop(). El coche toma decisiones basadas en las lecturas de los sensores IR y el sensor ultrasónico. El código define distancias específicas que activan diferentes acciones. Por ejemplo, la variable distance se mide en centímetros. La lógica es la siguiente:
- Si la distancia es mayor que 50 cm: El camino adelante está despejado, por lo que el coche avanza a una velocidad de 200.
- Si la distancia está entre 2 cm y 10 cm: El coche está demasiado cerca de un obstáculo. Retrocede durante un segundo, luego gira hacia atrás a la izquierda durante medio segundo para encontrar un nuevo camino.
- Si la distancia está entre 10 cm y 50 cm: El coche está en una "zona de precaución". Avanza, pero a una velocidad más lenta de 150.
Estos valores de umbral (50 cm, 10 cm y 2 cm) y las velocidades (200 y 150) son las variables principales que puedes ajustar para cambiar el comportamiento de tu coche. Por ejemplo, podrías aumentar la distancia "segura" a 60 cm si tu coche se mueve rápido.
Funciones Personalizadas
El código incluye varias funciones personalizadas para controlar los movimientos del coche. Estas se utilizan a lo largo del bucle principal para hacer que el código sea más limpio y fácil de entender.
moveForward(int speed): Esta función configura los pines del motor para conducir el automóvil hacia adelante. El parámetrospeed(0-255) controla la rapidez con la que giran los motores.moveBackward(int speed): Similar amoveForward, pero invierte la dirección del motor para mover el automóvil hacia atrás.backLeft(int speed)ybackRight(int speed): Estas funciones giran el automóvil haciendo funcionar un motor en reversa mientras el otro está detenido. Esto es un giro de pivote que ayuda al automóvil a cambiar de dirección de manera efectiva.stopMove(): Esta función detiene todos los motores configurando todos los pines de control en LOW.readSensorData(): Esta función envía un pulso desde el sensor ultrasónico y mide el tiempo que tarda el eco en regresar. Luego calcula la distancia en centímetros y devuelve el valor.
Demostración en Vivo del Proyecto
(en el video en 07:09) En la demostración, el automóvil se coloca en un entorno con varios obstáculos como cajas y paredes. La lógica del automóvil es visible mientras navega. Cuando el sensor ultrasónico detecta una pared u obstáculo a más de 50 cm de distancia, avanza con confianza. A medida que se acerca, los sensores infrarrojos laterales verifican si hay espacio abierto.
Si se detecta un obstáculo a la izquierda, el automóvil realiza un giro hacia atrás a la derecha para evitarlo y viceversa. Cuando el automóvil se encuentra en un espacio reducido, como debajo de una mesa (en el video en 07:49), utiliza sus funciones de reversa y giro para liberarse y encontrar un camino despejado. El automóvil lee continuamente su entorno y toma decisiones, demostrando un sistema de control reactivo que no depende de una ruta preplanificada.
Capítulos del Video
- [00:00] Introducción al Proyecto del Automóvil Autónomo
- [00:28] Acerca del Kit 3 en 1 de SunFounder
- [01:32] Apertura del Código y Resumen General
- [02:02] Explicación de la Estructura del Código y Nuevas Funciones
- [03:11] Configuración de Pines en la Función de Configuración
- [03:28] La Lógica Principal de Toma de Decisiones en el Bucle
- [05:41] Demostración en Vivo: El Automóvil en Acción
- [07:09] Demostración con Obstáculos y Seguimiento de Paredes
- [09:58] Conclusión y Reflexiones Finales
/*
Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Get this code and watch video Download and resource page https://robojax.com/RJT611
https://www.youtube.com/watch?v=IyninXUcsn0
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int echoPin = 4;
const int trigPin = 3;
const int rightIR = 7;
const int leftIR = 8;
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 backLeft(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
void backRight(int speed) {
analogWrite(A_1B, 0);
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);
}
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);
//IR obstacle
pinMode(leftIR, INPUT);
pinMode(rightIR, INPUT);
}
void loop() {
int left = digitalRead(leftIR); // 0: Obstructed 1: Empty
int right = digitalRead(rightIR);
if (!left && right) {
backLeft(150);
} else if (left && !right) {
backRight(150);
} else if (!left && !right) {
moveBackward(150);
} else {
float distance = readSensorData();
Serial.println(distance);
if (distance > 50) { // Safe
moveForward(200);
} else if (distance < 10 && distance > 2) { // Attention
moveBackward(200);
delay(1000);
backLeft(150);
delay(500);
} else {
moveForward(150);
}
}
}
Common Course Links
Common Course Files
Cosas que podrías necesitar
-
AmazonasSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazonas
-
Amazonas
-
Amazonas
-
Amazonas
Recursos y referencias
-
Documentación
-
Externo
Archivos📁
Bibliotecas de Arduino (zip)
-
Código fuente del kit de aprendizaje para autos inteligentes 3 en 1 de SunFounder
3in1-kit-main-v2.zip12.80 MB