Armado de Brazo Robótico – Código de Ejemplo

2017-04-18 18.40.16

Armado

Descarga el PDF con las instrucciones de armado AQUÍ

Recomendaciones para el armado:

  • Tener un espacio bien iluminado
  • Identificar primero las piezas y acomodarlas en orden
  • No apretar demasiado los tornillos para evitar dañar el acrílico o madera
  • Identificar bien la dirección de las piezas
  • Cuidar la dirección de los Servos

Conexión

El único componente extra necesario es una fuente de DC de 5V de al menos 1Amp para energizar los Servo Motores. El diagrama de conexión es el siguiente:

{DIAGRAMA}

Instalación de Librería meArm.h

Para poder utilizar las funciones para controlar el brazo con Arduino, es necesario instalar la librería meArm.h. Hay que seguir los siguientes pasos:

  1. Descargar la libería: https://github.com/yorkhackspace/meArm/archive/master.zip
  2. Extraer carpeta meArm-master
  3. Cortar y pegar la carpeta completa de meArm-master en la ubicación C:\Usuarios\TuNombreAqui\Documentos\Arduino\libraries

Ahora si cuando compiles el programa no debes tener problemas con la libería. Si tienes dudas nos puedes contactar en la sección de comentarios abajo.

Código de ejemplo Arduino


#include <meArm.h> //Libreria obtenida de https://github.com/yorkhackspace/meArm
#include <Servo.h> //Libreria de Servos Arduino

//Limites
#define MAX_XPOS 200
#define MIN_XPOS -200

#define MAX_YPOS 200
#define MIN_YPOS -50

#define MAX_ZPOS 120
#define MIN_ZPOS -50

#define MAX_STEP 5 //Este valor indica la velocidad máxima a la que se moverá el brazo.

meArm arm;

/* meArm Methods
*
* void begin(int pinBase, int pinShoulder, int pinElbow, int pinGripper) - The four PWM-capable pins used to drive the servos. Begin must be called in setup() before any other calls to the meArm instance are made.
* void openGripper() - opens the gripper, letting go of anything it was holding
* void closeGripper() - closes the gripper, perhaps grabbing and holding something as it does so
* void gotoPoint(float x, float y, float z) - move in a straight line from the current point to the requested position
* void goDirectlyTo(float x, float y, float z) - set the servo angles to immediately go to the requested point without caring what path the arm swings through to get there - faster but less predictable than gotoPoint
* bool isReachable() - returns true if the point can theoretically be reached by the arm
* float getX() - current x coordinate
* float getY() - current y coordinate
* float getZ() - current z coordinate
*
*/

Servo gripper, base, left, right;

boolean sePresiono = false;
boolean gripperOpen = true; //Empezar con el gripper Abierto

float xPos = 0;
float yPos = 170;
float zPos = 80;

float step_x = 0;
float step_y = 0;
float step_z = 0;

void setup() {

pinMode(A0, INPUT); //Joystick Eje Z
pinMode(A1, INPUT); //Joystick Eje Y
pinMode(A2, INPUT); //Joystick Eje X
pinMode(A5, INPUT_PULLUP); //Push button Gripper
pinMode(8, INPUT_PULLUP); //Push Button RESET

Serial.begin(9600);

//Conectar pines de control de Servos (Cable Naranja)
//Servo Middle = Arduino Pin 11
//Servo Left = Arduino Pin 10
//Servo Right = Arduino Pin 9
//Servo Gripper = Arduino Pin 6 *Ver nota abajo

//arm.begin(Middle, Left, Right, Gripper);
arm.begin(11, 10, 9, 13); //Asignar aqui al gripper un pin que no utilicemos, en este caso el pin 13
arm.gotoPoint(0,150,50); //Ir a posicion de HOME
openGripper();

//NOTA: El codigo de meArm Asigna el pin 13 al gripper y se puede utilizar la funcion
// arm.openGripper() y arm.closeGripper para controlarl, pero el gripper no cerraba completamente,
// por lo que optamos en controlarlo nosotros manualmente
gripper.attach(6);

Serial.println("INICIALIZADO!");
}

void loop() {

//Leer Joysticks
int x = analogRead(A1);
int y = analogRead(A2);
int z = analogRead(A0);

//Nota: Descomentar la linea siguiente para imprimir el valor de los Joysticks en su posicion 0. Se recomienda sumar un +/- 10% para tomar como posicion "Base" en donde no hay movimiento.
// En el caso ideal se tienen valores cercanos a 512 (1023/2) pero variaciones pueden alterar este valor.

//Serial.print("Joy X = "); Serial.print(x); Serial.print(" Joy Y = "); Serial.print(y); Serial.print(" Joy Z = "); Serial.println(z);

//Revisar Posicion Joystick, Calcular Step (Delta)
if( x < 470 || x > 570){
step_x = (MAX_STEP / 512.0) * x - MAX_STEP;
xPos += step_x; //Ya trae el signo correcto
} else {
step_x = 0;
}

if( y < 470 || y > 570){
step_y = (MAX_STEP / 512.0) * y - MAX_STEP;
yPos += step_y; //Ya trae el signo correcto
} else {
step_y = 0;
}

if( z < 470 || z > 570){
step_z = -(MAX_STEP / 512.0) * z + MAX_STEP;
zPos += step_z; //Ya trae el signo correcto
} else {
step_z = 0;
}

//Revisar limites del robot
if(xPos < MIN_XPOS) xPos = MIN_XPOS;
if(xPos > MAX_XPOS) xPos = MAX_XPOS;

if(yPos < MIN_YPOS) yPos = MIN_YPOS;
if(yPos > MAX_YPOS) yPos = MAX_YPOS;

if(zPos < MIN_ZPOS) zPos = MIN_ZPOS;
if(zPos > MAX_ZPOS) zPos = MAX_ZPOS;

//Leer boton de Gripper. Como se definió INPUT_PULLUP se tiene lógica inversa
if(!digitalRead(A5)){
if(!sePresiono){ //Para solo llamarlo 1 vez
sePresiono = true;
if(gripperOpen){
closeGripper();
gripperOpen = false;
} else {
openGripper();
gripperOpen = true;
}
}
} else {
sePresiono = false;
}

//Leer boton Home
if(!digitalRead(8)){
goHome();
Serial.println("Se envió a HOME");
}

//Ir a Posicion
if(arm.isReachable(xPos, yPos, zPos)){
arm.gotoPoint(xPos,yPos,zPos);
}

//Imprimir posicion actual y si gripper Esta abierto (1) o cerrado (0)
Serial.print("x = "); Serial.print(xPos); Serial.print(" y = "); Serial.print(yPos); Serial.print(" z = "); Serial.print(zPos); Serial.print(" GripperOpen = "); Serial.println(gripperOpen);
}

void openGripper(){
gripper.write(20); //Calibrar este valor de acuerdo al servo. Cuidar no abra tan fuerte (El servo comienza a temblar) MIN> 0
}

void closeGripper(){
gripper.write(110); //Calibrar este valor de acuerdo al servo. Cuidar no cerrar tan fuerte (El servo comienza a temblar) MAX> 180
}

void goHome(){
xPos = 0;
yPos = 170;
zPos = 80;
openGripper();
}