Construye tu brazo robótico con Arduino y servomotores

Vamos a explicaros como podéis construir y programar un brazo robótico con Arduino y servomotores, con la ayuda de una impresora 3d y componentes electrónicos

Estructura del brazo con impresora 3D

Lo primero que tenemos que decidir es que tipo de brazo robótico queremos. Hay diferentes modelos, con mas o menos «grados de libertad» (cantidad de articulaciones), con o sin pinza, etc… En nuestro caso vamos a construir uno que constarà de 3 grados de libertad y una pinza. Para ello necesitaremos 4 servomotores, uno para cada articulación (incluida la pinza). Estos motores irán montados sobre una estructura de plástico, que podemos imprimir con la ayuda de una impresora 3d. Hay multiples diseños disponibles para descargar en internet, que constan de varias piezas que hay que imprimir por separado y después ensamblar. Os dejaré algunos enlaces donde podeis verlos.

En nuestro caso el diseño elejido es el EEZYbotARM, del cual podeis encontrar instrucciones y material descargable para imprimirlo en 3d y montarlo en su pàgina web (www.eezyrobots.it)



Motaje de los componentes

Para construir el brazo robótico con Arduino y servomotores, lo primero es montar los servomotores en la estructura que hemos imprimido con la impresora 3d. Cuando hayamos ensamblado todas las piezas con la ayuda de tornillos, vamos a fijar la base del brazo a una madera. Dejaremos un espacio para fijar las protoboards, la placa Arduino y el joystick para después hacer las conexiones entre los servomotores y los diferentes componentes.

Vista del brazo robótico con Arduino y servomotores montado sobre una madera
Vista del brazo robótico con Arduino y servomotores montado sobre una madera

Conexión de Arduino y los componentes

En nuestro caso hemos utilizado dos protoboards, una para conectar los servomotores y el joystick a la placa Arduino, y otra para conectar el potenciómetro también a la placa. Podeis utilizar otra disposición, con mas protoboards o una más grande, nosotros teniamos sólo estas dos. Será el programa que escribamos en el ordenador y cargemos en la memoria del Arduino el que se encargue de comunicar y gestionar estos elementos entre si. A continuación os dejo el esquema de conexiones de todos los elementos.

Ejemplo de conexiones entre Arduino, servomotores, joystick y potenciómetro
Ejemplo de conexiones entre Arduino, servomotores, joystick y potenciómetro

Para construir este esquema hemos utlizado una herramienta muy útil, que permite elaborar cirucitos con componentes comunes e incluso testear las conexiones, Fritzing, que pide una pequeña contribución para descargar el instalador para diferentes plataformas, aunque el cógido fuente esta disponible en Github. También desde este programa podemos ver el esquema eléctrico, en este caso quedaría así:

Esquema eléctrico del circuito para controlar los servomotores del brazo con Arduino
Esquema eléctrico del circuito para controlar los servomotores del brazo con Arduino

Programar el control del brazo robótico con Arduino

Una vez tenemos montados todos los elementos y hechas las conexiones, sólo nos queda escribir el programa que controlarà todos los elementos a través de la placa Arduino. Para esto descargamos desde la página oficial de Arduino su IDE (https://www.arduino.cc/en/software) que nos permitirà escribir, o abrir el archivo que lo contenga, el código en C para cargarlo en la placa y empezar a controlar el brazo a través del potenciómetro y el joystick. En el siguiente video podeis ver como reacciona el brazo al accionamiento del joystick (para la rotacion lateral y el alargamiento o recogimiento del brazo) y del potenciómetro (para la apertura/cierre de la pinza).

Aquí os dejo el código en C listo para subir a Arduino:

/*
 Control de Brazo Robótico de 4 servos, con un joystick y un potenciómetro

2021 - http://robotic-a.com
*/


#include <Servo.h> //Añadimos la libreria para controlar los servos

Servo servoBase;  // Creamos un objeto Servo para controlar la base del brazo
Servo servoLeft;  // Creamos un objeto Servo para controlar el servo izquierdo del brazo 
Servo servoRight;  // Creamos un objeto Servo para controlar el servo derecho del brazo 
Servo servoPinza;  // Creamos un objeto Servo para controlar la pinza del brazo


int potpin = 0;  // Asignamos la entrada analogia 0 de la placa Arduino al potenciómetro

int joypinX = 3;  // Asignamos la entrada analogia 3 de la placa Arduino eje X del joystick

int joypinY = 2;  // Asignamos la entrada analogia 2 de la placa Arduino eje Y del joystick

int joypinK = 4;  // Asignamos la entrada analogia 4 de la placa Arduino al eje K del joystick (pulsador)


int val;    //variable donde guardaremos el valor del eje Y del joystick
int val_read;

int val2;    //variable donde guardaremos el valor del eje X del joystick
int val_read2;

int val3;    //variable donde guardaremos el valor del eje X del joystick
int val_read3;


int val4; //variable donde guardaremos el valor del eje K del joystick (pulsador)
int joystick_pressed; //Guardaremos si el pulsador del joystick se ha pulsado


int val5; //variable donde guardaremos el valor del potenciómetro

void setup() { //Inicializamos la configuración
  
  servoBase.attach(4); //Asignamos el pin digial 4 al Servo que controla la base del brazo
  servoLeft.attach(2);  //Asignamos el pin digial 2 al Servo que controla el movimiento izquierdo del brazo
  servoRight.attach(5);  //Asignamos el pin digial 5 al Servo que controla el movimiento derecho del brazo
  servoPinza.attach(3);  //Asignamos el pin digial 3 al Servo que controla la pinza del brazo

  Serial.begin(9600);   //Establece la velocidad de transmision de bits por segundo para la comunicación en série

  joystick_pressed = 0; //Inicializamos la variable que guarda si el pulsador del joystick se ha pulsado
}

void loop() { //Esta funcion se ejecuta continuamente. Aqui leemos/escribimos los valors en los elementos conectados a la placa Arduino

  //DETERMINAMOS SI EL PULSADOR DEL JOYSTICK ESTÁ PULSADO
  
  val4 = analogRead(joypinK); //Leemos el valor del eje K del joystick( el pulsador, si esta pulsado sera aprox 1000, sino aprox 0)

  if (val4 < 500) { //Si el valor es mas grande de 500 consideramos que se ha pulsado

    //Se ha pulsado, intercanviamos los valores de la variable. Actua como un interruptor. Cada vez que pulsamos el joystick, cambiamos en que servo actua el eje X, servo izquierdo o servo derecho. Estos dos servos mueven longitudinalment o verticalmente el brazo.
    if (joystick_pressed == 1) joystick_pressed = 0; 
    else joystick_pressed = 1;
  }
  
  //MOVIMIENTO CIRCULAR DE LA BASE DEL BRAZO
  
  val = analogRead(joypinY); //Leemos el valor del eje Y del Joystick           

  val = map(val, 0, 1023, 1000, -1000); //Transformamos el valor leido en un valor entre -1000 y 1000
  
  val_read = servoBase.read(); //Leemos el actual valor del Servo de la Base.
  
  val = 0.002*val; //Reducimos el valor para poder mandarlo al servo
  val = val_read + val; //Mientras el joystick este inclinado en el eje Y incrementaremos la posicion en un sentido o en otro en funcion de la inclinacion del joystick

  //Limitamos el valor maximo antes de mandarlo al servo, entre 0 y 180 grados.
  if (val > 180) val = 180; 
  else if (val < 0) val = 0;

  servoBase.write(val);   //Mandamos la nueva posicion calculada al servo
  
 //MOVIMIENTO LONGITUDINAL/VERTICAL DE LA BASE DEL BRAZO 
 
  val2 = analogRead(joypinX); //Leemos el valor del eje X del Joystick  
  
  val2 = map(val2, 0, 1023, 1000, -1000); //Transformamos el valor leido en un valor entre -1000 y 1000
  
  val_read2 = servoRight.read();  //Leemos el actual valor del Servo derecho del brazo.


  
  val2 = 0.002*val2;  //Reducimos el valor para poder mandarlo al servo
  val2 = val_read2 + val2; //Mientras el joystick este inclinado en el eje X incrementaremos la posicion en un sentido o en otro en funcion de la inclinacion del joystick

  //Limitamos el valor maximo antes de mandarlo al servo, entre 0 y 180 grados.
  if (val2 > 180 ) val2 = 180;
  else if (val2 < 0) val2 = 0;


  if (joystick_pressed == 1) servoRight.write(val2);   // Si el pulsador del joystick ha sido activado, mandamos la posicion calculada al servo derecho del brazo
   
  
  //Movimiento longitudinal de la brazo 2
  val3 = analogRead(joypinX);            // reads the value of the potentiometer (value between 0 and 1023)
  
  val3 = map(val3, 0, 1023, -1000, 1000);
  
  val_read3 = servoLeft.read();

  //Serial.println(val_read2); 

  
  val3 = 0.002*val3; //Reducimos el valor para poder mandarlo al servo
  val3 = val_read3 + val3; //Mientras el joystick este inclinado en el eje X incrementaremos la posicion en un sentido o en otro en funcion de la inclinacion del joystick

  //Limitamos el valor maximo antes de mandarlo al servo, entre 0 y 180 grados.
  if (val3 > 180 ) val3 = 180;
  else if (val3 < 0) val3 = 0;


  if (joystick_pressed == 0) servoLeft.write(val3);   // Si el estado del pulsador del joystick ha cambiado, mandamos la posicion calculada al servo izquierdo del brazo
   
  //CONTROL DE LA PINZA
  
  val5 = analogRead(potpin); //Leemos el valor del potenciómetro
  
  val5 = map(val5, 0, 1023, 0, 180); //Transformamos el valor leido en un valor entre 0 y 180 grados
 
  servoPinza.write(val5); //Mandamos el valor calculado al servo que controla la pinza
  
  delay(15); //Esperamos 15 milisegundos para dar tiempo al servo a moverse antes de volver a calcular todos los valores de nuevo. De esta manera la funcion loop() se ejecuta cada 15 ms.  

  
}