Armduino: Brazo Robótico

Concepto

            Tras barajar varias ideas iniciales, se optó por la realización de un proyecto orientado a controlar un brazo robótico. El brazo estaría controlado a través de un segundo brazo el cuál sería movido por el usuario. En consecuencia, el primer brazo, es decir, el brazo ejecutor, imitaría las acciones del primero. De esta manera, nuestra intención era realizar un prototipo el cuál se pudiese en un futuro expandir y escalar sin tener que alterar en profundidad el proyecto.

                Inicialmente, se pretendió utilizar un brazo robótico que ya poseía uno de los miembros del equipo. Dicho brazo, el cual se muestra en la imagen a continuación, constaba de un total de 5 motores para accionar todas las articulaciones y la pinza.

Todos los motores eran simples, es decir, tan solo constaban de dos cables: uno de entrada de potencia y otro de salida.

                Esto supuso un problema rápidamente. Para poder controlar el brazo robótico correctamente nos era necesario poder girar los motores en ambas direcciones. Sin embargo, para poder realizar esta simple acción con motores de este tipo, la única solución posible es cambiar el sentido de la corriente. Tras una pequeña investigación, hallamos una forma de poder llevar a cabo esta operación a través de un concepto conocido como “Puente en H”.

                Gracias a este sistema nos es posible invertir el sentido de la corriente y, a su vez, el del motor. Activando los interruptores por pares (S1 con S4 y S3 con S2), la corriente es capaz de fluir en ambos sentidos. Los interruptores en nuestro caso fueron sustituidos por transistores ya implementados en un chip para poder ser accionados mediante señales.

                Fuimos capaces de mover un motor con esta implementación, sin embargo, surgieron una multitud de problemas nuevos que nos llevaron a desechar esta idea por completo debido a su impracticabilidad en nuestras condiciones. Estos problemas abarcaban desde la falta de potencia para accionar varios motores simultáneamente hasta la falta de entradas y salidas en la placa proporcionada para poder controlar todos los transistores. Además, debido a que el brazo ya tenía algún tiempo, uno de los motores se encontraba inoperativo, lo que nos llevó irrevocablemente a buscar una nueva solución.

                Tras deliberar entra varias opciones, nos decantamos por ser nosotros mismos los que construiríamos el brazo, ya que además teníamos que construir el brazo que iba a ser accionado manualmente. De esta manera, seríamos capaces de utilizar los motores que mejor se adaptasen a nuestras necesidades.

Diseño – Imitación

            El tipo de motor que mejor se adaptaba a nuestro proyecto era el conocido como servo motor.

                Este tipo de motor, a diferencia de uno más simple, cuenta con un tercer cable conocido como señal. Gracias a esta señal nos es posible especificar al motor una posición en grados a la que deseamos que se desplace. Esta posición toma valores entre 0 y 180, haciéndolo así mucho más preciso que los motores anteriores.

                Para no forzar los motores, el material elegido para el cuerpo del brazo fue madera ligera. Así, se llegó a la conclusión de que la mejor disposición era tener un movimiento rotatorio en la base, dos articulaciones y una pinza, teniendo en total cuatro motores.

Las señales fueron conectadas a los puertos 6, 7, 8 y 9 siguiendo el siguiente esquema.

                Posteriormente, se construyó el segundo brazo. Esta vez, tanto en las articulaciones como en la base se dispusieron potenciómetros que, al mover el brazo, variarían su valor.

De esta manera, se pretendía mapear posteriormente estos valores para accionar los motores de manera automática logrando así que el primer brazo imitase a este otro. Para accionar la pinza se optó por la utilización de un botón, ya que solo constaría de dos posiciones discretas: abierta y cerrada. El esquema es el siguiente.

                Los tres potenciómetros se conectaron a las entradas analógicas A0, A1 y A2. El botón de la pinza al pin 10, que actuaría como entrada digital.

                Una vez estuvo todo conectado, se procedió a implementar el código. Haciendo uso de la librería “Servo.h” pudimos controlar los motores.

                Primeramente, se declararon los cuatro motores junto a un array donde guardar los grados obtenidos del mapeo para poder realizar la imitación.

                También se declararon las entradas para la pinza y los potenciómetros, junto a un array para, al igual que en el caso anterior, poder realizar el mapeo.

                Una vez se hubieron declarado todos los elementos necesarios, en la función setup(), se hace uso de la función attach() de la librería “Servo”. De esta manera, asignamos a cada motor una salida digital para poder controlarlos.

                Después, en la función loop() realizamos el mapeo. Para ello, leemos el valor analógico de cada potenciómetro a través de la función analogRead() y lo guardamos en el array declarado con anterioridad. Después, usando la función map(), transformamos ese valor a un grado entre 0 y 180 y lo almacenamos en el otro array, el correspondiente a los motores.

                Por último, haciendo uso de la función write() de la librería “Servo”, movemos cada motor a su valor mapeado, logrando así que el brazo de los motores imite al brazo de los potenciómetros.

Además, haciendo uso de una condición simple controlamos la apertura de la pinza de manera similar.

Diseño – Memoria de movimientos

            Posteriormente, con la intención como ya se especificó con anterioridad de poder escalar y aumentar este proyecto a ámbito más profesionales, se decidió implementar una memoria de movimientos para poder automatizar aún más el funcionamiento del brazo. El diseño al que se llegó constaba de una estructura de datos en la cual se irían guardando posiciones momentáneas del brazo. Posteriormente, se reproducirían en orden a través de una interpolación para simular el movimiento guardado. Para ello, se utilizaron dos botones, uno para grabar movimientos y otro para reproducirlos. Estos fueron conectados a las entradas analógicas A4 y A5, aunque actuarían como digitales en práctica.

                En el código, se declararon las entradas de los botones junto con la estructura de datos. Se decidió grabar un máximo de 20 movimientos, aunque este número podría ser aumentado sin suponer ningún problema de memoria a corto plazo. También se utilizaron dos variables de control para evitar errores. Un booleano para evitar grabar más de un movimiento por pulsación y un contador para controlar el número total de movimientos.

                Primeramente, para poder grabar se implementó una función que haciendo uso del array utilizado anteriormente, donde se encuentran las posiciones actuales de los motores, y de la función read() para conocer la posición de la pinza, almacenaba los datos en la posición correspondiente de la estructura de datos de la memoria de movimientos.

                A su vez, en la función loop(), se implementaron unas condiciones de control para llamar a la función cuando se pulsase el botón correspondiente.

                Posteriormente, para lograr la funcionalidad correspondiente a la reproducción de los movimientos se implementó una función que utilizando como parámetros los valores de los grados a los cuales los motores tienen que desplazarse y un determinado tiempo, realizase la interpolación y accionase los motores para completar el movimiento en el tiempo especificado. Se decidió realizar la interpolación en 10 pasos (number_steps). Sin embargo, este número puede cambiarse, aunque puede llegar a provocar movimientos muy bruscos si se reduce o aumenta demasiado.

                Primero, se calcula el tiempo que debe pasar entre cada paso (delay_time) para completar el movimiento en el tiempo dado. Después, utilizando la diferencia entre el ángulo final y actual de cada motor, se calcula lo que debe moverse cada uno en cada paso (step_motor).

                Después, se desplazan los motores actualizando el valor en cada paso y esperando el tiempo necesario después de cada iteración de la interpolación. El valor de la pinza se escribe directamente, sin interpolación. Se realiza de esta manera para evitar problemas al coger objetos.

                Finalmente, debido a que esta interpolación es una aproximación ya que nos vemos obligados a trabajar con números enteros para calcular los grados, es necesario realizar una corrección final para completar el movimiento con exactitud.

                Para terminar, en la función loop(), se implementan condiciones para controlar la activación de la reproducción de los movimientos al pulsar el botón correspondiente. Para ello, se recorre la estructura de datos creada con anterioridad y se realizan llamadas a la función de interpolación.

Diseño – Control de la velocidad de reproducción

                Para lograr un mayor control de la reproducción de movimientos, se optó por incluir un control sobre la velocidad de la misma. Para ello, utilizando un potenciómetro de manera similar a los del brazo, se realizó un mapeo simple. Este potenciómetro se conectó a la entrada A3.

                En el código se declaró de manera similar a los otros potenciómetros.

                Y en la función loop(), en el control de la reproducción, se realizó un mapeo del mismo para reproducir movimientos desde 100 milisegundos hasta 1000 milisegundos.

                Sustituyendo el valor mapeado en la función de interpolación.

Diseño – Pantalla LCD

                Como última funcionalidad, se decidió implementar una pantalla LCD utilizando las últimas entradas libres en la placa (2, 3, 4, 5, 11 y 12). Al igual que con la memoria de movimientos, la intención de esta pantalla es la de proporcionar al usuario retroalimentación acerca de las acciones que tome como, por ejemplo, el total de movimientos grabados hasta el momento. El esquema de conexión es el siguiente.

                Se implementó en el código utilizando la librería “LiquidCrystal.h”, que aporta funciones para limpiar la pantalla, escribir o situar el cursor.

                Algunos ejemplos de los mensajes utilizados.

Presupuesto y construcción

                El presupuesto final utilizado para la construcción del proyecto fue el siguiente:

Servo motores 13,99 €
Potenciómetros 8,99 €
Madera 6,5 €
Pintura en spray 7,6 €
Pomo y pestillo 3 €
Total 40,08 €

                Para poder transportar el proyecto más fácilmente, se decidió elaborar una caja para contener todos los cables y baterías de manera ordenada para poder ser utilizado sin la necesidad de conexión a un ordenador. Además, también se realizó de esta manera para proporcionar una interfaz más sólida y fácil de utilizar. A continuación, se muestran varias imágenes del proceso de construcción.

                La siguiente imagen muestra una vista cenital del proyecto una vez fue terminado. En ella se pueden apreciar ambos brazos y la interfaz de usuario.

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *