Professional Documents
Culture Documents
UPIITA
Abstrac
Objetivo general
Desarrollar un robot tipo SCARA, capaz de manipular manual y automáticamente muestras médicas;
en este caso particular, tubos de ensaye.
Objetivos particulares
Implementar el uso de un robot tipo SCARA en el área medica, reducir costos y tiempos en la
manipulación y procesado de muestras.
Justificación
Los robot tipo SCARA son implementados en la industria por su alta precisión y velocidad, son
utilizados en especial cuando el desplazamiento de los elementos y el área de trabajo son reducidos.
Teniendo en cuenta su eficiencia es que su desplazamiento es virtualmente en el plano horizontal
facilitando su programación y control.
Muchos de estos tipos de sistemas están controlados o asistidos por un software de tratamiento
digital de imágenes; dando la posibilidad de una manipulación de los objetos más precisa, puesto que
siempre podremos saber la posición de los elementos a controlar y teniendo la posibilidad de
autocorregirse y seguir con su labor automática. En este caso hemos implementado un sistema de
control basado en Visión artificial, que nos entrega la posición de nuestro robot.
Hoy en día existen infinidad de procesos que se realizan dentro de los laboratorios, desde un análisis
de alguna sustancia, hasta el estudio de las diferentes reacciones químicas que surgen al combinar
diferentes elementos que pueden ser peligrosas para el ser humano.
No obstante el riesgo que esto puede traer, el hombre en su afán de ampliar sus conocimientos y
lograr a través de la experimentación encontrar la solución a diferentes situaciones, realiza
investigaciones en las cuales con frecuencia suele ser desconocida la peligrosidad que pueden
acarrear.
Por lo anterior, es que decidimos crear un mecanismo que permita al personal dentro de un
laboratorio realizar sus investigaciones con el menor riesgo posible para su persona, así como la
mínima existencia de errores, lo que permitirá hacer más eficientes los procesos y con ello acortar
tiempos e incluso disminuir considerablemente las horas hombre inactivas para poder ocupar este
tiempo en más investigaciones y, por qué no, ocuparlo para darle una calidad de vida diferente a esos
trabajadores.
Especificaciones técnicas
Peso 4.25 Kg
Alimentación 20 Vdc
80 w
Estructura
El material utilizado para la construcción de toda la estructura es acrílico, los datos requeridos para la
realización de los cálculos necesarios son:
El pedestal es un tubo construido con acrílico con un diámetro de de 7.5’’, siendo la sección más
fuerte del robot puesto que tiene que soportar el peso y el corte que crea la inercia de las extensiones
del brazo.
Se escogió un tubo y no una viga puesto que mientras el material este más alejado del centro de este
el corte de las fuerzas de torsión se reducen, evitando la fractura de este
Con objeto de lograr la respuesta más rápida posible para un movimiento dado y un sistema de
accionamiento, los eslabones que forman las estructura deben de mantenerse lo más ligeros
posibles, los eslabones deben también ser tan rígidos como sea posible.
Eslabon1:
10
11
12
13
14
15
16
17
18
Etapa de potencia
Para la etapa de potencia se utilizaran cuatro circuitos integrados L298, este circuito integrado es un
controlador dual de motores que soporta altos voltajes (hasta 50v) y altas corrientes (hasta 4A). Estos
puentes H están controlados mediante visión artificial utilizando un programa creado en opencv. EL
circuito integrado se utilizo en la configuración en paralelo, esto significa que solo controlara un solo
motor pero en esta configuración el circuito integrado puede manejar más corriente, hasta 4 A. En el
diseño de este circuito se tuvieron que implementar diodos que pudieran manejar la corriente
necesaria además de utilizar disipadores en los circuitos integrados.
Microcontrolador
19
Cámara
La cámara es un componente fundamental del control por lo que la selección de cámara fue algo
minucioso. La cámara que cumplió con nuestros requisitos es una cámara Microsoft Vx-700, cuyas
características principales son una resolución de 2.0 mega pixeles, resolución de 640X480, conexión
USB y se escogió por proveer una imagen nítida, sin curvaturas, ser compacta y por su
compatibilidad. La cámara se monta en una estructura de altura variable para poder ajustar a la altura
necesaria sobre el robot.
La interfaz utiliza un pic 18f2550, es un microcontrolador pequeño que integra la comunicación USB,
lo que facilita en gran medida su programación. La comunicación USB está configurada para
funcionar como un puerto serial, es decir se comporta como un puerto COM. El puerto B está
configurada como salida (8 bits) y el puerto A esta configurada como entrada de datos (7 bits).
El microcontrolador utiliza un cristal de 20 MHz y una alimentación de 5v que es suministrada por el
mismo puerto de la computadora.
21
Material
Rodamientos
Para que la transmisión de movimiento a los eslabones sea óptima, no sufra deslizamientos, sea más
fiel al movimiento del motor y el motor no sufra cargas de tipo axial, se colocaron rodamientos en las
primeras dos articulaciones (entiéndase que las articulaciones se enumeran a partir de la base hasta
llegar al elemento terminal), que es donde se necesita mayor par en los motores.
Los rodamientos se escogieron de tipo axial de bolas, debido a que las cargas que se manejan en
nuestro sistema no son de grandes magnitudes (como se verá más adelante) comparadas con otras
aplicaciones en los que es necesario utilizar un rodamiento de agujas o uno de rodillos esféricos,
además es de simple efecto puesto que sólo se aplicará una carga axial sobre el elemento.
Se acudió a los catálogos de SKF y se eligió el siguiente rodamiento, el cual cumple con nuestras
especificaciones de diseño tanto en cargas como en dimensiones.
22
Los motores elegidos para el robot son cuatro motos reductores, el motor principal es un
motoreductor de 24 volts, su juego de engranes brinda el suficiente par para mover los dos eslabones
y el gripper sin problemas. El motor dos es un motor reductor de 2 Kgf-cm, es compacto y ligero para
que el eslabón no sufra de esfuerzos innecesarios.
En el tercer eslabón hay dos motoreductores, uno es similar al motor dos pero de 4.7 kgf-cm, este
motor es utilizado para mover el gripper en el eje z, el último motoreductor es un minimotoreductor
que se utiliza para la apertura del gripper. Ambos motoreductores tienen par suficiente para manipular
los tubos de ensayo sin problema.
23
Para lograr el movimiento vertical del robot, utilizamos un sistema de piñón-cremallera; la cremallera
fabricada con una sección recortada de una banda de motor de automóvil adherida a dos placas
empalmadas de acrílico, a esta cremallera va adherido el gripper.
24
Nuestro sistema de control está basado en software de tratamiento de imágenes, este controlara la
posición, dirección y trayectorias del robot, ahorrándonos de este modo sensores que nos indiquen la
posición de los efectores.
25
El programa muestra al usuario un menú que le permite elegir entre el tipo de cinemática y una
trayectoria curva. Luego captura un frame de video y lo procesa. Para esto, primero recorta la imagen
para que esta quede de 480x480 pixeles, más tarde lo convierte a formato HVL. Cuando lo tiene se
segmenta para obtener únicamente los objetos de interés en la imagen, en este caso los círculos en
los eslabones. Cuando se tiene la segmentación se procede a realizar un algoritmo de chain code
para obtener el centroide de los objetos en la escena; este programa también elimina el ruido y
ordena los objetos por tamaño.
Después se procede a la elección de la ejecución de la rutina que el usuario eligió, se hacen los
cálculos pertinentes para obtener los ángulos necesarios mediante su respectiva función (ver
programa).
Después de tener definidos los ángulos destino, estos se comparan con los que tienen actualmente
los eslabones del robot y se mandan vía puerto serie las órdenes pertinentes a los motores para que
los eslabones lleguen al ángulo destino.
#include<highgui.h>
#include<cv.h>
#include<math.h>
#include<unistd.h>
#include<termios.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include <fcntl.h>
#define pi 3.1416
//-------------------------------------------Funciones----------------------------------------------------------
//----------------------------------Variables globales--------------------------------------------------------
int s_fd;
bool directa=false;
bool inversa=false;
bool sec=false;
bool bucle=false;
bool sig=true;
26
px=0;
py=0;
l1=120;
l2=120;
int fil[20],col[20];
int i,j,opcion,nfigs;
char motor1[1],motor2[1],salida[1];
char c;
CvPoint p1,p2;
uchar* ptr;
CvCapture* cam=cvCreateCameraCapture(0);//Inicia la captura de la camara
IplImage* frame;//Guarda los frames de la captura
IplImage* ejes;//Apunta hacia la dirección de memoria de frame
cvNamedWindow("WebCam",1);//Crea una ventana
q1[0]=0*3.1416/180;
q2[0]=0*3.1416/180;
//-----------------------------------------------Menú-------------------------------------------------------
menu:
printf("\n1=Cinematica directa\n2=Cinematica Inversa\n3=Trayectoria curva");
printf("\nElija la opcion que usted desee: ");
scanf("%d",&opcion);
system("clear");
printf("\nOpcion eleginda= %d",opcion);
switch(opcion){
case 1:
directa=true;
inversa=false;
sec=false;
break;
case 2:
directa=false;
inversa=true;
sec=false;
break;
case 3:
directa=false;
inversa=false;
sec=true;
break;
default:
printf("\nOpcion no valida\nElija otra\n\n\n");
goto menu;
27
}
//-------------------------------------------------------------------------------------------------------------------------
-----------
//-----------Se inicia el procesamiento de cada frame de captura
while(1){
frame=cvQueryFrame(cam); //Obtiene un frame de la captura
IplImage* hsl=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3); //convierte a
frame de RGB a HSL y lo almacena en hsl
if(!frame) break;
recortar(hsl); //Se recorta la imagen para que sea de 480x480
segment(hsl,100,100,800);
ejes=cvCreateImageHeader(cvSize(frame->width,frame->height),frame-
>depth,frame->nChannels); //se crea la cabecera de miagen eje
//Se establecen las referencias de la cabecera para que apunten hacia frame
ejes->origin=frame->origin;
ejes->widthStep=frame->widthStep;
ejes->imageData=frame->imageData;
//-------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------
//----------Se trazan los ejes cartecianos
cvLine(ejes,cvPoint(0,ejes->height/2),cvPoint(ejes->width,ejes-
>height/2),cvScalar(0,0,0),1,8,0);
cvLine(ejes,cvPoint(ejes->width/2,0),cvPoint(ejes->width/2,ejes-
>height),cvScalar(0,0,0),1,8,0);
28
29
if(q2[1]-q2[0]<=pi){
if(q2[0]<q2[1]){
q2[0]+=0.01;
motor1[0]='\x4';//Información enviada al motor 2 para girar hacia la
izquierda
if(q2[0]>2*pi) q2[0]=0;
}
else{
motor2[0]='\x0';//Detener motor 2
sigm2=true;
}
}
else{
if(q2[1]<q2[0]+2*pi){
q2[0]-=0.01;
motor2[0]='\x8';////Información enviada al motor 2 para girar hacia la
derecha
if(q2[0]>2*pi) q2[0]=0;
}
else{
motor2[0]='\x0';//Dtener motor 2
sigm2=true;
}
}
30
void cin_inversa(void)
{
system("clear");
printf("\nIntroduzca el valor de Px entre (-240 y 240): ");
scanf("%f",&px);
printf("\nIntroduzca el valor de Py (-240 y 240): ");
scanf("%f",&py);
//Ecuaciones para conocer los ángulos necesario para alcanzar los puntos deseados--------------
------------------------------------
q2[1]=acos((float)(pow(px,2)+pow(py,2)-pow(l1,2)-pow(l1,2))/(2*l1*l2));
q1[1]=atan((float)py/px)-atan((float)l2*sin(q2[1])/(l1+l2*cos(q2[1])));
//---------------------------------------------------------------------------------------------------------------
----------------
//Se acomodan los puntos para que sean dibujados de manera correcta en la ventana
if(px<0) q1[1]=q1[1]+pi;
px=px;
py=-py;
printf("\nAngulos q1= %f q2= %f\n",q1[1],q2[1]);
if(q1[1]<0) q1[1]=2*pi+q1[1];
if(q2[1]<0) q2[1]=2*pi+q2[1];
inversa=false;
}
//------------------------------------------Secuencia circular-----------------------------
void sec_circ(void)
{
int i;
float j;
if(bucle==false&&sig==true){
system("clear");
printf("\nIntroduzca el valor del radio: ");
scanf("%f",&r);
k=0;
j=0;
for(i=0;i<63;i++){//Se generan los puntos atraves de la ecuacipn de la circunferencia.
puntos[0][i]=(float)r*cos(j);
puntos[1][i]=(float)r*sin(j);
j+=.1;
}
bucle=true;
}
31
/*********************************************************************/
/* */
/* */
/* */
/* */
/* Otras Funciones */
/* */
/* */
/* */
/* */
/*********************************************************************/
32
/*****************************************************************/
//serial_send envia undato al puerto serie
void serial_send(int serial_fd, char *data, int size)
{
write(serial_fd, data, size);
}
/*******************************************************************/
//serial_close cierra el puerto serie
void serial_close(int fd)
{
close(fd);
}
/*******************************************************************************/
//sacar_dato saca un caracter por el puerto ttyACM0
33
serial_close(s_fd);
return 0;
}
/****************************************************************************/
//chainCode obtiene el centroide de las figuras en escena a travez del código cadena
int chainCode(IplImage* img,int centfil[],int centcol[],int verde, int rojo, int azul)
{
int i,j;
int inc=0;
int nfig=-1;
int tamvect=0;
uchar* ptr1;
uchar* ptr2;
uchar* ptr3;
uchar* ptr4;
int length[20];
bool a=false;
IplImage* copy=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
IplImage* borde=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
cvSetZero(borde);
cvCopy(img,copy,NULL);
for(i=0;i<copy->height;i++){
ptr1=(uchar*)(copy->imageData+i*copy->widthStep);
for(j=0;j<copy->width; j++){
if(ptr1[3*j+1]>verde&&ptr1[3*j+2]>rojo&&ptr1[3*j+3]>azul){
ptr1[3*j+1]=255;
ptr1[3*j+2]=255;
ptr1[3*j+3]=255;
}
else{
ptr1[3*j+1]=0;
ptr1[3*j+2]=0;
ptr1[3*j+3]=0;
}
}
}
cvSaveImage("segment.jpg",copy);
for(i=1;i<copy->height-1;i++){
ptr1=(uchar*)(copy->imageData+i*copy->widthStep);
ptr2=(uchar*)(copy->imageData+(i-1)*copy->widthStep);
ptr3=(uchar*)(copy->imageData+(i+1)*copy->widthStep);
ptr4=(uchar*)(borde->imageData+i*borde->widthStep);
for(j=1;j<copy->width-1; j++){
if(ptr1[j*3+1]==255&&(ptr1[j*3-
2]==0||ptr1[j*3+4]==0||ptr2[j*3+1]==0||ptr3[j*3+1]==0)){
ptr4[j]=255;
tamvect++;
34
}
int cx[tamvect],cy[tamvect];
cvSaveImage("borde.jpg",borde);
for(i=1;i<borde->height-1;i++){
ptr1=(uchar*)(borde->imageData+i*borde->widthStep);
ptr2=(uchar*)(borde->imageData+(i-1)*borde->widthStep);
ptr3=(uchar*)(borde->imageData+(i+1)*borde->widthStep);
for(j=1;j<borde->width;j++){
if(ptr1[j]==255){
nfig++;
int dim=0;
a=true;
while(a==true){
ptr1[j]=0;
if(ptr1[j+1]==255){
cx[inc]=j;
cy[inc]=i;
i=i;
j++;
ptr1=(uchar*)(borde->imageData+i*borde-
>widthStep);
ptr2=(uchar*)(borde->imageData+(i-1)*borde-
>widthStep);
ptr3=(uchar*)(borde->imageData+(i+1)*borde-
>widthStep);
inc++;
dim++;
}
else if(ptr3[j+1]==255){
cx[inc]=j;
cy[inc]=i;
i++;
j++;
ptr1=(uchar*)(borde->imageData+i*borde-
>widthStep);
ptr2=(uchar*)(borde->imageData+(i-1)*borde-
>widthStep);
ptr3=(uchar*)(borde->imageData+(i+1)*borde-
>widthStep);
inc++;
dim++;
}
else if(ptr3[j]==255){
cx[inc]=j;
cy[inc]=i;
i++;
j=j;
ptr1=(uchar*)(borde->imageData+i*borde-
35
36
for(i=0;i<=nfig;i++){
if(i==0){
for(j=0;j<length[i];j++){
if(j==0) {
sumcol[i]=cx[j];
sumfil[i]=cy[j];
}
else{
auxx=sumcol[i];
sumcol[i]=cx[j]+auxx;
auxy=sumfil[i];
sumfil[i]=cy[j]+auxy;
37
float col[nfig+1],fil[nfig+1];
//int centcol[nfig+1],centfil[nfig+1];
for(i=0;i<=nfig;i++){
if(i==0){
col[i]=(float)sumcol[i]/length[i];
centcol[i]=col[i];
fil[i]=(float)sumfil[i]/length[i];
centfil[i]=fil[i];
}
else{
col[i]=(float)sumcol[i]/(length[i]-length[i-1]);
centcol[i]=col[i];
fil[i]=(float)sumfil[i]/(length[i]-length[i-1]);
centfil[i]=fil[i];
}
cvCircle(img,cvPoint(centcol[i],centfil[i]),1,cvScalar(255,255,255),1,8,0);
}
int tam[nfig+1];
int aux[2][2],tamaux[2];
for(i=0;i<=nfig;i++){
if(i==0) tam[i]=length[i];
else tam[i]=length[i]-length[i-1];
//printf("\n%d\n",tam[i]);
}
for(i=0;i<nfig;i++){
if(tam[i]<tam[i+1]){
aux[0][0]=centcol[i];
aux[0][1]=centcol[i+1];
aux[1][0]=centfil[i];
aux[1][1]=centfil[i+1];
tamaux[0]=tam[i];
tamaux[1]=tam[i+1];
38
return(nfig);
cvReleaseImage(©);
cvReleaseImage(&borde);
}
/**********************************************************************/
//recortar recorta una imagen 80 pixeles por la izquierda y 80 por la derecha
int i,j;
for(i=0;i<img->height;i++){
uchar* ptr=(uchar*)(img->imageData+i*img->widthStep);
for(j=0;j<80;j++){
ptr[j*3+1]=0;
ptr[j*3+2]=0;
ptr[j*3+3]=0;
}
for(j=560;j<img->width;j++){
ptr[j*3+1]=0;
ptr[j*3+2]=0;
ptr[j*3+3]=0;
}
}
}
/****************************************************/
//segment elimina los valores inferiores a los establecidos en verde, rojo y azul
39
'----------------------------------------------
'------Contro de Cremallera y Gripper----------
'----------------------------------------------
$regfile "m8535.dat"
$crystal = 8000000
Dim Pot As Word 'Variable donde se controla el ADC
Config Adc = Free , Prescaler = Auto , Reference = Aref 'Configuración ADC
Start Adc 'Inicio el ADC
Ddra = &B00000000 'Puerto A como entrada
Ddrb = &B00001000 'Definido como salida, el PWM del OC0
Ddrc = &B00000000 'Puerto C como entrada para la selección del sentido de giro de los motores
Ddrd = &B10110010 'Definidos como salida los PWM OC1A, OC1B y OC2
Tccr0 = &B01101001 '------------------------------------------
Tccr1a = &B10100001 'Configuración de
Tccr1b = &B00001001 'los PWM
Tccr2 = &B01101001 '------------------------------------------
Inicio:
If Pinc.0 = 1 And Pinc.1 = 0 Then
Ocr0 = 0 'Giro a la derecha motor 1
Ocr2 = 150
Elseif Pinc.0 = 0 And Pinc.1 = 1 Then
Ocr0 = 150 'Giro a la izquierda motor 2
Ocr2 = 0
Elseif Pinc.2 = 1 And Pinc.3 = 0 Then
Ocr1a = 0 'Giro a la derecha motor 1
Ocr1b = 140
Elseif Pinc.2 = 0 And Pinc.3 = 1 Then
Ocr1a = 140 'Giro a la izquierda motor 2
Ocr1b = 0
Else
Ocr0 = 0 'Paro motor 1
Ocr1a = 0
Ocr1b = 0 'Paro motor 2
Ocr2 = 0
40
'----------------------------------------------
'-----------Control de Eslabones----------------
'----------------------------------------------
$regfile "m8535.dat"
$crystal = 8000000
Ddra = &B00000000 'Puerto A como entrada
Ddrb = &B00001000 'Definido como salida, el PWM del OC0
Ddrc = &B00000000 'Puerto C como entrada para la selección del sentido de giro de los motores
Ddrd = &B10110000 'Definidos como salida los PWM OC1A, OC1B y OC2
Tccr0 = &B01101001 '--------------------
Tccr1a = &B10100001 'Configuración
Tccr1b = &B00001001 'de los PWM
Tccr2 = &B01101001 '--------------------
Inicio:
If Pinc.0 = 1 And Pinc.1 = 0 Then
Ocr0 = 0 'Giro a la derecha motor 1
Ocr2 = 100
Elseif Pinc.0 = 0 And Pinc.1 = 1 Then
Ocr0 = 100 'Giro a la izquierda motor 2
Ocr2 = 0
Elseif Pinc.2 = 1 And Pinc.3 = 0 Then
Ocr1a = 0 'Giro a la derecha motor 1
Ocr1b = 140
Elseif Pinc.2 = 0 And Pinc.3 = 1 Then
Ocr1a = 140 'Giro a la izquierda motor 2
Ocr1b = 0
Else
Ocr0 = 0 'Paro motor 1
Ocr1a = 0
Ocr1b = 0 'Paro motor 2
Ocr2 = 0
End If
Goto Inicio
End
Tabla 7.2 Código Fuente control Puentes H
41
Para el correcto funcionamiento del robot fueron llevados un conjunto de procesos, los cuales
nos dieron como resultado elementos mecánicos con las correctas dimensiones y tolerancias
adecuadas, para el buen funcionamiento del sistema.
Ejes
Para los ejes utilizamos cilindros de aluminio, los cuales fueron torneados para lograr el
diámetro necesario para reducir las fricciones y tener el mejor desplazamiento de los
eslabones. La elección de este material ayudo en el proceso de barrenado y avellanado,
puesto que es un material fácil de trabajar.
Eslabones
Puesto que nuestro robot está fabricado mayormente en acrílico, los procesos de maquinado
en este mismo fueron variados. Las piezas planas fueron fácilmente maquinadas en CNC,
dándonos piezas bellamente elaboradas y sin rayaduras, a las que estaría expuesto el
acrílico al intentar cortarlo artesanalmente.
Fue necesario calentar con un pequeño soplete las láminas de acrílico para obtener
superficies cuervas, sin que este sufriera quemaduras
Pedestal lámpara
En esta sección tuvimos que cortar un tubo de ½” el cual suspendería la cámara para su
correcto funcionamiento, también se taladro para crear pequeños saltos de sujeción
42
Visión artificial
Pareciese ser la sección del sistema que mejor funciono fue el software, el sistema reconoció
los apuntadores exitosamente, y cálculo la posición de estos con éxito. Las simulaciones de
posicionamiento y accionamiento de los motores también resultaron eficientes y suficientes
para el correcto control del sistema
43
Cinemática directa
Para encontrar la cinemática directa del robot Scara se utilizo el algoritmo de Denavit-Hartenber, a
grandes rasgos, el algoritmo es una serie de pasos que nos permite en ubicar sistemas de referencia
de acuerdo a ciertas reglas. Con estos sistemas ubicados correctamente se pueden obtener los
parámetros que son de interés para el algoritmo .
Estos valores se deben sustituir en la siguiente matriz:
(1)
Donde i es el número de grados de libertad, una vez obtenidas las matrices A se multiplican y se
obtiene la matriz de transformación T de donde obtenemos la cinemática directa
(a)
0
2 0 0
0 0 0
Tabla 1. Parámetros DH del robot Scara.
44
Cinemática directa:
(b)
(c)
(d)
(e)
(f)
(g)
(h)
(i)
45
Para obtener la cinemática inversa existen dos métodos: el método geométrico y el método analítico.
El primer método utiliza la forma del robot, relaciones trigonométricas para obtener la cinemática
inversa y es empleado cuando se tienen pocos grados de libertad. El segundo método se vale de la
matriz de transformación T para obtener mediante despejes las ecuaciones de cinemática inversa. De
tal forma que:
(j)
Para nuestro Robot Scara la cinemática inversa se obtendrá mediante el método geométrico
(k)
(l)
(m)
A continuación se encuentra
(o)
Y también se calcula
(p)
46
(q)
Por último
(r)
La cinemática inversa queda representada por las ecuaciones (m), (q) y (r).
47
(s)
(t)
(u)
Lo que nos permite identificar que los puntos singulares se dan cuando
48
Diseño mecánico
Se simulo la estructura mecánica, con el objetivo de ver si existían discrepancias en las dimensiones del robot,
el video de dichas pruebas se encuentra en el Anexo A
Visión Artificial
Mediante el procesamiento de iamgenes hemos eliminado la necesidad de sensores que nos
indicaran la posicion de los motores, de este modo hemos podido crear un sistema de control, el cual
nos entrega la posicion de lso efectores un plano xy. Procesando la imagen mediante deteccion de
circulos y sus dimenciones.
49
50
Con la ayuda de Proteus pudimos simular el funcionamiento de nuestro sistema de control de los
motores, con la ayuda de un puente H, lo cual no hace ver que este tiene un funcionamiento
correcto; de este modo, teniendo la seguridad de que nuestros circuitos serán elaborados
eficientemente
51
Una característica particular de este robot y que reduce significativamente el precio del robot es la
utilización de software libre dicho de otro modo software por el cual no es necesario pagar ningún tipo
de licencias. El control del robot está basado en opencv, opencv es un conjunto de librerías de visón
artificial muy poderoso y de libre distribución. El entorno de programación es Linux, en especifico la
distribución debían, se decidió utilizar una plataforma libre siguiendo la tendencia mundial a reducir
costos de software utilizando software de licencia libre, además de que es una plataforma más
flexible.
Las materias primas que utilizamos son fáciles de obtener y existen productores nacionales que
garantizan el abasto de materiales necesario, por lo que tenemos la ventaja de que no dependamos
de proveedores extranjeros. En cuanto al material electrónico utilizamos microcontroladores de
empresas bien establecidas y conocidas (atmel y microchip), lo que nos garantiza una excelente
calidad y confiabilidad en esos componentes, todos los precios utilizados aquí son precios al
menudeo ya que se considera un volumen de producción pequeño en un principio.
El precio de la mano de obra es de $ 57.46 por ocho horas de trabajo, este es el salario mínimo
vigente en la zona geográfica A, que es la zona donde se encuentra la ciudad de México, además de
que es el salario mínimo vigente más alto en el país. Los costos de manufactura tienen un costo
adicional, ya que adquirir un CNC y un torno es una inversión muy fuerte por lo que en una primera
fase esa parte se derogara a terceros.
52
Electrónica
ATMEGA8535 1 $ 67.00 $ 67.00
LS198 4 $ 42.00 $ 168.00
PIC18F2550 1 $ 113.00 $ 113.00
Motoreductor de24 1 $ 150.00 $ 150.00
v
Minimotoreductor 1 $ 150.00 $ 150.00
Motoreductor de 5v 2 $ 50.00 $ 100.00
Webcam 1 $ 270.00 $ 270.00
Varios** - $ 300 $ 300.00
Subtotal $ 1318.00
Total materiales $ 2168.00
*Comprende los tornillos y pijas utilizados. **Comprende cables, diodos, resistencias, conectores,
placas, soldadura, sensores, entre otros***Comprende pegamentos, solventes, pinturas.
53
Mediante la Tabla dos y tres es posible determinar el costo total de producción del robot Scara
utilizando la siguiente ecuación:
Ahora bien nuestra inversión inicial está dada por la siguiente tabla
Inversión inicial
Concepto Cantidad
Mano de obra $ 6821.00
Insumos $ 2168.00
Herramientas $ 32295.00
Permisos $ 10000.00
Renta $ 2300.00
Total $ 53584.00
Tabla 12.3 Inversión inicial.
54
Año 1 2 3 4 5
Producción 120 144 172 206 247
Ventas $ 3156974.00 $ 3788369.28 $ 4524996.64 $ 5419472.72 $ 6498105.64
Utilidad $ 726104.11 $ 871324.93 $ 1040749.22 $ 1246478.72 $ 1494564.29
Tabla 12.4. Proyección a cinco años.
55
El diseño del robot requirió mejoras pues existieron problemas que en el reporte pasado
no se contemplaron, lo cual nos obligo a modificar ciertas cosas al ensamblarse el
mecanismo. Otro problema fue la iluminación en el programa que controla los motores,
pero se solucionó cambiando el formato de la imagen de RGB a HVL para evitar que nos
afectaran las variaciones de luz. En cuanto a los circuitos se buscó que fueran lo más
sencillos posibles y se optó por utilizar el AVR para superar la limitante de bits que
entrega nuestra interfaz.
González Escañuela Aldo
Luego del primer diseño se realizaron una gran cantidad de cambios, se cambio el
esquema de control y se cambio los actuadores, sin embargo el diseño fundamental
permaneció igual. El diseño del gripper significo un gran reto, al tener que partir de cero y
adecuarlo a nuestras necesidades, en cuanto a la cinemática no tuvimos mayores
problemas ya que teníamos las herramientas necesarias, tal vez la dificultad más grande
fue la visión artificial ya que es difícil obtener la iluminación adecuada para que la cámara
detecte los colores de forma adecuada. El control de los motores supuso otro reto, ya
que coordinar los motores no fue tan sencillo como se esperaba. Este proyecto implico
para todo un gran reto, trabajo en equipo y mucha inventiva para solucionar los
problemas que teníamos de último momento.
Denicia Aguilar Enrique
56
De manera general, en este semestre hemos conocido los detalles del proceso de diseño que se
sigue diariamente en la industria de la ingeniería: hemos podido comprobar que la correcta elección
de los componentes, por minúsculos que estos pudieran llegar a parecer, se ve reflejada en el
momento del ensamble, la corrección de errores y la puesta en marcha del proyecto. Probablemente
los tiempos en los que fueron llegando los diferentes estudios que se nos brindaron durante estos
meses, no son exactamente congruentes con los tiempos en los cuales se nos presenta la necesidad
de elegir algún componente, con la intención de administrar el periodo de elaboración, los recursos o
las tareas particulares que los miembros ejecutarán. Sin embargo, es un hecho que las buenas o
malas experiencias que aparecieron, nos han dejado un criterio de utilidad, para los semestres
consecuentes.
Orozco De la Vega Edgar Alexis
57
La construcción del robot me dejo una gran satisfacción personal, tuvimos que enfrentar una gran
cantidad de inconvenientes. Errores de diseño, correcciones de último minuto y problemas en la
manufactura de los ejes son algunos problemas a los que nos tuvimos que enfrentar.
Sin embargo comparado a proyectos anteriores la organización y las herramientas con que ahora
contamos hicieron más fácil enfrentarnos a esas adversidades. El control por visión artificial fue difícil
de implementar y seguimos con pruebas para mejorar su exactitud, el control de los motores implico
construir etapas de potencia y un controlador constituido por un AVR para ellos. La organización fue
un poco complicado entre otras cosas por lo numeroso del equipo y la manera de pensar de cada
quien.
Enríquez Olguín Abraham Christian
En la realización de este proyecto nos enfrentamos a GRANDES retos en áreas como: mecánica,
control, electrónica. Encontrando el mayor muro a vencer en lo mecánico debido a nuestra poca
experiencia en el maquinado de piezas mecánicas en cualquier material. Por otra parte el haber
tomado las clases de “resistencia de materiales” y “diseño de mecanismos” nos ayudo a calcular si
nuestras piezas resistían las fuerzas que en ella se aplicaban y asi tener la seguridad que las piezas
que maquinamos serian las adecuadas para nuestra aplicación.
En lo que retroalimentación de control refiere utilizamos una cámara web (algo que nunca había
utilizado), aplicando asi los conocimientos de la materia “visión artificial”, algo que reafirma e integra
los conocimientos que en la escuela adquirimos y que además entiendo es utilizado en la industria.
Para finalizar me gustaría expresar lo útil que fue este proyecto para la integración del conocimiento
de todos los integrantes del equipo ya que unos saben mas cosas que otros y al trabajar en equipo
nos dieron un poco de ese conocimiento de sobra.
Gutiérrez Cepeda Francisco Javier
58
Spong, W. Mark, Hutchinson, Seth y Vidyasagar, M. Robot Modeling and Control. John Wiley & Sons,
2005.
Bradsky Gary y Kaeble Adrian, Learnin Open cv: Computer Vision with the Opencv Library.
O’Reilly,2008.
59