Manual Robotic a Robot Delta

download Manual Robotic a Robot Delta

of 22

Transcript of Manual Robotic a Robot Delta

  • 8/9/2019 Manual Robotic a Robot Delta

    1/22

    UASLP

    FACULTAD DE INGENIERA

    ALUMNOS:

    MEDINA DELGADO ADAN

    ROCHA MARTINEZ ANA ISABEL

    MATERIA:

    ROBOTICA

    MANUAL DE HARDWARE Y SOFTWARE BRAZO DELTA

  • 8/9/2019 Manual Robotic a Robot Delta

    2/22

    Manual de Hardware

    Este manual contiene el diagrama elctrico del controlador principal del robotdelta y su conexin con los servomotores adems de sus especificaciones.

    El controlador principal es una tarjeta de desarrollo que posee un microcontrolador Atmega328 (Tiene 32K de espacio para los programas, 23 lneas I/O,de las cuales 6 son los canales para el ADC de 10 bits. Funciona hasta 20 MHz conun cristal exterior, su voltaje operativo es de 1.8V a 5V), consta de 14 entradasdigitales configurables entrada i/o salidas que operan a 5 voltios. Cada pin puedeproporcionar o recibir como mximo 40 mA. Los pines 3, 5, 6, 9, 10 y 11 puedenproporcionar una salida PWM (Pulse Width Modulation).

    Si se conecta cualquier cosa a los pines 0 y 1, eso interferir con la comunicacin

    USB. Diecimila tambin tiene 6 entradas analgicas que proporcionan unaresolucin de 10 bits. Por defecto miden de 0 voltios (masa) hasta 5 voltios,aunque es posible cambiar el nivel ms alto, utilizando el pin Aref y algn cdigode bajo nivel.

    La plataforma Arduino se programa mediante el uso de un lenguaje propiobasado en el popular lenguaje de programacin de alto nivel Processing. Sinembargo, es posible utilizar otros lenguajes de programacin y aplicaciones

    populares en Arduino. Como C, C++, Java, C#, Matlab, Ruby, Pyhton, entre otros.Arduino est basado en C y soporta todas las funciones del estndar C y algunasde C++.

    Los registros de puertos permiten la manipulacin a ms bajo nivel y de forma msrpida de los pines de E/S del microcontrolador de las placas Arduino.11 Los pines

  • 8/9/2019 Manual Robotic a Robot Delta

    3/22

    de las placas Arduino estn repartidos entre los registros B(0-7), C (analgicos) yD(8-13).

    Al poder usarse algunos de los pines como pulsos con modulacin se conectaronlos pines 9, 10 y 11 a los servomotores para controlarlos.

    Diagrama Elctrico del Arduino UNO

  • 8/9/2019 Manual Robotic a Robot Delta

    4/22

    Se emplearon 3 servomotores de la marca TowerPro modelo Mg995 que tienen untorque de 15kg*cm a 6v y con 4.8v otorgan un torque de 10kg*cm con unavelocidad de 60grados / 0.20 segundos. Los engranes son de metal y tienen unpeso cada uno de 55g.

    Estos servomotores se conectaron a una fuente externa de 5 voltios para noexceder el amperaje soportado por el arduino ya que los servomotores consumenms.

    El diagrama de conexin es el siguiente:

    Lneas de control servomotores

    Servo Pinza

    Pin9 Pin10 Pin11

    5V Pin6

    GND

    Puente a tierra del Arduino

    En los servomotores los colores de las lneas son diferentes siendo la de tierra decolor caf, voltaje color rojo y control color naranja.

    ARDUINO

    UNO

  • 8/9/2019 Manual Robotic a Robot Delta

    5/22

    Estructura

    La estructura est hecha en su totalidad de aluminio con tubo cuadrado de 1cmde grosor, escuadra de aluminio de media pulgada, tubo de 1pulgada para labase y lamina de aluminio, unido con remaches y tornillos.

    A continuacin se muestra un dibujo del robot delta para mejor comprensin delas partes estructurales y su descripcin.

    El tringulo equiltero sobre el cual se montan los motores esta hecho de lminade aluminio cada lado mide 22cm y a la mitad tiene una hendidura de 2cm paramontar los ejes del brazo delta.

  • 8/9/2019 Manual Robotic a Robot Delta

    6/22

    Los motores se unieron a esta base con silicn y remaches para poder sosteneresta base se le aadieron tres tubos de 1 pulgada en cada arista del tringulopara que los ejes del brazo delta quedaran suspendidos en el aire.

  • 8/9/2019 Manual Robotic a Robot Delta

    7/22

    El robot delta tiene 3 ejes que se unen en un denominado efector final, estos ejesconstan de 2 partes. La primera es una seccin lineal unida directamente con elmotor y con una bisagra a la segunda parte que tambin es lineal y consta de 4rotulas 2 por extremo las cuales se unen a la bisagra del eje principal y la otra a labisagra del efector final.

    Estas rotulas al no se consiguieron, y se opt por implementarlas con remachesusndolos como pernos remachando solo en un punto para que pudiera rotarsobre su eje. Al necesitar que el efector final quede paralelo al triangulo dondeestn los motores estas bisagras tienen 2 puntos de apoyo cada una por lo tantoson 12 rotulas.

    Para unir los motores con los ejes se emplearon los tornillos que traan estos y seperforaron los tubos para montarlos.

    El efector final se construy con el mismo tubo de aluminio de 1cm sobre unabase hecha de lmina de aluminio para que quedasen con la forma de vrticesde un tringulo rectngulo, consta de 3 pedazos de tubo de 10 cm remachadossobre lamina.

  • 8/9/2019 Manual Robotic a Robot Delta

    8/22

    Sobre cada lado del efector final se unieron las bisagras del otro extremo de los 3ejes que mueven los motores para as finalmente armar el brazo delta.

    A continuacin se muestra una imagen del brazo delta sin la base.

    Se presentaron problemas con las espigas como ejes ya que eran pesadas,aunque los motores si podan con ellas se opt por cambiarlas debido a que

  • 8/9/2019 Manual Robotic a Robot Delta

    9/22

    surgi un error en el diseo porque se apoyaban estas solo sobre un punto esdecir una sola rotula y se sustituyeron por 6 pedazos de escuadra de aluminio de1cm con una longitud de 40 cm cada uno.

    El brazo delta finalmente terminado ya con la base y la sustitucin de las espigas

    se muestra en la siguiente imagen.

  • 8/9/2019 Manual Robotic a Robot Delta

    10/22

    La pinza se hizo tambin de aluminio, con diseo de tijera, en la cual un extremoesta fijo al motor y otro al eje que rota del motor para cerrar, se uni conescuadra de aluminio y se remacho para sostenerla al servomotor.

    La siguiente imagen es la pinza terminada con pedazos de goma en las puntas

    para que no se resbalen los objetos, se uni al efector final con alambre yplastilina cola-loca.

  • 8/9/2019 Manual Robotic a Robot Delta

    11/22

    Cinemtica Inversa

    El esquema cinemtico del robot delta consiste en 2 plataformas las cuales sontringulos equilteros el fijo que contiene los motores y el mvil. Los ngulos de lasarticulaciones son theta1, theta2 y theta3, y el punto E0 es la posicin efector final

    con coordenadas (x0, y0, z0). Para resolver el problema de la cinemtica inversatenemos que crear la funcin con E0 coordenadas (x0, y0, z0) como parmetrosque devuelve (theta1, theta2, theta3).

    En primer lugar designamos la longitud de un lado del tringulo fijo como f, lalongitud de la articulacin superior como rf, y la inferior como re, el marco dereferencia lo designamos como el centro del tringulo fijo.

  • 8/9/2019 Manual Robotic a Robot Delta

    12/22

    Debido al diseo la articulacin superior F1J1 slo puede girar en el plano YZ,formando un circulo con centro en la posicin del motor F1 y la longitud de laarticulacin rf de radio. En oposicin a la F1, J1 y E1 son los llamados juntasuniversales, lo que significa que puede girar libremente E1J1 relativamente a E1,formando esfera con centro en el punto E1 y de re radio.

    Interseccin de la esfera y el plano YZ es un crculo con centro en el punto E'1 yradio E'1J1, donde E'1 es la proyeccin de la E1 punto en el plano YZ. El J1 puntose puede encontrar ahora como interseccin de los crculos de radio conocido,

    con centros en E'1 y F1 (que debe elegir un solo punto de interseccin con menorcoordenada). Y si sabemos J1, podemos calcular el ngulo theta1. Primerocalculamos la posicin del punto E1y a partir del tringulo rectngulo formadopor el levantamiento de J1 obtenemos la posicin de X0, posteriormenteobtenemos el punto del motor, a partir de estas ecuaciones despejamos yobtenemos el valor de theta1.

  • 8/9/2019 Manual Robotic a Robot Delta

    13/22

    Para calcular los otros ngulos simplemente usamos la simetra del robot delta. Enprimer lugar, vamos a girar el sistema de coordenadas en el plano XY alrededordel eje Z a travs del ngulo de 120 grados hacia la izquierda. Para obtener theta2 simplemente usamos la matriz de rotacin, para el theta3 giramos en sentido delreloj

    Cdigo de Arduino

    #include #includeServo s1, s2, s3, s4;int t1,t2,t3,t4;

    int pot[10];void setup(){//indicamos las salidas del Arduino que controla a los motoress1.attach(9);s2.attach(10);s3.attach(11);s4.attach(8);//llenamos el arreglo de potencias para formar el numeropot[0]=pow(10,0);

    pot[1]=pow(10,1);pot[2]=pow(10,2);pot[3]=pow(10,3);pot[4]=pow(10,4);pot[5]=pow(10,5);pot[6]=pow(10,6);pot[7]=pow(10,7);

  • 8/9/2019 Manual Robotic a Robot Delta

    14/22

    pot[8]=pow(10,8);pot[9]=pow(10,9);

    }void loop(){

    if(Serial.available()){int r=Serial.read();//leemos 1er caracter del buffer serialdelay(100);//tiempo de esperaswitch(r){case 'a'://motor1t1=leeNum();//almaceamos el valor del angulo del motor1

    break;case 'b'://motor2

    t2=leeNum();//almaceamos el valor del angulo del motor2break;case 'c'://motor3t3=leeNum();//almaceamos el valor del angulo del motor3

    break;case 'd'://pinzat4=leeNum();//almaceamos el valor del angulo del motor de la pinza

    break;case '*'://al recibir el * nos indica que se han recibido todos los valores y ahora

    se deben mover los motoresif(EsAngServo(t1))//verificamos que el valor que se va a escribir en los servos

    entre dentro del rango validos1.write(t1);//movemos el motor el valor del angulo que indique la variable t

    para cada servo correspondienteif(EsAngServo(t1))s2.write(t2);

    if(EsAngServo(t1))s3.write(t3);

    if(EsAngServo(t1))

    s4.write(t4);break;}

    }}int leeNum()//lee num lee una cadena de numeros en orden invertido y laconvierte a entero

  • 8/9/2019 Manual Robotic a Robot Delta

    15/22

    {int num=0,i=0,r;while((r=Serial.read())>0)//leemos un valor del puerto serial mientras el valor sea

    mayor que cero{

    num+=(r-48)*pot[i];//num incrementa con el numeto leido multiplicado por elarreglo pot el cual contiene las potencias de 10^i decrementamos 48 a r paraobtener su valor real como numero y no como ASCII

    i++;}

    }bool EsAngServo(int t){return (t>=0&&t

  • 8/9/2019 Manual Robotic a Robot Delta

    16/22

    intdx1 = 20, dx2 = 288, dy1 = 20, dy2 = 171;//distancias del cuadro de vision ymovimiento 1 robot 2 camara

    publicSerial(SerialPortsp){

    serialPort1 = sp;}

    publicAnguloEnvia(intx, inty, intz){

    x = x * dx1 / dx2 - 12;//convierte las coordenadas de camara encoordenadas de movimiento del robot

    y = y * dy1 / dy2 - 12;Anguloang = delta_calcInverse(x, y, z);//calcula con cinematica inversa la

    posicionang.procesa();//valida el resultado de la funcion anteriorserialPort1.WriteLine("a"+ Invierte((int)ang.t1));//manda al motor 1 una

    cantidad en gradosserialPort1.WriteLine("b"+ Invierte((int)ang.t2));//manda al motor 2 una

    cantidad en gradosserialPort1.WriteLine("c"+ Invierte((int)ang.t3));//manda al motor 3 una

    cantidad en gradosserialPort1.Write("*");//indica que se debe realizar el movimientoreturnang;

    }

    publicvoidAgarraPinza(Anguloang){

    AbrePinza();//abre pinzaThread.Sleep(500);Baja(30, ang);//baja hasta el limite del sueloThread.Sleep(500);CierraPinza();//cierra para tomar la piezaThread.Sleep(500);Baja(-30, ang);//sube la pinzaThread.Sleep(500);Envia(posInicial());//mandamos a la posicion inicialThread.Sleep(500);AbrePinza();//soltamos la piezaThread.Sleep(500);

    }

    voidAbrePinza(){

    serialPort1.WriteLine("d"+ Invierte(120));//escribe en el motor de la pinza 120grados

    serialPort1.Write("*");}

  • 8/9/2019 Manual Robotic a Robot Delta

    17/22

    voidCierraPinza(){

    serialPort1.WriteLine("d"+ Invierte(10));//escribe en el motor de la pinza 10grados

    serialPort1.Write("*");}

    voidBaja(intcant, Anguloang)//decrementa una cantidad al angulo actual{

    ang.t1 -= cant;ang.t2 -= cant;ang.t3 -= cant;EnviaSProc(ang);

    }

    stringInvierte(inti)//invierte numero para mandarlo al arduino

    {stringcad = i.ToString();List listChar = newList();foreach(charc incad){

    listChar.Add(c);}listChar.Reverse();cad = "";foreach(charc inlistChar){

    cad += c;}returncad;

    }

    voidEnvia(Anguloang)//Envia un angulo a los motores{

    ang.procesa();//procesa el angulo antes de ser enviado validando valoresnegativos y que se encuentre dentro del rango

    serialPort1.WriteLine("a"+ Invierte((int)ang.t1));serialPort1.WriteLine("b"+ Invierte((int)ang.t2));serialPort1.WriteLine("c"+ Invierte((int)ang.t3));serialPort1.Write("*");//indica que empieza el movimiento

    }

    public AnguloposInicial()//posicion inicial constante{

    Anguloang = newAngulo();ang.t1 = 124;ang.t2 = 35;

  • 8/9/2019 Manual Robotic a Robot Delta

    18/22

    ang.t3 = 66;returnang;

    }

    voidEnviaSProc(Anguloang)//envia un angulo a los motores sin serprocesado

    {serialPort1.WriteLine("a"+ Invierte((int)ang.t1));serialPort1.WriteLine("b"+ Invierte((int)ang.t2));serialPort1.WriteLine("c"+ Invierte((int)ang.t3));serialPort1.Write("*");

    }

    Statusdelta_calcAngleYZ(doublex0, doubley0, doublez0){

    Statuss = newStatus();doubley1 = -0.5 * 0.57735 * f; // f/2 * tg 30

    y0 -= 0.5 * 0.57735 * e; // centra la esquina// z = a + b*ydoublea = (x0 * x0 + y0 * y0 + z0 * z0 + rf * rf - re * re - y1 * y1) / (2.0 * z0);doubleb = (y1 - y0) / z0;

    // discriminantedoubled = -(a + b * y1) * (a + b * y1) + rf * (b * b * rf + rf);if(d < 0){

    s.Inicializa(true, 0);returns; // si el discriminante es menor que cero significa que no existe y

    retorna error}doubleyj = (y1 - a * b - Math.Sqrt(d)) / (b * b + 1);doublezj = a + b * yj;doubletheta = Math.Atan(-zj / (y1 - yj)) * 180.0 / pi + ((yj > y1) ? 180.0 :

    0.0);//calcula el valor del angulo

    s.Inicializa(false, theta);returns; //regresa el status que contiene el angulo

    }// (x0, y0, z0) -> (theta1, theta2, theta3)Angulodelta_calcInverse(doublex0, doubley0, doublez0){

    Anguloang = newAngulo();doubletheta1 = 0;doubletheta2 = 0;doubletheta3 = 0;

    Statusstatus = delta_calcAngleYZ(x0, y0, z0);//se calcula el angulo y severifica el estado del discriminante

  • 8/9/2019 Manual Robotic a Robot Delta

    19/22

    if(status.band == false){

    theta1 = status.angulo;//si es valido se asigna theta1status = delta_calcAngleYZ(x0 * cos120 + y0 * sin120, y0 * cos120 - x0 *

    sin120, z0); // rota las coordenadas a +120 grados, apra calcular theta2}if(status.band == false)//checa si es valido el resultado de

    delta_calcAngleYZ para theta2{

    theta2 = status.angulo;//si es valido se asigna theta2status = delta_calcAngleYZ(x0 * cos120 - y0 * sin120, y0 * cos120 + x0 *

    sin120, z0); // rota las coordenadas a -120 grados, apra calcular theta2}

    theta3 = status.angulo;//asigna theta3ang.Inicializa(status.band, theta1, theta2, theta3);

    returnang;}

    intxMin = -12, xMax = 12, yMin = -12, yMax = 12, inc = 5;//valores minimos ymaximos que alcanza el brazo dentro del area de vision de la camara

    publicvoidArea()//calcular que el area de vision de la camara correspondacon el area de movimiento del robot

    {intx, y = yMin, z = 32;

    for(x = xMin; x < xMax; x += inc)Envia(x, y, z);y = yMax;for(x = xMin; x < xMax; x += inc)

    Envia(x, y, z);x = xMin;for(y = yMin; y < yMax; y += inc)

    Envia(x, y, z);x = xMax;for(y = yMin; y < yMax; y += inc)

    Envia(x, y, z);}

    }}

    Clase Principal

    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;

  • 8/9/2019 Manual Robotic a Robot Delta

    20/22

    usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingEmgu.CV;usingEmgu.CV.Structure;usingEmgu.Util;usingSystem.Diagnostics;usingSystem.Threading;

    namespacePosicionesPiezas{

    publicpartialclassForm1: Form{

    privateCapture_capture;privateImage frame;

    privateStringBuildermsgBuilder;privateList objetivos;Anguloang;CinematicaInversacn = newCinematicaInversa();Serials;publicForm1(){

    InitializeComponent();s = newSerial(serialPort1);//inicializa la clase serial con el serial port del formang = newAngulo();//inicializa la variable anguloif(serialPort1.IsOpen)

    serialPort1.Close();//si el puerto esta abierto lo cierraserialPort1.Open();//abre el puertos.posInicial();//mueve el brazo ala poscicion inicial para que la camara no

    lo detecteif(_capture == null)//si la captura es null{

    try{

    _capture = newCapture();//genera una nueva captura}catch(NullReferenceExceptionexcpt){

    MessageBox.Show(excpt.Message);//si no captura bien el dispositivomanda un mensaje de error

    }}Application.Idle += ProcessFrame;

    }privatevoidReleaseData(){

  • 8/9/2019 Manual Robotic a Robot Delta

    21/22

    if(_capture != null)_capture.Dispose();//al momento de cerrar la aplicacion elimina el

    contenido de la variable _capture}

    privatevoidProcessFrame(objectsender, EventArgsarg)//captura de lacamara metodo que se esta actualizando y mostrando el contenido de lacamara

    {frame = _capture.QueryFrame();//obtiene la vision de la camaraimageBox1.Image = frame;//la muestra en un imageBox

    }privatevoiddetectaCirculitos(Image imagenBase){

    Image FiltroCirculos = imagenBase.Convert().PyrDown().PyrUp();//Se filtran las imagenes de circulo en nuestra captura

    imageBox2.Image = FiltroCirculos;

    GraycannyThreshold = newGray(180);Stopwatchwatch = Stopwatch.StartNew();msgBuilder = newStringBuilder("Performance: ");

    #regiondeteccion de circulosGraycircleAccumulatorThreshold = newGray(500);objetivos = newList();CircleF[] circles = FiltroCirculos.HoughCircles(cannyThreshold,

    circleAccumulatorThreshold, 9.0, 15.0, 1, 0)[0]; //Regresa los circuloswatch.Stop();msgBuilder.Append(String.Format("Hough circles - {0} ms; ",

    watch.ElapsedMilliseconds));foreach(CircleFcirculo incircles) //LLenado de las posiciones en la imagende los circulos

    {Objetivoob = newObjetivo(circulo.Center.X, circulo.Center.Y,

    circulo.Radius);objetivos.Add(ob);

    }#endregionwatch.Stop();#regionDibujar circulosImage circleImage = imagenBase.CopyBlank();foreach(CircleFcircle incircles)

    circleImage.Draw(circle, newBgr(Color.Brown), 2);#endregion

    imageBox4.Image = circleImage;//muestra con circulos las posiciones delos circulos

    }privatevoidForm1_FormClosing(objectsender, FormClosingEventArgse)

  • 8/9/2019 Manual Robotic a Robot Delta

    22/22

    {if(serialPort1.IsOpen)//al momento de cerrar cierra el puerto serial

    serialPort1.Close();}

    privatevoidTomaFoto(objectsender, EventArgse){

    s.posInicial();//mueve el brazo a una poscion para que no el estorbe a lacamara

    Thread.Sleep(4000);imageBox3.Image = frame;//captura la imagendetectaCirculitos(frame);//detecta las pocisiones delos circulosforeach(Objetivoo inobjetivos)//objetivos es una lista alli se quedan

    guardadas las posiciones de los circulitos en pantalla{

    s.AgarraPinza(s.Envia((int)o.Centro.Y, (int)o.Centro.X, 32));}

    }privatevoidbutton2_Click(objectsender, EventArgse){

    s.Area();//calcula el area de movimiento del brazo para acomodar lacamara

    }}

    }

    Cotizacin

    Concepto Cantidad Preciounitario Subtotal

    Arduino UNO 1 $400 $400Servomotor tower pro mg995 4 $210 $840Tubo aluminio 1cm 2 $50 $100Bolsa de remaches 1 $120 $120Tubo aluminio 1 pulgada 3 $70 $210Lamina de aluminio 3mm 1 $175 $175Escuadra de aluminio de 1cm 3 $50 $150Envo de motores y arduino $120 $120

    Subtotal $2.105IVA 16% $336.8TOTAL $2441.8