Introduction: Cinemática Con Arduino

About: Músico, matemático, computación, ciencia... insolente y subversivo, pero siempre propositivo

La cinemática se refiere a todas esas ecuaciones que sirven para describir el movimiento de un objeto en un plano cartesiano. A la cinemática sobre todo le interesan las trayectorias a lo largo del tiempo, y como se imaginan esto tiene gran importancia en robótica, es decir, para describir y entender el movimiento de robots o brazos robóticos.

La cinemática directa se refiere al cálculo de la posición y orientación final de un manipulador robótico dado un conjunto de valores de las articulaciones. En otras palabras, la cinemática directa responde a la pregunta: "Dadas las coordenadas articulares de un robot, ¿dónde se encuentra su extremo final en el espacio?" Esta relación entre las articulaciones y la posición/orientación final se establece mediante transformaciones geométricas y matrices de transformación homogénea. La cinemática directa es útil para determinar la trayectoria y la posición objetivo de un robot manipulador.

Por otro lado, la cinemática inversa se refiere al cálculo de los valores de las articulaciones necesarios para alcanzar una posición y orientación deseada del extremo final del manipulador robótico. En resumen, la cinemática inversa responde a la pregunta: "Dada una posición y orientación deseada en el espacio, ¿Cuáles deben ser los valores de las articulaciones para llegar a esa posición?" Este cálculo puede ser más complejo que la cinemática directa, ya que puede haber múltiples soluciones o incluso la falta de soluciones para ciertas configuraciones de manipuladores.

Una de las cosas más importantes de la cinemática es poder conocer la posición en un plano cartesiano del objeto. Para eso utilizamos solamente identidades trigonométricas, la ley de cosenos y Pitágoras, que es lo que voy a describir en este proyecto.

El objetivo del proyecto es a través de una brazo articulado, obtener la posición exacta en coordenadas x,y de la punta del brazo a medida que se mueve. Son dos articulaciones (potenciómetros) con dos brazos (paletas de helado) como se ve en la foto y el video. A partir de conocer la posición en cada instante de tiempo, se puedencalcular velocidades y aceleraciones, pero eso lo dejamos para otro proyecto.

Step 1: Materiales

Ocupamos:

  1. Arduino UNO (acá utilizamos un clon, pero cualqueir Arduino funciona)
  2. Cables jumper (m to m, f to m, f to f, dependiendo del arduino)
  3. Potenciómetro de 10k (acá utilizamos unos que vienen con breakoutboard)
  4. Tiras de plástico (con una basta)
  5. Pieza impresa en 3D (aunque se pueden pegar las partes con masking tape)
  6. Paletas de helado (sin el helado)
  7. Papel milimétrico (para ayudar a calibrar)

Step 2: La "Mate" Y El Código

La Mate

La matemática necesaria para este proyecto no es complicada. En la primera foto, en el cuadro A, se ve nuestro problema. Tenemos dos brazos que hacen mover un potenciómetro. Uno está en la base y el otro en el "codo". El movimiento de ambos brazos nos trazan una distancia desde el origen (potenciómetro base), hasta la punta del brazo2. Queremos concer cuales son las coordenadas x,y de ese punto.

Como se observa en el cuadro B de la primera foto, la línea c que se forma, es un triángulo rectángulo que se forma, y las coordenadas no son más que el tamaño de los catetos que se forman.

En la foto 2 cuadro C, se ve la información que tenemos. Por un lado el largo de ambos brazos, y los angulos que nos da la lectura de rotación del potenciómetro. Como se ve en el cuadro querémos calcular (en rojo), primero el largo de c, luego el ángulo "beta", para luego calcular los catetos x y y. En esa foto se muestran las formular que son simplemente la aplicación de la ley de cosenos, pitágoras y las identidades trigonométricas.

El código

El código lo pueden descargar en este link de Github. Lo importante a considerar la programación de las ecuaciones anteriores:

Primero leemos ambos sensores y a partir de allí calculamos los ángulos,

//base pot  
int val1 = analogRead(A0);
int angle1 = map(val1, A1_90, 1022, 90, 0);

//elbow pot
int val2 = analogRead(A1);
int angle2 = map(val2, 0, A2_90, 0, 90);

Noten como la función map tiene un alias que se llama "A1_90" y "A2_90", respectivamente, este es el valor de calibración para la lectura de 90 grados, para convertir a grados. De la calibración hablaremos en el siguiente paso.

Luego calculamos el valor de la distancia c, es decir de la base a la punta del brazo 2, como se indica en la figura,

float c = getSide(ARM1,ARM2,PI-angle2*(PI/180));

Noten como le restamos a PI el ángulo para cambiar la dirección de lectura de rotación, y se convierte el ángulo a radianes. La fórmula getSide esta dada por la siguiente función en el código (fórmula 1 en la foto 2)

//get one side knowing two sides and opposite angle
float getSide(float a, float b, float ang){
return sqrt(sq(a)+sq(b)-2*a*b*cos(ang));
}

Luego se calcula el ángulo beta:

float beta = getAngle(ARM1,ARM2,c);

La fórmula 2 corresponde al siguiente código:

float getAngle(float a, float b, float c){
return acos((sq(a)+sq(c)-sq(b))/(2*a*c));
}

Al final con c y beta calculados, finalmente calculamos las coordenadas

float x = c*cos(beta+(angle1*PI/180));  
float y = c*sin(beta+(angle1*PI/180));

Listos. Como ven es bastante directo.

Step 3: Piezas 3D

Pueden descargar y modificar la pieza en Tinkercad en este link

Step 4: Armar Y Conectar

Con las piezas 3D impresas simplemente ensamblar como se muestra en la foto. Asegurarse que al pegar con masking tape el potenciómetro a la mesa quede alineado con la horizontal (ver siguiente psao).

Conectar los potenciómetros como se muestra en el esquema y en las fotos (acá utilizando un Iteaduino UNO que tiene conectores incorporados)

Step 5: Calibrar

Tenemos que ajustar dos cosas:

  1. Medir el largo de los brazos
  2. Ajustar la lectura del potenciómetro para los ángulos

Largo de los brazos

Simplemente con una regla medir el largo desde el centro del eje del potenciómetro hasta el eje del siguiente potenciómetro, o a la punta de la paleta, como se ve en las fotos. Luego cambiar en el cósigo donde dice "ARM1" y "ARM2" respectivamente:

// length of arm1 and amr2 length
#define ARM1 11.5
#define ARM2 12

//90 degree calibration#define A1_90 660#define A2_90 361

Lectura de ángulos

Primero necesitamos leer los valores de los potenciómetros, para eso quitar los comentarios donde dice "calibration", y comentar donde dice "coordinates to serial".

Colocar el brazo 1 en posición completamente horizontal como se muestra en la foto. Asegurarse que la lectura del potenciómetro es 1023, y ajustar la base con masking tape en ese punto. Luego ver el valor de lectura del potenciómetro en el puerto serial para ver la lecutura cuando se mueve el brazo a 90 grados. Ajustar el valor de "A1_90" a esa lectura en la siguiente porción del código:

//90 degree calibration
#define A1_90 660
#define A2_90 361

Verificar leyendo los valores

Step 6: Funcionando

Listo, pueden abrir el puerto serial del Arduino IDE para ver los valores. En principio les indica las coordenadas con buena exactitud. Pueden verificar la posición en la hoja milimétrica.

Step 7: Retos

El video muestra un proyecto relacionado que les puede ser útil.

Algunos retos:

  1. Hacer algún programa en processing.org para ver los valores
  2. Agregar más brazos y hacer los cálculos ahora con un brazo adicional (la mate se pone más complicada)
  3. Hacer el proceso inverso para mover algunos servomotores (una opción en este instructable)
  4. Que tal si calculamos también la posición del potenciómetro en el codo?
Microcontroller Contest 2017

Participated in the
Microcontroller Contest 2017