Type something to search...
Robot Programable 2° B

Robot Programable 2° B

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

#ComponenteImagenLink
1Arduino NANOlink
1Shield Compatible con Arduino UNOlink
2Llanta para Motorreductor TT de 66x27mmlink
1L298N Módulo Driver Motor A pasoslink
2Motorreductor Amarillo Para Carrito 120:1link
1Display LCD 16×2 Fondo Azul ó Amarillo con I2Clink
1Rueda Loca Nylon con 25mm Para Carritolink
1Porta Pilas AA Para 6link
6Pilas recargables de alta capacidad “AAA” NiMHlink

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:

  1. Los botones envían señales digitales al microcontrolador.
  2. Arduino interpreta estas señales, las guarda en una secuencia y activa los motores según el orden programado.
  3. 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

carrito_programable

Tabla de conexiones

ComponentePin ArduinoDescripción
Motores DC
ENA (Motor A)9Control de velocidad (PWM)
IN1 (Motor A)8Dirección Motor A (Adelante/Atrás)
IN2 (Motor A)7Dirección Motor A (Adelante/Atrás)
ENB (Motor B)3Control de velocidad (PWM)
IN3 (Motor B)5Dirección Motor B (Izquierda/Derecha)
IN4 (Motor B)4Dirección Motor B (Izquierda/Derecha)
Pantalla LCD I2C
SDAA4Comunicación I2C
SCLA5Comunicación I2C
Botones
Adelante10Movimiento hacia adelante
Atrás11Movimiento hacia atrás
Izquierda12Giro a la izquierda
Derecha13Giro a la derecha
Ejecutar2Iniciar la ejecución de la secuencia
Alimentación
VCC LCD5VAlimentación de la pantalla
GND LCDGNDTierra común
Motores DCFuente externaRequieren más corriente
Arduino5V y GNDAlimentació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:

  1. 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.
  2. 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).
  3. 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.
  4. 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.
  5. 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.

Publicaciones relacionadas

ATR 1° - 2° [Primaria]

ATR 1° - 2° [Primaria]

ÍndiceExplicación del Proyecto Materiales necesarios Herramientas [1](#inicialización-de

read more
Brazo Robótico 2° A

Brazo Robótico 2° A

import YouTubeEmbed from '../../layouts/components/YouTubeEmbed.astro'; ÍndiceExplicación del Proyecto Materiales necesarios [H

read more
Carreras de carritos 1° A

Carreras de carritos 1° A

import YouTubeEmbed from '../../layouts/components/YouTubeEmbed.astro'; ÍndiceÍndice Explicación del Proyecto [Materiales necesarios](#materiales-n

read more
Elevador 5° [Primaria]

Elevador 5° [Primaria]

import YouTubeEmbed from '../../layouts/components/YouTubeEmbed.astro'; ÍndiceExplicación del Proyecto Materiales necesarios

read more
Figuras con luz 1° - 2° [Primaria]

Figuras con luz 1° - 2° [Primaria]

import YouTubeEmbed from '../../layouts/components/YouTubeEmbed.astro'; ÍndiceExplicación del Proyecto Materiales necesarios

read more
Control de motor eléctrico para automoviles

Control de motor eléctrico para automoviles

import YouTubeEmbed from '../../layouts/components/YouTubeEmbed.astro'; ÍndiceExplicación del Proyecto Materiales necesarios [H

read more
Programacion en Scratch 1° - 2° [Primaria]

Programacion en Scratch 1° - 2° [Primaria]

import YouTubeEmbed from '../../layouts/components/YouTubeEmbed.astro'; ÍndiceExplicación del Proyecto Materiales necesarios

read more
Semáforo con pluma de crucero 4° [Primaria]

Semáforo con pluma de crucero 4° [Primaria]

import YouTubeEmbed from '../../layouts/components/YouTubeEmbed.astro'; ÍndiceExplicación del Proyecto Materiales necesarios

read more
Visión artificial 3° A

Visión artificial 3° A

import YouTubeEmbed from '../../layouts/components/YouTubeEmbed.astro'; Link de la sesion de meet:Link para la reunion de domingo 16 febrero 2025 actualizada https://meet.google.com/aox-anan-t

read more