Proyecto I&P2024-1: (Perro Robot 3D) / Grupo 1
Título | Proyecto I&P2024-1: (Perro Robot 3D) / Grupo 1 |
---|---|
Tipo de Proyecto | Proyecto de Curso |
Palabras Clave | proyectoarduino |
Asignatura | Interacción y Performatividad |
Del Curso | Interacción y Performatividad 2024-1 |
Carreras | Diseño |
Alumno(s) | María Jesús Matta, Constanza Pomodoro, Isabella Zanetti, Maria Alejandra Pérez |
Proyecto Final
Nuestro proyecto consiste en construir un perro robot básico capaz de realizar diversas acciones. Utilizaremos piezas impresas en 3D para su ensamblaje y desarrollaremos un código especial que le permitirá ejecutar estas funciones. Además, mediante una aplicación para teléfonos Android, podremos controlar de manera inalámbrica el perro robot mediante conexión Bluetooth. El circuito eléctrico que utilizaremos tiene la capacidad de controlar hasta 9 servomotores para gestionar los movimientos del perro.
Componentes
- Arduino uno
- 9 servomotores
- Protoboard
- Jumper
- Sensor de ultrasonido
- Módulo bluetooth
Avances piezas 3D
Archivos: Se descargaron los archivos en formato STL. Algunos tuvieron que ser modificados debido a fallas en el software Fusion 360. Para la impresión, se utiliza el software Ultimaker Cura con los siguientes parámetros de impresión: resolución normal de 0.15 mm, densidad de relleno (infill density) del 20%, soporte tipo rama de árbol (tree support), patrón de relleno en cuadrícula (infill pattern grid), grosor de la pared (shell thickness) de 0.8 mm y 1.0 mm.
Avances circuito eléctrico
Código
#include <Servo.h> Servo Leg1F; //13 - 80 Servo Leg1B; //12 - 100 Servo Leg2F; //11 - 100 Servo Leg2B; //10 - 80 Servo Leg3F; //2 - 80 Servo Leg3B; //3 - 100 Servo Leg4F; //4 - 100 Servo Leg4B; //5 - 80 Servo Headservo; //D9 - 90 void setup() { Leg1F.attach(13); Leg1B.attach(12); Leg2F.attach(11); Leg2B.attach(10); Leg3F.attach(2); Leg3B.attach(3); Leg4F.attach(4); Leg4B.attach(5); Headservo.attach(10); Leg1F.write(80); Leg1B.write(100); Leg2F.write(100); Leg2B.write(80); Leg3F.write(80); Leg3B.write(100); Leg4F.write(100); Leg4B.write(80); Headservo.attach(90); } void loop() { // put your main code here, to run repeatedly: }
Piezas
Proceso
Resultado final
Se realiza la reposición de 5 servomotores que estaban en estado defectuoso. Se hicieron las pruebas respectivas para corroborar su funcionamiento. Se vuelven a ajustar los cables que habían quedado sueltos. Se toma la decisión de quitar el módulo bluetooth ya que no se pudo concretar bien su funcionamiento. Se realiza un código para que las patas puedan moverse en un loop. Sin embargo, el artefacto no fue capaz de moverse correctamente debido a que las piezas de las patas se desgastaron y algunas se rompieron.
Código actualizado
Este código controla un robot con seis servos para las patas y uno para la cabeza, y utiliza un sensor de distancia para detectar objetos. Inicializa la comunicación serial, configura los pines del sensor y adjunta los servos a sus respectivos pines, colocando todos en la posición media al inicio. En el bucle principal, mide la distancia con el sensor de ultrasonido y mueve la cabeza de un lado a otro. Si la distancia medida es menor a 20 cm, el robot se detiene y realiza un movimiento de giro. En ausencia de objetos, el robot alterna el movimiento de sus patas para simular un caminar. Cada ciclo del bucle incluye un retraso de 100 ms para permitir que se procesen los cambios.
#include <Servo.h> // Definir los servos Servo servos[6]; // Pines de los servos int servoPins[6] = {13, 12, 11, 2, 4, 5}; // Pines del sensor de distancia const int trigPin = 6; const int echoPin = 3; // Inicializar servo para detección de obstáculos Servo headServo; int headPosition = 90; // Posición inicial de la cabeza int headDirection = 1; // Dirección de movimiento de la cabeza (1: derecha, -1: izquierda) void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); headServo.attach(7); // Pin 7 para el servo de la cabeza // Adjuntar servos a los pines for (int i = 0; i < 6; i++) { servos[i].attach(servoPins[i]); } // Poner todos los servos en posición inicial for (int i = 0; i < 6; i++) { servos[i].write(90); } headServo.write(headPosition); // Posición inicial de la cabeza delay(1000); } void loop() { long duration, distance; // Leer distancia del sensor digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; Serial.print("Distancia: "); Serial.print(distance); Serial.println(" cm"); // Mover la cabeza gradualmente headPosition += headDirection; if (headPosition >= 180 || headPosition <= 0) { headDirection = -headDirection; // Cambiar dirección al llegar a los límites } headServo.write(headPosition); // Si la distancia es menor a 20 cm, detenerse y girar if (distance < 20) { for (int i = 0; i < 6; i++) { servos[i].write(90); // Poner todos los servos en posición neutral } delay(1000); // Girar para evitar obstáculo // Pata delantera izquierda hacia adelante servos[0].write(30); // Pata delantera derecha hacia atrás servos[3].write(150); // Pata trasera izquierda hacia adelante servos[2].write(30); // Pata trasera derecha hacia atrás servos[5].write(150); delay(500); // Volver a la posición inicial for (int i = 0; i < 6; i++) { servos[i].write(90); } delay(500); } else { // Movimiento continuo para caminar // Fase 1: Mover pata delantera izquierda y trasera derecha hacia adelante servos[0].write(30); // Pata delantera izquierda (Pin 13) servos[5].write(150); // Pata trasera derecha (Pin 5) delay(500); // Fase 2: Volver a la posición inicial servos[0].write(90); servos[5].write(90); delay(500); // Fase 3: Mover pata delantera derecha y trasera izquierda hacia adelante servos[3].write(150); // Pata delantera derecha (Pin 2) servos[2].write(30); // Pata trasera izquierda (Pin 11) delay(500); // Fase 4: Volver a la posición inicial servos[3].write(90); servos[2].write(90); delay(500); } delay(100); // Espera 100 milisegundos antes de la próxima lectura }
Servos y la posición de su hélice
Lado Izquierdo:
Pata delantera izquierda: Servo 1 (Pin 13): Mirando hacia adelante.
Pata trasera izquierda: Servo 4 (Pin 11): Mirando hacia atrás.
Pata central izquierda: Servo 3 (Pin 12): Mirando hacia adelante.
Lado Derecho:
Pata delantera derecha: Servo 5 (Pin 2): Mirando hacia adelante.
Pata trasera derecha: Servo 8 (Pin 5): Mirando hacia atrás.
Pata central derecha: Servo 7 (Pin 4): Mirando hacia adelante.
Cabeza (Pin 7)
Video
SmileyBot está programado para responder a la presencia de su dueño simulando movimientos de felicidad. Cuando detecta la presencia del dueño, el robot pasa de estar sentado a levantarse y mueve sus patas y cabeza para mostrar alegría. Se ha diseñado para que los movimientos sean más rápidos cuando el dueño se acerca y más lentos cuando se aleja, lo que busca intensificar la interacción y la expresión emocional positiva durante el encuentro.
Reflexión sobre el proyecto: Durante el desarrollo del proyecto, enfrentamos varios desafíos significativos. En primer lugar, algunas de las piezas impresas no coincidieron exactamente con las medidas requeridas, lo que nos obligó a utilizar herramientas como un Dremel para ajustarlas. Este proceso resultó en piezas que quedaron demasiado lijadas y, en algunos casos, demasiado delgadas, lo que ocasionó problemas como patas que se soltaban o se rompían durante el funcionamiento. Además, experimentamos dificultades específicas con la primera pieza impresa del cuerpo, ya que hubo un problema de configuración con la impresora 3D que afectó la calidad de la impresión y nos obligó a reimprimir la pieza.
Otra dificultad significativa fue la gestión de la potencia de los servomotores. Con un total de nueve servos, la demanda energética fue alta y las baterías utilizadas no fueron suficientes para mantener un rendimiento estable. Esto nos llevó a prescindir de dos servos para asegurar la estabilidad del sistema. Además, el peso adicional y la presión ejercida por las piezas impresas complicaron el movimiento fluido de los motores.
A pesar de estos desafíos, esta experiencia nos dejó valiosas lecciones para futuros proyectos. Destacamos la importancia de la precisión en las técnicas de impresión, la organización meticulosa de los cables y la verificación exhaustiva de cada componente antes del montaje final. Aunque el proceso fue complejo, nos proporcionó un aprendizaje significativo y enriquecedor que sin duda aplicaremos en proyectos futuros.