¡Saludos, estudiantes!
El tutorial de hoy será bastante corto, dado que estoy de profesor de guardia (para los legos, una guardia de aula es una hora lectiva en la que un par de profesores están disponibles para realizar sustituciones o responder a cualquier imprevisto que suceda durante esa hora). De momento, no hay mucho movimiento en el instituto... ¡A ver lo que dura!.
El objetivo de este artículo es generar la documentación que me pide mi amigo y compañero Juanjo Ruano , que es uno de los pioneros que ha gastado su tiempo en imprimir en 3D mi humilde brazo robótico artesanal, y que ahora quiere poder controlar mediante dos joysticks.
Cuando me pidió información sobre el asunto, mi lado perezoso le hizo ver que ya tenía documentación para controlar el brazo por potenciómetros, como éste:
(la documentación la tenéis aquí), en la carpeta controlServosPotenciómetro, ¡e incluso mediante una app que controlaba a la Arduino por Bluetooth!, (como podéis ver al principio de este otro vídeo que aparecía en el artículo anterior):
(NOTA AL PIE: En este punto en el que me sigues leyendo, amable lector, había escrito ya hasta la tercera parte de lo que es el artículo final; como lo estoy haciendo a través de la wifi del instituto, que tan amablemente nos "capó" la Administración con un cortafuegos Fortinet pegajoso, caprichoso y mal configurado, me ha cortado la conexión inopinadamente con la siempre agradable y emocionante sensación que te invade cuando has perdido el larguísimo texto que estaba escribiendo; gracias por tanto, Fortinet).
Volvemos al punto en el que estábamos. Decía que al final me picó la curiosidad. Mediante Whatsapp, estuvimos discutiendo qué pretendíamos hacer en realidad. Juanjo hablaba de controlar el brazo mediante UN solo joystick. Yo le hice notar que el brazo tiene TRES grados de LIBERTAD (sin contar con la pinza, cuyo control obviaremos en este artículo porque nuestro objetivo es comprender la lógica de este sistema), y que un joystick sólo puede proporcionarnos información en sus dos ejes X e Y. Así pues, la elección era obvia: necesitamos al menos dos joystick.
(2ª NOTA AL PIE: Me ha ocurrido lo mismo. Como ahora guardo más repetidamente, sólo he perdido cinco minutos).
Investigando un poco sobre los modelos de joystick disponibles para Arduino y placas similares, y salvando los modelos más complejos, la gran mayoría precisa como mínimo de CUATRO patillas:
- Vcc (alimentación, 5 V normalmente).
- Gnd (Tierra, polo negativo... ya hemos hablado de esto suficientes veces).
- Eje X: en esta patilla, el potenciómetro asociado al eje X devolverá un valor analógico entre 0 V y la alimentación (5 V, necesariamente) que el convertidor A/D de nuestra Arduino convertirá a un valor entre 0 y 1023. Este valor luego deberá transformarse a otro rango entre 0 y 180 º para la posición del servomotor mediante la instrucción map (valor, 0,1023,0,180).
- Eje Y: lo mismo que el eje X.
- (OPCIONAL)Botón digital: en muchos modelos de joystick se incorpora un pulsador en pull-up que devuelve 5 V cuando se pulsa la palanca hacia abajo. Nosotros no incluiremos esta posibilidad, de momento, por razones de simplicidad.
Por otro lado, nuestro brazo robot dispone de tres servos: uno para el giro en la base, otro para el brazo principal y otro para el brazo auxiliar. Dichos servos se conectarán a las patillas 9, 10 y 11 de nuestra Arduino UNO.
Cada servo será gobernado por un eje de un joystick. Así, el primer joystick gobernará los servos 9 y 10 (base y brazo principal), y el eje X del segundo joystick gobernará el brazo auxiliar 11(dejamos el eje Y para posteriores ampliaciones, aunque en nuestro esquema ya está conectado).
Veamos el esquema de conexionado:
Las tres entradas de los joystick se conectarán, respectivamente, a las entradas A0, A1 y A2 de la Arduino. Como anécdota, me gustaría recordaros que estas patillas suelen acabar averiándose con el uso. He incorporado en el código una salida por el puerto Serial para que podáis ver si leen correctamente los resultados de las palancas. Si no fuera así en algún caso, cambiar la patilla en el conexionado y en el código.
Y a continuación, el código a verter en nuestra querida Arduino. No es excesivamente complicado, dado que ya hemos visto en otros artículos como puede leerse una entrada analógica y como puede transformarse mediante la instrucción map. A grandes rasgos, el algoritmo consiste en :
- Conectar y declarar los tres servos motor1, motor2, motor3
- Declarar las variables que recogerán el valor de los potenciómetros valor1, valor2, valor3, y que se leerán con el comando analogRead(Ax)
- Declarar las variables que decidirán el ángulo correspondiente en los servomotores posicion1, posicion2, posicion3 que transformarán los valores anteriores mediante el comando posicionx=map(valorx,0,1023,0,180)
- Escribir dichos valores en los servos, y vuelta a empezar.
¡Ya verás! ¡Es muy fácil!. A continuación, el código:
#include<Servo.h>
//Declaramos los servos
Servo motor1,motor2,motor3;
//Declaramos los valores leidos por los potenciometros
int valor1, valor2, valor3;
//Declaramos las posiciones que escribiremos en cada servo (0-180)
int posicion1,posicion2,posicion3;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(8,INPUT);
motor1.attach(9);
motor2.attach(10);
motor3.attach(11);
motor1.write(90);
motor2.write(90);
motor3.write(90);
}
void loop() {
//Leemos los valores en los dos joysticks:
valor1=analogRead(A1);
valor2=analogRead(A2);
valor3=analogRead(A3);
//Pasamos dichos valores por el puerto serie a efectos de monitorizacion
Serial.print(valor1);
Serial.print("\t");
Serial.print(valor2);
Serial.print("\t");
Serial.println(valor3);
posicion1=map(valor1,0,1023,0,180);
posicion2=map(valor2,0,1023,0,180);
posicion3=map(valor3,0,1023,0,180);
motor1.write(posicion1);
motor2.write(posicion2);
motor3.write(posicion3);
delay(100);
}
Como puedes ver, es sencillo. ¡Ahora es tu turno!. ¡Prueba tú!. Para cualquier duda o consulta, puedes buscarme en mi Twitter o utilizar nuestro sistema de comentarios. ¡Y eso es todo por hoy!. ¡Sed felices!. ¡Siempre creciendo!. ¡Siempre aprendiendo!. ¡Cultura Maker!.