BRAZO ROBOT


BRAZO ROTOT INDUSTRIAL

ÍNDICE:
0.- TEORÍA.
1.- BRAZO ROBOT NUEMÁTICO.
2.- BRAZO ROBOT ARDUINO
0.- TEORÍA:
EL ROBOT SCARA:
Un Robot está constituido por una serie de elementos o eslabones unidos mediante articulaciones que permiten un movimiento relativo entre cada dos eslabones consecutivos. La constitución física de la gran parte de los robots industriales guarda cierta similitud con la anatomía del brazo humano, es decir, que poseen ciertas características antropomórficas, por lo que en ocasiones a los distintos elementos que componen el robot se les denomina en términos como cuerpo, brazo, codo muñeca

Cada articulación provee al robot de al menos un ‗grado de libertad‘, o bien, cada uno de los movimientos independientes que puede realizar cada articulación con respecto a la anterior, se denomina ‗grado de libertad‘ (GDL).

El movimiento de cada articulación puede ser de desplazamiento, de giro o una combinación de ambos. De este modo son posibles seis tipos diferentes de  articulaciones:
- Esférica o Rótula (3 GDL)
- Planar (2 GDL)
- Tornillo (1 GDL)
- Prismática (1 GDL)
- Rotación (1 GDL)
- Cilíndrica (2 GDL)

Los robots SCARA trabajan con exactitud, gracias a la combinación de elementos mecánicos y engranajes, los cuales ofrecen una máxima precisión en comparación a otros sistemas de trasmisión de potencia. Su estructura especial les permite alcanzar estos valores con rapidez: su escaso peso propio hace posible trabajar a elevada velocidad y los convierte en idóneos para aplicaciones de recogida y colocación.



CINEMÁTICA DE UN ROBOT:

“La cinemática de un robot estudia el movimiento del mismo con respecto a un sistema de referencia sin tener en cuenta la causas que la producen"

Existen dos problemas fundamentales a resolver en la cinemática de un robot cualquiera; el primero de ellos se conoce como el problema cinemático directo, y consiste en determinar cuál es la posición (X,Y) y orientación del extremo final del robot, con respecto a un sistema de coordenadas que se toma como referencia,el segundo, denominado problema cinemático inverso, resuelve la configuración (Movimiento) que debe adoptar el robot para una posición y orientación del extremo conocidas.


Las variables que se utilizan en el modelo cinemático del robot SCARA de dos grados de libertad (GDL), son las longitudes de cada uno de los eslabones, l1 y l2, las posiciones articulares de cada eslabón, q1 y q2, que están tomados en referencia al sistema de coordenadas con centro en la base del robot y la posición del órgano terminal del robot indicada por las coordenadas del mismo en el sistema de referencia.


CINEMÁTICA DE UN ROBOT DE 1 GDL:

La medición de ángulos:
Los ángulos miden posiciones relativas de dos rectas en el plano. La  medición de ángulos y, por tanto, en trigonometría, se emplean tres unidades:
  • Radián: unidad angular natural en trigonometría. En una circunferencia completa hay 2π radianes (algo más de 6,28).
  • Grado sexagesimal, (minutos y segundos): unidad angular que divide una circunferencia en 360 grados.
  • Grado centesimal: unidad angular que divide la circunferencia en 400 grados centesimales.


Un arco en una porción de circunferencia y su relación con el ángulo y su radio es: C=R*ángulo.


Las coordenadas cartesianas de un punto en el eje cartesiano son:
X= L * cos (ángulo)
Y= L * sen (ángulo)
La cinemática directa de un robot,  consiste pues, en calcular estas coordenadas, mediante su posición dada por la longitud de su brazo y por su ángulo.


Y sus coordenadas polares:
ángulo=  arcotan (Y/x)
distancia= RaizCuadrada(X^2+Y^2)


CINEMÁTICA DE UN ROBOT DE 2 GDL:


Fuente: FUNDAMENTOS DE ROBÓTICA; Barrientos, Peñin, Balaguer, Aracil; Mc Graw Hill, 1997.






1.- BRAZO ROBOT NEUMÁTICO:

BrazoRobot con cartón y jeringas:  https://www.youtube.com/watch?v=P2r9U4wkjcc&t=347s
Los más comunes son tres: impulsión hidráulica, impulsión eléctrica e impulsión neumática.



2.- BRAZO ROBOT ARDUINO:












CÓDIGO. CONTROL POR TECLADO:
//incluimos la libreria que controla el servo no hace falta descargarla
//pq la tiene nuestra propia IDE
#include<Servo.h>
Servo servo1;           //Definimos la primera variable servo
Servo servo2;           //Definimos la segunda variable servo
int enviado;              //Aqui enviamos el numero completo
int num;                   //Numero del servo
int posicion;             //Posicion del servo
void setup() {
  servo.attach(9);        //inicializamos los servos
  servo2.attach(10);
  Serial.begin(9600);        //inicializamos monitor serie
}
void loop() {
  if(Serial.available() >= 1)
  {
    /*
    1- Leer un numero "entero" por serial
    2- Calculamos su modulo por 10 (sera el numero del motor)
    3- Dividir el entero inicial por 10
    4- Lo que quede, sera la posición del motor
    */
  enviado = Serial.parseInt();  //leemos números enteros sino sería Serial.Read
   num = enviado%10;
   enviado = enviado/10;
   posicion = enviado;
 if(num == 1)  {
      servo.write(posicion);
    }
    else if(num == 2) {
      servo2.write(posicion);
      delay(40);
    }
  }
 }




CÓDIGO. CONTROL  CON BLUETOOTH:
#include <Servo.h>

char dato;
Servo hombro, codo, muneca, pinzas, base;
int phombro, pcodo, pmuneca, ppinzas, pbase, contador=0;

void setup()
{
  hombro.attach(13);
  codo.attach(12);
  muneca.attach(11);
  pinzas.attach(10);
  base.attach(9);
  Serial.begin(9600);
}

void loop()
{
  if(contador==0)
  {
    // Leer posicion inicial
    phombro=hombro.read();
    pcodo=codo.read();
    pmuneca=muneca.read();
    ppinzas=pinzas.read();
    pbase=base.read();
 
    //Escribir posicion inicial
    hombro.write(phombro);
    codo.write(pcodo);
    muneca.write(pmuneca);
    pinzas.write(ppinzas);
    base.write(pbase);
    contador++;
  }
  dato='x';
  dato=Serial.read();
  switch(dato)
  {
    case 'A': //HOMBRO DERECHA
    {
       while(Serial.read()!='x')
       {
          if(phombro>=175)
              phombro=175;
          if(phombro<=180 && phombro>=0)
          {
         
            phombro++;
            hombro.write(phombro);
            delay(15);
          }
       }
      break;
    }
 
    case 'a': //HOMBRO IZQUIERDA
    {
       while(Serial.read()!='x')
       {
         if(phombro<=5)
              phombro=5;
         if(phombro<=180 && phombro>=0)
          {
            phombro--;
            hombro.write(phombro);
            delay(15);
          }
      }
      break;
    }
    case 'C': //CODO ARRIBA
    {
         if(pcodo>=175)
              pcodo=175;
        while(Serial.read()!='x')
        {
          if(pcodo<=180 && pcodo>=0)
          {
            pcodo++;
            codo.write(pcodo);
            delay(15);
          }
        }
      break;
    }
    case 'c': //CODO ABAJO
    {
       if(pcodo<=5)
              pcodo=5;
       while(Serial.read()!='x')
       {
          if(pcodo<=180 && pcodo>=0)
          {
            pcodo--;
            codo.write(pcodo);
            delay(15);
          }
       }
      break;
    }
    case 'I': //MUÑECA ARRIBA
    {
      if(pmuneca>=170)
          pmuneca=170;
      while(Serial.read()!='x')
       {
          if(pmuneca<=180 && pmuneca>=0)
          {
            pmuneca++;
            muneca.write(pmuneca);
            delay(15);
          }
       }
      break;    
    }
    case 'i': //MUÑECA ABAJO
    {
        if(pmuneca<=10)
              pmuneca=10;
       while(Serial.read()!='x')
       {
          if(pmuneca<=180 && pmuneca>=0)
          {
            pmuneca--;
            muneca.write(pmuneca);
            delay(15);
          }
       }
      break;
    }
    case 'P': //PINZA ABRIR
    {
      if(ppinzas>=165)
          ppinzas=165;
      while(Serial.read()!='x')
       {
           if(ppinzas<=180 && ppinzas>=0)
          {
            ppinzas++;
            pinzas.write(ppinzas);
            delay(15);
          }
       }
      break;
    }
    case 'p': //PINZA CERRAR
    {
        if(ppinzas<=15)
              ppinzas=15;    
       while(Serial.read()!='x')
       {
          if(ppinzas<=180 && ppinzas>=0)
          {
            ppinzas--;
            pinzas.write(ppinzas);
            delay(15);
          }
       }
      break;
    }
    case 'B': //BASE IZQUIERDA
    {  if(pbase>=175)
          pbase=175;
       while(Serial.read()!='x')
       {
           if(pbase<=180 && pbase>=0)
          {
            pbase++;
            base.write(pbase);
            delay(15);
          }
       }
      break;
    }
    case 'b': //BASE DERECHA
    {
        if(pbase<=5)
              pbase=5;
       while(Serial.read()!='x')
       {
          if(pbase<=180 && pbase>=0)
          {
            pbase--;
            base.write(pbase);
            delay(15);
          }
       }
      break;
    }
  }
}