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.
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.
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í:
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.
}
Auto Amazon Links: No se encontraron productos. http_request_failed: No se ha facilitado una URL válida. URL: https://ws-eu.amazon-adsystem.com/widgets/q?SearchIndex=All&multipageStart=0&multipageCount=20&Operation=GetResults&Keywords=brazo+robotico&InstanceId=0&TemplateId=MobileSearchResults&ServiceVersion=20070822&MarketPlace=ES Cache: AAL_932c469ad518122401620097496fd142