Robot Equilibrista
Objetivos
De forma general el objetivo era diseñar un circuito dentro de un robot que, de forma independiente, sin tener que estar conectado a un ordenador, fuera capaz de, por medio de la rotación de dos motores, estabilizarse ajustando la rotación de los motores para mantener su centro de gravedad y conservar el equilibrio.
Como objetivos más específicos teníamos:
- Leer los datos de posición de nuestro robot: por medio de un giroscopio/acelerómetro teníamos que capturar los datos de en qué posición se encontraba el centro de gravedad de nuestro robot para si poder indicarles a los motores que acción debían realizar.
- Sincronizar la rotación de los motores en función de la posición: una vez leída la posición del robot debíamos hacer rotar los motores de forma sincronizada para que sea posible mantener el equilibrio de este, y procurando mantener esta posición siempre en el 0 que será nuestro punto de equilibrio.
Materiales Utilizados
Los materiales utilizados en la elaboración de este proyecto se dividen en tres secciones, los “materiales extras” que son los que tuvimos que comprar ya que no contábamos con ellos dentro del kit de Arduino que nos proporcionó la URJC, los “materiales de la URJC”, que son los que utilizamos des kit, y los materiales que utilizamos para construir la estructura, que son materiales que teníamos ya en casa por lo que su coste no se tomara en cuenta.
Materiales Extras:
Material | Descripción | Coste |
Modulo MPU5060, este es el modulo de giroscopio/acelerómetro que hemos utilizado para conocer la posición de nuestro robot y actuar en consecuencia de los datos que este nos proporciona. | 3,33 x 3 = 9,99 € | |
Driver A4988, estos fueron los controladores que utilizamos para facilitar en control de los motores por medio de comandos escritos en el código del software. | 1,6 x 5 = 7´99 € | |
Llantas de plástico de 150mm, estas serian las llantas que irían conectadas a nuestros motores, permitiéndole así a nuestro robot desplazarse y mantenerse en equilibrio | 3,79 x 3 = 11,37 € | |
Motor paso a paso NEMA 17, son los motores que utilizamos para mover las ruedas y realizar la tarea del desplazamiento del robot. | 10,00 x 2 = 19,99 € | |
Pilas de petaca de 4,5 v estas son las encargadas de suministrar la energía necesaria a nuestros motores. | 5,00 x 4 = 20,00 € |
Materiales de la URJC:
Material | Descripción |
Batería de 9v que utilizamos para alimentar nuestra placa de Arduino cuando esta estuviera desconectada del ordenador. | |
Placa de Arduino Uno esta fue la palca de Arduino que utilizamos para cargar el código de nuestro sistema. | |
Cables de distintas longitudes que se emplearon para hacer las conexiones físicas del sistema entre los distintos componentes y los puertos de la placa. | |
Protoboard sobre conectamos los distintos componentes y realizamos las correspondientes conexiones entre estos. | |
Condensador de 100uf 50v, estos se conectan a los controladores de los motores para controlas las posibles fluctuaciones de energía y evitar que estos se dañen. |
Materiales de la Estructura:
Materiales | Descripción |
Cinta adhesiva decorativa, para agrupar los cables de forma mas estética, y juntar distintas piezas a la estructura. | |
Cinta Doble Cara, se utilizo para fijar las pilas entre si y a la estructura del robot, así como solo motores a la base. | |
Cinchas de plástico, nos permiten fijar con mayor firmeza los elementos más pesados a la estructura para asegurar que no se muevan. | |
Palitos de madera, funcionan como columnas para mantener una plataforma sobre otra. | |
Tablas, se utilizaron para construir las estructuras, son las distintas plataformas donde se colocan los componentes del sistema. |
Circuito Montado
Este es un modelo del circuito montado, mostrando las conexiones entre los drivers, los motores y el giroscopio/acelerómetro, al igual que los pines que ocupan en la placa de Arduino
El modulo MPU5060 está conectado a los 5v de la placa y al GND, y los puertos SCL y SDA del modulo a los puertos analógicos A5 y A4 respectivamente, esos serán los puertos que se tendrán que leer luego para conseguir los valores de posición y aceleración del giroscopio/acelerómetro.
Los drivers A4988 son los que tienen un mayor número de conexiones, por un lado, se conectan a la placa de Arduino por los puertos digitales 4, 7, 8, 12, y 13, que corresponden a los puertos step, dir y enable, los puertos step y dir son los encargados de indicar la dirección de la rotación y el numero de pasos que debe dar los moteres, y el enable indica si los motores deben detenerse o seguir rotando, fuera de la placa los controladores están conectados a las pilas de petaca que son las que suministran la energía a los motores, que estarán conectados cada uno a su respectivo driver.
Los moteres están conectados a los drivers por cuatro pines, dos de ellos suministran la energía necesaria al motor y los otros dos traducen la información de los puertos dir y step indicándole al motor como debe de rotar.
Problemas y Soluciones
Problema | Solución |
Material defectuoso: Uno de los motores de se compraron para realizar este proyecto nos llevó con un problema, tenía una de las piezas internas rotas y esto causaba un funcionamiento incorrecto del mismo. | Para solucionar este problema hemos tenido que desmontar los motores y comprar una nueva pieza para sustituir la que estaba rota. |
Lectura de los datos del MPU5060: los datos leídos directamente desde el modulo eran bastante complejos y difíciles de tratar. | Como solución a este problema se diseñó una función que por medio de los datos obtenidos y algunos cálculos de trigonometría nos devolvía un valor en grados sobre el eje X e Y que eran mas fáciles de tratar dentro del código. |
Configurar el voltaje de los drivers: Los drivers tienen unas resistencias internas que regulan el voltaje que pasa desde las pilas a los motores y este se tenia que regular de forma manual en el driver. | Esto requirió de varios ajustes a me dida que se hacían cambios en el circuito para conseguir un correcto funcionamiento de los motores. |
Definir la posición 0 del MPU5060: De forma predefinida el módulo trae configurado unos valores base de lo que considera la posición 0 sobre sus ejes, que no correspondía con la de nuestro sistema. | Diseñamos un código un que lee esos valores por defecto y los va modificando de forma cíclica buscando de llevarlos a los valores de equilibrio, que le indican al modulo que esta en su posición 0. |
Pasos Seguidos
En un primer momento se intentó utilizar un repositorio de internet que contaba con un código de un proyecto semejante al nuestro, pero este código presentaba algunos fallos, y tenia una alta complejidad que dificultaba el entenderlo y poder modificarlo, así que optamos por escribir nuestro propio código desde 0, guiándonos con la documentación de los diferentes componentes que utilizamos que pudimos encontrar en internet.
Una vez tomada esta decisión nos dimos cuenta de que trabajar directamente con todos los componentes conectados entre si era mas complicado y no nos permitía reconocer de forma eficiente en donde se producían los fallos, así que optamos por probar los componentes de forma independiente para conocer mejor como funcionaban y estar seguros de que funcionaban correctamente.
Las primeras pruebas se realizaron con los drivers y los motores, probamos la funcionalidad de los motores haciéndolos rotar en sentido horario y antihorario y a diferentes velocidades, para esto utilizamos el siguiente código.
Una vez que comprobamos que los motores funcionaban correctamente y que hacían todas las acciones que se esperaban de ellos pasamos a hacer las pruebas con el módulo MPU5060, estas prueban tomaron algo más de tiempo, ya que el procesamiento de los datos obtenidos fue complicado y la documentación que encontrábamos no dejaba muy claro como hacerlo, pero aun así finalmente conseguimos diseñar un código que era capaz de procesar los datos obtenidos del módulo y traducirlos a unos valores que nos indicaban la inclinación del módulo en grados.
Cuando conseguimos obtener estos datos legibles, en grados, nos dimos cuenta de que posición de equilibrio o el grado 0 no era el correcto, al menos no para nuestro proyecto, asique fue necesario investigar como configurar una posición de equilibrio nueva sobre nuestro modulo MPU y para eso utilizamos el siguiente condigo que nos permite leer los valores de posición del módulo y ajustarlos de manera que este sepa que esa es nueva posición de equilibrio o su grado 0.
Ya para terminar una vez entendido el funcionamiento de cada uno de los componentes procedimos a montar el circuito completo, y diseñar el código que nos permitiera leer los datos del MPU y realizar los movimientos de los moteres necesarios según el valor de los datos leídos, esto código requirió una posterior modificación es algunos de los valores que utilizábamos para indicar la velocidad de giro de los motores y la dirección de este giro en función del peso y el tamaño de la estructura, fueron cambios que se realizaron con un método de prueba y error de forma manual hasta conseguir los valores más óptimos para nuestro proyecto, el código final sería el siguiente.
Ya con el circuito montado y el código probado el último paso fue montar la estructura, asegurándonos de te dejar nada suelto y de hacerlo de las manera más limpia y menos desordenada posible, fijando las piezas para que nada se moviera fuera de su sitio y permitiendo un fácil acceso a los componentes en caso de necesitar hacer modificaciones, reparaciones o mantenimiento.
Casos de Usos
- Patinete autoequilibrio “HoverBoard”: este es un ejemplo real, este tipo de artículo, aunque hay poca gente que lo utiliza, es un buen ejemplo de casos de uso de nuestro proyecto.
- Máquina de equilibrio para transportar artículos pesados en almacenes, para evitar caídas de artículos pesados y altos podemos utilizar este tipo de proyecto. Y así ayudar a los trabajadores que eviten levantar artículos pesados, de este modo reduce las lesiones laborales.
- Puede ser utilizado para explorar entornos desconocidos y medir si el territorio esté plano o inclinado.
- Pueden ser utilizados en entornos médicos para ayudar a pacientes con discapacidades o mayores de edades, así facilitándole el movimiento.