Skip to content

Bitácora Grupal 2

jpherrerap edited this page Dec 23, 2020 · 14 revisions

Estas dos últimas semanas hemos avanzado cada uno en nuestras respectivas tareas propuestas.

  • Armado del brazo
  • Armado y entendimiento del circuito eléctrico entre motores y Arduino UNO
  • Manejo básico de Arduino IDE
  • Programación del Arduino UNO para girar motores mediante potenciómetros

Tareas individuales, las cuales fueron definidas en la reunión del 9/12:

  • Comunicación serial python<->arduino (Juan Pablo)
  • Cinemática arduino (Mattias)
  • Entrenamiento red neuronal (Diego)

Armado del brazo y circuito eléctrico (Trabajo grupal con ayuda de Gonzalo y Monserrat):

Armado brazo: (4/12)

Una vez que a todos nos llego el envió de Duckietown con las partes del brazo, nos coordinamos para armar el brazo siguiendo la guía de Gonzalo, dejamos como idea hacer un manual de armado para agregarlo al github del brazo

Armado circuito :(7-11/12)

Cuando ya teníamos más o menos armado el brazo comenzamos con el armado del circuito, en un principio solo con un motor y un potenciómetro, controlando así el motor a través del arduino por medio del potenciómetro. Una vez que se logro esto, se procede a armar el circuito con los tres motores, utilizando así el código de prueba que nos paso el Gonzalo. Luego de la reunión para hacer esto mi brazo presento problemas que en un principio creía que eran por falta de fuerza en los motores y después de varios días resulto ser que tenía las tuercas muy apretadas, haciendo que el robot se quede estático, una vez que los solté comenzó a funcionar de manera correcta, aunque en el motor 2 presenta un leve fallo quedándose trancado a veces.

Para el circuito de arduino y motores, se hizo sencillo armarlo con los cables y breadboard. Este fue programado en el IDE con ejemplos simples para entender lo básico. Los motores y sus drives, potenciómetros y resto del circuito funcionaron con normalidad.

Luego se efectuó la tarea más compleja de utilizar los potenciómetros para manejar la velocidad de los motores. Para esto, se utilizó la librería Stepper de arduino. Sin embargo, en uno de nuestros motores el código funcionaba torpemente (giraba de un lado a otro cuando no tenía que hacerlo, se trababa) sin razón aparente, mientras que en los demás funcionó bien. Por esto, se decidió hacer código más directo que manipulara cada pin del motor y hacerlo girar por pasos. Este fue adaptado para girar los motores en base a las RPM deseadas.

Cinemática directa y programación (Mattias)

Formulación de las ecuaciones de cinemática directa:(3/12)

Comenzamos con el trabajo mecánico del brazo, partiendo por tener conciencia de que todos los movimientos del brazo, pueden ser descompuestos en ecuaciones de de movimiento circular uniforme, una para cada motor, para posteriormente unirlas y encontrar la ecuación de la cinemática directa en base a los grados de movimiento de los motores. Para esto primero era necesario determinar la relación que existe entre los engranajes. Relación de los motores: Primero el motor de la base, este posee un engranaje unido a su eje de 21 dientes el cual hace girar el engranaje de la base de 40 dientes obteniendo de esta forma la relación. Luego nos fijamos en que ambos motores laterales poseen la misma relación con sus respectivos engranajes, de esta forma la relación 5 a 12, en donde 5 corresponde a los dientes del engranaje unido al eje del motor y 12 la cantidad de dientes que poseen los engranajes que generan el movimiento vertical y horizontal del brazo. Ecuación en cada eje: Una vez obtenida la relación de los motores se procede a generar la ecuación de movimiento en cada eje, teniendo conciencia del sentido de giro de cada motor(ver imagen adjunta), comenzamos con los ejes X y Z, los cuales solo dependen de los motores laterales (motores 2 y 3) y el radio r que en este caso es 8 cm: X(θ2, θ3) = rcos((5/12)θ2) + rsen((5/12)θ3) Z(θ2, θ3) = rsen((5/12)θ2) + rsen((5/12)θ3) Mientras que el eje Y depende del motor de la base (motor 1) y su radio corresponde a la posición en X: Y(θ1, θ2, θ3) = r[cos((5/12)θ2) + sen((5/12)θ3)]sen((21/40)θ1)

Ecuación final: Finalmente se unen las 3 ecuaciones para obtener la posición de la punta del brazo en base a cada angulo de movimiento en los motores P(θ1, θ2, θ3) = [rcos((5/12)θ2) + rsen((5/12)θ3)]x + [r[cos((5/12)θ2) + sen((5/12)θ3)]sen((21/40)θ1)]y + rsen((5/12)θ2) + rsen((5/12)θ3)z

Programación en arduino del brazo:(14-18/12)

Para cumplir con esta tarea primero fue necesario programar los motores para que se movieran en base a los ángulos que sean ingresados en el monitor serial del arduino (La idea es que se ingresen los ángulos reales de movimiento del brazo). Programas para mover cada motor por separado: El programa para mover los motores según un angulo dado, se baso en un tutorial de youtube del "Profe Garcia" [Tutorial] (https://www.youtube.com/watch?v=qcGI9nyx7Ds) A este programa de base fue necesario agregarle la relación de cada motor y cambiar el numero de pasos a 2038 que es lo que corresponde a los motores stepper que utilizamos, de esta forma el programa hace que cada paso del motor equivalga a 1°. Los programas realizados para cada motor se encuentran en la carpeta de github MOV°

Programa para mover el brazo:

Una vez que se logro la comunicación serial para cada motor se procede a unir los códigos en uno para mover todos los motores.

Definición del (0,0,0):(16/12)

Se comienza definiendo una posición inicial para el brazo, ya que, el programa realizado funciona en base a recordar esta posición inicial como el angulo 0 de cada motor.

1° Intento: El primer intento fue solamente copiar y pegar los tres programas en uno, de esta forma solo se movía el motor de la base. Teniendo consciente para el próximo intento que es necesario ingresar 3 ángulos al programa, y guardarlos en variables distintas.

2° Intento: A través de la creación de un array para los ángulos se logro ingresar los 3 ángulos a la vez y guardar cada uno en una variable, pero una vez que se ingresaba estos el programa entraba en bucle repitiendo constantemente estas instrucciones, tal que, al ingresar una nueva instrucción a través del monitor serial, esta se empleaba pero era inmediatamente reemplazada por la inicial.

3° Intento: Lo anterior fue solucionado utilizando un contador, el cual registraba en que angulo iba (1,2 o 3), de esta forma cuando terminaba de mover el tercer motor utilizando el 3 ángulo, el arduino comunica a través del monitor serial con el mensaje "Esperando", de esta forma se puede ingresar una siguiente instrucción, la cual el brazo sigue de forma correcta. Sin embargo este nuevo código posee un inconveniente, originado en el segundo intento, que no había sido detectado hasta este momento, al generar el arreglo, si uno de los ángulos es negativo (lo cual el código para cada motor lo toma como tal), este lo toma como positivo, provocando de esta forma que los motores no puedan girar hacia posiciones negativas.

4° Intento(actual): Actualmente se esta arreglando este ultimo fallo para posteriormente unir este código de movimiento, al código de comunicación serial creado por Juan Pablo.

Python (Juan Pablo)

En cuanto al código de comunicación entre python y arduino, se llegó a un código que pudiera girar adecuadamente los motores on inputs desde python. Después de mucho batallar con el código sugerido por Gonzalo, descargado de jdreyer.com (http://jdreyer.com/projects/Arduino/StepperMotor.php) (tanto tratando de entenderlo como de que funcionara), se encontró que la mejor solución fue aprender a utilizar las funciones Serial.read() y Serial.write() de arduino dadas las funciones utilizadas anteriormente para girar los motores con potenciómetros, con esto se programaron nuevas funciones en python utilizando PySerial, con tal satisfacer lo requerido. Hasta ahora el código recibe el número de pasos a hacer en cada motor, el cual es interpretado y enviado al arduino de manera adecuada para hacer girar (secuencialmente) cada motor con los pasos respectivos.

Red neuronal (Diego)

Para estas 2 semanas se realizo el entrenamiento, para esto nos informamos mediante paginas web de Scikit, y StackOverflow, luego de obtener esta información se procedió a la creación del código, y para esto se hizo una regresión para X e Y, y luego gracias a la bibliotecas de scikit, se entreno la red neuronal. La próxima semana se hará la integracion para lograr que nuestro brazo robotico se mueva.

Para la próxima semana, la idea es juntar lo hecho individualmente por cad uno para tener una interacción fluida entre cinemática inversa -> red neuronal -> Python -> Arduino -> motores del brazo.