
Robot Programable 2° B
- AGR
- Arduino , Programación
- 05 Jan, 2025
Explicación del Proyecto
Este proyecto se centra en el desarrollo de un robot programable utilizando Arduino, cuyo objetivo es permitir a los usuarios establecer una secuencia de movimientos que el robot ejecutará de manera automática. Mediante el uso de una pantalla LCD, botones de entrada y dos motores controlados por un puente H, el sistema ofrece una experiencia interactiva y educativa para comprender conceptos fundamentales de programación, control de motores y automatización.
Descripción del Proyecto
El sistema implementado permite registrar y ejecutar secuencias de movimientos simples, tales como: adelante, atrás, izquierda y derecha. El usuario ingresa los comandos deseados utilizando botones específicos, y el robot ejecuta posteriormente la secuencia programada. La pantalla LCD proporciona retroalimentación visual en tiempo real, mostrando los pasos y el estado actual de ejecución.
Materiales necesarios
# | Componente | Imagen | Link |
---|---|---|---|
1 | Arduino NANO | ![]() | link |
1 | Shield Compatible con Arduino UNO | ![]() | link |
2 | Llanta para Motorreductor TT de 66x27mm | ![]() | link |
1 | L298N Módulo Driver Motor A pasos | ![]() | link |
2 | Motorreductor Amarillo Para Carrito 120:1 | ![]() | link |
1 | Display LCD 16×2 Fondo Azul ó Amarillo con I2C | ![]() | link |
1 | Rueda Loca Nylon con 25mm Para Carrito | ![]() | link |
1 | Porta Pilas AA Para 6 | ![]() | link |
6 | Pilas recargables de alta capacidad “AAA” NiMH | ![]() | link |
Herramientas
- 1 Destornillador
- 1 Pinza
- 1 Tijera
- 1 Cautín
- 1 Soldadura
- 1 Cableado
Desarrollo
Electrónica
La electrónica proporciona el soporte físico necesario para que el robot pueda recibir comandos, procesarlos y ejecutar las acciones solicitadas. Se compone de varios elementos clave:
Componentes Utilizados:
- Arduino Uno/Nano: Controlador principal del sistema.
- Motores DC con puente H (L298N o similar): Permite controlar el sentido y velocidad de los motores.
- Pantalla LCD I2C (16x2): Proporciona retroalimentación visual.
- Botones pulsadores: Se utilizan para programar las secuencias (adelante, atrás, izquierda, derecha y ejecutar).
- Fuente de alimentación o baterías: Provee la energía necesaria para el Arduino y los motores.
- Resistencias y cables: Conexiones eléctricas adecuadas y resistencias de pull-up internas para los botones.
⚡ Funcionamiento del Circuito:
- Los botones envían señales digitales al microcontrolador.
- Arduino interpreta estas señales, las guarda en una secuencia y activa los motores según el orden programado.
- La pantalla LCD muestra los pasos y el estado actual (iniciando, ejecutando, completado).
Diagrama eléctrico
Puedes encontrar el diagrama del proyecto en el siguiente enlace de Tinkercar
Tabla de conexiones
Componente | Pin Arduino | Descripción |
---|---|---|
Motores DC | ||
ENA (Motor A) | 9 | Control de velocidad (PWM) |
IN1 (Motor A) | 8 | Dirección Motor A (Adelante/Atrás) |
IN2 (Motor A) | 7 | Dirección Motor A (Adelante/Atrás) |
ENB (Motor B) | 3 | Control de velocidad (PWM) |
IN3 (Motor B) | 5 | Dirección Motor B (Izquierda/Derecha) |
IN4 (Motor B) | 4 | Dirección Motor B (Izquierda/Derecha) |
Pantalla LCD I2C | ||
SDA | A4 | Comunicación I2C |
SCL | A5 | Comunicación I2C |
Botones | ||
Adelante | 10 | Movimiento hacia adelante |
Atrás | 11 | Movimiento hacia atrás |
Izquierda | 12 | Giro a la izquierda |
Derecha | 13 | Giro a la derecha |
Ejecutar | 2 | Iniciar la ejecución de la secuencia |
Alimentación | ||
VCC LCD | 5V | Alimentación de la pantalla |
GND LCD | GND | Tierra común |
Motores DC | Fuente externa | Requieren más corriente |
Arduino | 5V y GND | Alimentación del microcontrolador |
Programación
La programación es el cerebro lógico del sistema. Define cómo el robot interpreta las entradas del usuario, guarda las instrucciones, controla los motores y presenta información en la pantalla.
Estructura del Código:
-
Configuración Inicial (setup):
- Inicializa los pines, el LCD y establece los motores en estado inactivo.
- Configura los botones con resistencias internas y prepara el sistema para la programación.
-
Lectura de Entradas (loop):
- Detecta las pulsaciones de los botones y almacena las instrucciones en un arreglo.
- Muestra en pantalla el paso y la instrucción seleccionada (Adelante, Atrás, Izquierda, Derecha).
-
Ejecución de la Secuencia:
- Al presionar el botón de ejecución, el robot recorre el arreglo de instrucciones.
- Se activa cada movimiento durante un tiempo definido, deteniéndose después de cada paso.
-
Funciones de Control de Motores:
- moveMotors(): Activa los pines necesarios para mover el robot en la dirección solicitada.
- stopMotors(): Detiene ambos motores tras cada paso.
-
Interfaz de Usuario (LCD):
- updateLCD(): Informa en tiempo real sobre el paso actual y el comando seleccionado.
Código
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Crear el objeto LCD con dirección 0x27 y dimensiones 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
// V motors 0 - 255
int VEL = 255;
// Pines para botones
#define BTN_FORWARD 10
#define BTN_BACKWARD 11
#define BTN_LEFT 12
#define BTN_RIGHT 13
#define BTN_EXECUTE 2
// Variables para la secuencia
int sequence[50]; // Array para almacenar hasta 50 pasos
int stepCount = 0; // Contador de pasos
void setup() {
// Inicializar el LCD
lcd.init();
lcd.backlight();
lcd.print("Robot Programador");
lcd.setCursor(0, 1);
lcd.print("Iniciando...");
delay(2000);
lcd.clear();
// Configurar pines de motores como salida
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Apagar motores al inicio
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
// Configurar pines de botones como entrada
pinMode(BTN_FORWARD, INPUT_PULLUP);
pinMode(BTN_BACKWARD, INPUT_PULLUP);
pinMode(BTN_LEFT, INPUT_PULLUP);
pinMode(BTN_RIGHT, INPUT_PULLUP);
pinMode(BTN_EXECUTE, INPUT_PULLUP);
// Serial para depuración
Serial.begin(9600);
}
void loop() {
// Detectar pulsaciones y guardar la secuencia
if (digitalRead(BTN_FORWARD) == LOW) {
sequence[stepCount++] = 1; // Adelante
updateLCD("Adelante");
delay(200);
} else if (digitalRead(BTN_BACKWARD) == LOW) {
sequence[stepCount++] = 2; // Atrás
updateLCD("Atras");
delay(200);
} else if (digitalRead(BTN_LEFT) == LOW) {
sequence[stepCount++] = 3; // Izquierda
updateLCD("Izquierda");
delay(200);
} else if (digitalRead(BTN_RIGHT) == LOW) {
sequence[stepCount++] = 4; // Derecha
updateLCD("Derecha");
delay(200);
}
// Ejecutar la secuencia programada
if (digitalRead(BTN_EXECUTE) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ejecutando...");
for (int i = 0; i < stepCount; i++) {
lcd.setCursor(0, 0);
lcd.print("Paso:");
lcd.print(i + 1);
lcd.setCursor(0, 1);
switch (sequence[i]) {
case 1:
lcd.print("Adelante ");
break;
case 2:
lcd.print("Atras ");
break;
case 3:
lcd.print("Izquierda ");
break;
case 4:
lcd.print("Derecha ");
break;
}
executeStep(sequence[i]);
}
stepCount = 0; // Reiniciar secuencia
lcd.setCursor(0, 0);
lcd.print("Completado! ");
delay(2000);
lcd.clear();
}
}
// Actualizar el LCD con el comando programado
void updateLCD(String command) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Paso:");
lcd.setCursor(6, 0);
lcd.print(stepCount);
lcd.setCursor(0, 1);
lcd.print(command);
}
// Ejecutar cada paso de la secuencia
void executeStep(int step) {
switch (step) {
case 1: // Adelante
moveMotors(HIGH, LOW, HIGH, LOW, VEL);
delay(1000);
stopMotors();
break;
case 2: // Atrás
moveMotors(LOW, HIGH, LOW, HIGH, VEL);
delay(1000);
stopMotors();
break;
case 3: // Izquierda
moveMotors(LOW, HIGH, HIGH, LOW, VEL);
delay(1000);
stopMotors();
break;
case 4: // Derecha
moveMotors(HIGH, LOW, LOW, HIGH, VEL);
delay(1000);
stopMotors();
break;
}
}
// Función para mover motores con velocidad controlada
void moveMotors(int motorA1, int motorA2, int motorB1, int motorB2, int speed) {
analogWrite(enA, speed);
analogWrite(enB, speed);
digitalWrite(in1, motorA1);
digitalWrite(in2, motorA2);
digitalWrite(in3, motorB1);
digitalWrite(in4, motorB2);
}
// Detener los motores
void stopMotors() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(enA, 0);
analogWrite(enB, 0);
}
codigo con botones analogicos
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Crear el objeto LCD con dirección 0x27 y dimensiones 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
// Velocidad de los motores 0 - 255
int VEL = 255;
// Pin para el módulo de botones analógicos
#define BTN_PIN A0
// Variables para la secuencia
int sequence[50]; // Array para almacenar hasta 50 pasos
int stepCount = 0; // Contador de pasos
void setup() {
// Inicializar el LCD
lcd.init();
lcd.backlight();
lcd.print("Robot Programador");
lcd.setCursor(0, 1);
lcd.print("Iniciando...");
delay(2000);
lcd.clear();
// Configurar pines de motores como salida
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Apagar motores al inicio
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
// No es necesario configurar el pin analógico como entrada
// Serial para depuración
Serial.begin(9600);
}
void loop() {
// Leer el valor analógico del módulo de botones
int analogValue = analogRead(BTN_PIN);
// Verificar rangos y actualizar la secuencia según el botón presionado
if (analogValue >= 25 && analogValue <= 35) { // Forward
sequence[stepCount++] = 1; // Adelante
updateLCD("Adelante");
delay(200);
} else if (analogValue >= 80 && analogValue <= 90) { // Backward
sequence[stepCount++] = 2; // Atrás
updateLCD("Atras");
delay(200);
} else if (analogValue >= 0 && analogValue <= 10) { // Left
sequence[stepCount++] = 3; // Izquierda
updateLCD("Izquierda");
delay(200);
} else if (analogValue >= 160 && analogValue <= 170) { // Right
sequence[stepCount++] = 4; // Derecha
updateLCD("Derecha");
delay(200);
} else if (analogValue >= 350 && analogValue <= 360) { // Execute
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ejecutando...");
for (int i = 0; i < stepCount; i++) {
lcd.setCursor(0, 0);
lcd.print("Paso:");
lcd.print(i + 1);
lcd.setCursor(0, 1);
switch (sequence[i]) {
case 1:
lcd.print("Adelante ");
break;
case 2:
lcd.print("Atras ");
break;
case 3:
lcd.print("Izquierda ");
break;
case 4:
lcd.print("Derecha ");
break;
}
executeStep(sequence[i]);
}
stepCount = 0; // Reiniciar secuencia
lcd.setCursor(0, 0);
lcd.print("Completado! ");
delay(2000);
lcd.clear();
}
}
// Actualizar el LCD con el comando programado
void updateLCD(String command) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Paso:");
lcd.setCursor(6, 0);
lcd.print(stepCount);
lcd.setCursor(0, 1);
lcd.print(command);
}
// Ejecutar cada paso de la secuencia
void executeStep(int step) {
switch (step) {
case 1: // Adelante
moveMotors(HIGH, LOW, HIGH, LOW, VEL);
delay(1000);
stopMotors();
break;
case 2: // Atrás
moveMotors(LOW, HIGH, LOW, HIGH, VEL);
delay(1000);
stopMotors();
break;
case 3: // Izquierda
moveMotors(LOW, HIGH, HIGH, LOW, VEL);
delay(1000);
stopMotors();
break;
case 4: // Derecha
moveMotors(HIGH, LOW, LOW, HIGH, VEL);
delay(1000);
stopMotors();
break;
}
}
// Función para mover motores con velocidad controlada
void moveMotors(int motorA1, int motorA2, int motorB1, int motorB2, int speed) {
analogWrite(enA, speed);
analogWrite(enB, speed);
digitalWrite(in1, motorA1);
digitalWrite(in2, motorA2);
digitalWrite(in3, motorB1);
digitalWrite(in4, motorB2);
}
// Detener los motores
void stopMotors() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(enA, 0);
analogWrite(enB, 0);
}
Desafíos
Recursos
Puedes encontrar diseños para impresion 3d en el siguiente enlace cults 3d
También aquí : thinguiverse
Videos
Arduino DC Motor Control Tutorial
Como usar el driver controlador de motores L298N
Enlaces
Enlace a blog Modulo L298N
Enlaces a blog Instalación de arduino.