Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INGENIERIA EN ELECTRONICA
PROBLEMA DE INGENIERA
TECNICAS DIGITALES III
BRAZO ROBTICO
- COMPLEMENTO Integrantes:
- Puppo, Marcelo Nicols
Docentes:
- Profesor: Ing. Felipe Poblete - Auxiliar: Ing. Mariano Gonzlez
AO 2008
INDICE
OBJETIVOS DEL TRABAJO 3
INTRODUCCIN......................................................................................................................... 7 TEORA DE FUNCIONAMIENTO .............................................................................................. 7 DIAGRAMA DE FLUJO: ............................................................................................................ 12 RESULTADOS DE LAS PRUEBAS ........................................................................................... 13 CONCLUSIONES........................................................................................................................ 13 ANEXOS: 14
LISTADOS DE PROGRAMAS ................................................................................................... 14 LIBRERIAS Y FUNCIONES UTILIZADAS ............................................................................... 32 Archivos cabecera (Libreras): ...................................................................................................... 32 Funciones creadas:........................................................................................................................ 32 FOTOS DE PANTALLA ............................................................................................................. 33
MATERIAS INTEGRADAS
Informtica 2. (Programacin C++) Anlisis matemtico (coordenadas rectangulares/polares, trigonometra) Fsica (movimiento rectilneo/curvilneo)
POSIBLES APLICACIONES
Depsito para almacenar distintos tipos de piezas (bultos). Visualizacin de un campo de trabajo con distintos elementos en l. Seguimiento de piezas en un rea establecida. rea donde se necesite reubicar las piezas (bultos) ingresados. Registro (Historial) de ingreso y movimiento de cada pieza (bulto).
BIBLIOGRAFA
Apuntes de ctedra: Informtica 2. Fsica. Anlisis matemtico.
DESARROLLO
Al comenzar el problema de ingeniera desarroll un soft prototipo utilizando Turbo C++ Versin 3.0 para observar en pantalla la ubicacin de las piezas y conseguir un seguimiento de las mismas. La eleccin de Turbo C++ como herramienta de trabajo se debi a que la interfaz brazo-PC corra bajo este entorno. Debido a los inconvenientes que inutilizaron el brazo robtico, la integracin del soft prototipo con el brazo no se hizo posible, por lo que opt por descartar ste y realizar un nuevo soft que simulara todo, tambin usando Turbo C. De esta forma llegu al software final, que no slo simula la mecnica tomando en cuenta el comportamiento de los motores paso a paso, sino que tambin presenta una interfaz grfica ms real, dinmica, representativa y amena. Para alcanzar este objetivo, fue necesario utilizar una librera grfica, que lleva la programacin de aplicaciones en Turbo C a un nivel superior. A continuacin se presentan ambos software aunque slo se detalla el funcionamiento del software final. Soft prototipo:
INTRODUCCIN
Se recibe una serie de piezas que deben ser ubicadas en un sitio de almacenaje de rea semicircular y radio 200m. La playa de almacenamiento contiene un sector de carga (200; 0) donde llegan los bultos y se encuentra dividida en un sector de almacenaje para piezas tipo A y un sector de almacenaje para piezas tipo B. Se pueden almacenar 2 tipos de piezas o bultos diferentes, cada uno en un rea distinta del sitio de almacenaje y correspondiente a los de su tipo, sin poder ubicarse una pieza tipo A en el rea de las piezas tipo B y viceversa. Una vez ubicados todos los bultos, se procede a la reubicacin, la cual permite cambiar de posicin cualquiera de las piezas existentes en la totalidad de la playa de almacenamiento sin restricciones. La reubicacin de las piezas se logra a partir del ingreso de nuevas coordenadas ingresadas. En el presente software, no slo se ve la trayectoria que trazaba la mquina (curvilnea) sino tambin la mejora introducida gracias a la cual la pieza se mueve de la posicin de inicio a la de destino trazando una lnea recta.
TEORA DE FUNCIONAMIENTO
El proyecto consiste en un programa realizado en lenguaje C++ que consta de 6 etapas: 1. Registro: se crea un archivo .txt que se completar con los ingresos y todos los movimientos de las piezas. La primera vez que se ejecuta el programa, se crea este archivo y se va completando a medida que se ingresan piezas o se realizan movimientos en detalle con la fecha y hora de cualquier operacin realizada. Ejemplo de escritura en el archivo historial: TIPO: a - COORDENADAS POLARES: ( 60 ; 60 ) - FECHA: Tue Dec 16 17:57:33 2008 LA PIEZA a SE MOVIO DE: ( 60 ; 60 ) A: ( 100 ; 40 ) - FECHA: Tue Dec 16 17:57:59 2008 TIPO: b - COORDENADAS POLARES: ( 120 ; 120 ) - FECHA: Thu Aug 20 20:54:50 2009 LA PIEZA b SE MOVIO DE: ( 120 ; 120 ) A: ( 200 ; 45 ) - FECHA: Thu Aug 20 20:55:24 2009 LA PIEZA b SE MOVIO DE: ( 200 ; 45 ) A: ( 100 ; 60 ) - FECHA: Thu Aug 20 20:55:24 2009
Las prximas veces que se ejecuta el programa, se abre el archivo existente y se completa a continuacin de la ltima lnea. El archivo de texto creado puede leerse en cualquier momento con cualquier procesador de texto para llevar un control o verificar el historial de movimientos e ingresos, fechas y ubicaciones. 2. Carga de datos: se recibe por teclado la cantidad de piezas, el tipo de pieza (A o B) y la ubicacin en coordenadas polares que tendrn stas dentro de un rea de almacenaje. A partir de estos datos, el brazo robtico ubica las piezas en sus lugares correspondientes. El tiempo que demora el brazo en buscar una pieza desde el sector de ingreso y colocarla en la posicin que se desea est simulado y corresponde a una funcin que genera un delay de unos 8 segundos. Se muestran en pantalla los datos referentes a cada pieza y se representan los diferentes tipos mediante dos crculos de color rojo (pieza tipo A) y azul (pieza tipo B). Una vez finalizado el almacenaje, las mismas pueden observarse distribuidas dentro del rea de trabajo. Se permite al usuario volver a cargar nuevas piezas a almacenar, si as lo desea. En caso contrario se procede a la prxima etapa. 3. Movimiento de los elementos existentes: pueden reubicarse las piezas de a una por vez, en cualquier ubicacin, seleccionndolas por orden de ingreso y dndoles las nuevas coordenadas. En esta instancia cualquier pieza puede ubicarse en cualquier lugar sin importar que el tipo de pieza concuerde con el rea preestablecida para las de su tipo. As, por ejemplo, una pieza tipo A ingresada con coordenadas (150; 50) en el sector para las de su clase, puede moverse a cualquier ubicacin (80; 120), incluso si sta pertenece al sector para las piezas tipo B. 4. Clculos y datos para los movimientos: en esta etapa se realizan los clculos necesarios para que el movimiento de la pieza desde su posicin original a la posicin de destino sea en lnea recta, o lo ms linealmente posible. Adems de los clculos representativos de la situacin real, en la cual la trayectoria de m ovimiento describa un arco, se realizan los clculos para solucionar esto de manera que el movimiento sea recto. Ambas trazas se calculan y se visualizan en pantalla al mover una pieza para poder compararlas.
Trayectoria curvilnea (REAL): A partir de las coordenadas en que se haya la pieza y las coordenadas de destino ingresadas, se realizan las diferencias de mdulo y ngulo: Dif Long: (Long origen Long destino) Dif Ang: (Ang origen Ang destino)
Estas diferencias son un indicador de cunto debe moverse la pieza para llegar al destino. Debido a que el programa fue diseado para funcionar en conjunto con el proyecto brazo robtico, hay que adaptar los clculos a los condicionamientos del mismo. El brazo posee dos motores paso a paso, uno que gobierna el movimiento a lo largo del mismo (LONGITUD) y otro el movimiento angular (NGULO). motor 1: encargado del movimiento angular (0_180): Desplazamiento angular: 200 pasos ---------- 360 (1 giro) 1.8 x paso
Tcnicas Digitales III Problema de ingeniera 180 100 pasos. motor 2: encargado del movimiento radial (0_200): Desplazamiento angular: 48 pasos ---------- 360 (1 giro) 7.5 x paso 48 pasos ---------------- (long 1mm) 1 paso 0.02083 mm. A partir de estos datos se conoce la cantidad de pasos necesarios que tendr que realizar cada motor para llevar la pieza en cuestin al destino propuesto. Para lograrlo, las diferencias de mdulo y ngulo obtenidas anteriormente se traducen a pasos de motor 1 y motor 2. Si la cantidad de pasos que debe realizar uno de los motores es positiva el motor girar en un sentido y si sta es negativa lo har en sentido opuesto. En el caso de que alguna de las diferencias sea 0, slo trabajar uno de los motores debido a que la distancia o el ngulo de destino coincidir con el de origen. Por ejemplo, mover una pieza desde (50; 30) a (120; 30) o mover otra desde (70; 160) a (70; 40). Para que el movimiento de la pieza sea lo ms lineal posible se alterna el funcionamiento entre los motores. Para esto, se busca una relacin entre la cantidad de pasos que deben realizar el motor 1 y el 2. La relacin se obtiene de dividir la mayor de las cantidades de pasos de uno de los motores sobre la menor: Rel: Cant mayor de pasos_ Cant menor de pasos El nmero obtenido indica que por cada paso que deba realizar el motor cuya cantidad de pasos sea menor, el otro motor debe realizar una cantidad x de pasos, donde x es igual a la relacin que se obtuvo. De esta manera, se alternan los pasos entre los motores para lograr una aproximacin ms directa y ms lineal de la pieza desde la posicin original hacia la de destino. En caso de que la menor cantidad de pasos sea 0, la relacin se supone 1 (porque no se puede dividir por cero) y slo uno de los motores realizar movimiento. Esta etapa es la ms importante ya que en ella se obtienen los datos que necesitar el PIC que comanda los movimientos de ambos motores.
Trayectoria rectilnea (IDEAL): Para lograr que el desplazamiento de la pieza sea sobre una recta hay que tener en cuenta el ngulo que forma la posicin de origen (donde se halla la pieza) con la de destino, el problema es que este ngulo no est referenciado al sistema sobre el que se mueve el brazo, por lo que es desconocido y hay que calcularlo. Como los datos con los que se cuenta son las coordenadas polares correspondientes a la posicin de origen y la de destino, hay que transformar stas a coordenadas rectangulares:
Como ejemplo, se realizan los clculos a partir del grfico anterior. A partir de las posiciones de origen y destino de una pieza, cuyas coordenadas polares son conocidas (; 1) y (; 2), stas se convierten a coordena das rectangulares utilizando l s siguientes relaciones a trigonomtricas: Cos = x1 1 Sen = y1 1 Cos = x2 2 Sen = y2 2
Una vez obtenidos los pares de coordenadas rectangulares (x1; y1) y (x2; y2), se procede al clculo del ngulo . ste es de extrema importancia y debe ser respetado a medida que la pieza avanza si se desea que la trayectoria sea en lnea recta. Para su clculo:
Tang = (y2 y1) (x2 x1) Para lograr que la ficha describa una trayectoria recta, el soft realiza incrementos sobre el eje de las abscisas a partir de la posicin de inicio y calcula la altura correspondiente a este incremento respetando el ngulo calculado anteriormente:
10
As, para los incrementos (p1, p2, p3.) y sus correspondientes alturas (o1, o2, o3.) la sucesin de puntos calculados formarn una recta que sirve de gua para el trayecto de la ficha. Cuando se usan las funciones trigonomtricas en Turbo C++, hay que tener la precaucin de hacer una conversin del ngulo de sexagesimal a radianes. 5. Grficos de trayectoria lineal y curvilnea: en esta etapa se muestra en pantalla cmo la pieza seleccionada llega a destino. A partir de los clculos efectuados con anterioridad, se plasman puntos que representan la posicin de la ficha a medida que se va moviendo. Para poder observar y controlar la velocidad con que la pieza se desplaza, las funciones a cargo de los movimientos exigen que se presione una tecla, antes de completar el movimiento. De esta forma, la persona puede corroborar que la ficha se est movi ndo correctamente. Las e trayectorias (rectilnea y curvilnea) se grafican con distinto color. Una vez que ambas trayectorias (real e ideal) llegan al destino, se coloca la ficha en ese punto eliminando la que se encontraba en la posicin de inicio. 6. Guardado en archivo historial y fin de ejecucin: los movimientos efectuados con anterioridad se registran en el archivo de texto creado/abierto al inicio de la ejecucin del soft. En l se guardan la pieza seleccionada, su ubicacin original y la nueva, junto con la fecha y hora correspondientes al movimiento de la pieza. Por ltimo, el soft da la posibilidad de realizar otros movimientos cerrando la aplicacin en caso de que no se desee efectuar ms cambios.
11
DIAGRAMA DE FLUJO:
CREA/ABRE ARCHIVO .TXT HABILITA DRIVERS VIDEO GRAFICA FONDO DE PANTALLA
CANT. DE ELEMENTOS
SI
ELECCION PIEZA A MOVER DESTINO CALCULO PASOS DE MOTOR CALCULO Y GRAFICA TRAYECTORIA RECTA CALCULO Y GRAFICA TRAYECTORIA CURVA ESC. EN ARCHIVO EL MOVIMIENTO SI
MOVER OTRA?
12
CONCLUSIONES
I. El hecho de que para determinados movimientos la trayectoria de la pieza no sea una lnea recta se debe a que la relacin entre las cantidades de pasos se redondea matemticamente, por lo que al no ser exacta genera no linealidad. Otra razn es que los motores tienen entre s diferente cantidad de engranes, diferente cantidad de pasos y relaciones distintas. Para un ptimo movimiento en lnea recta desde un origen a un destino, se deberan usar motores con igual cantidad de pasos y con una relacin de uno. Otra forma de realizar una trayectoria en lnea recta, que es la presentada como solucin al problema de ingeniera, consiste en calcular la sucesin de puntos que conforman la recta que une los puntos de inicio y destino. La ubicacin de estos puntos se puede obtener fcilmente calculando trigonomtricamente el ngulo que forma la lnea de trayectoria con la horizontal y mantenindolo a medida que se recorre la recta hasta llegar al destino. La ubicacin de cada uno de estos puntos, que c onsiste en coordenadas rectangulares, se transformar a coordenadas polares y luego a sus equivalentes pasos de motor para que la PC transmita y que la pieza se desplace en lnea recta.
II.
III.
La implementacin del software final se logr luego de varias pruebas y una amplia investigacin acerca de la librera y herramientas graficas que posee Borland C++ versin 3.0. Sin la utilizacin de las mismas, el desarrollo de un soft que trate de representar grficamente movimientos en tiempo real no resultara simblico y carecera de sentido.
13
ANEXOS:
LISTADOS DE PROGRAMAS
Programa prototipo:
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<dos.h> #include<string.h> #include <time.h> zona(); int ubicacion(int r,int t,char c,int x, int y); datos(); main() { int cant,i; int dato1[20],dato2[20]; char tipo[20]; char datos[40]; int coord[40]; int xo,yo; int f,g,p; int k=0,l=0; int n=0,m=8,x,y,w,h; char c,q; char nom[20]; FILE *fp; time_t timer; struct tm *tblock; clrscr(); fp=fopen("archivo.txt","r"); if (fp==NULL) { printf("NO SE ENCONUENTRA ARCHIVO.TXT - SERA CREADO .\n"); fp=fopen("archivo.txt","w"); } else { fp=fopen("archivo.txt","a"); } getch(); flushall(); clrscr(); //printf("cant elementos :\n"); //scanf("%d",&cant); zona(); do { // zona();
14
15
do{ gotoxy(1,35); cprintf("DESEA REALIZAR OTRO INGRESO ? S/N: "); q=getchar(); }while((q!='n')&&(q!='s')); if(q=='n') w=0; if(q=='s') w=1; for(h=24;h<40;h++) { gotoxy(1,h);clreol(); } }while(w==1); gotoxy(1,23); printf("\n ELEMENTOS CARGADOS:\n"); for(i=0;i<=k-1;i++) { printf("%d: %c - %d - %d\n",i+1,datos[i],coord[i*2],coord[i*2+1]); } do { do{ printf("INDIQUE EL NUMERO DE LA PIEZA A MOVER:");
16
);
printf("INDIQUE LA POSICION DE DESTINO:"); scanf("%d",&x); scanf("%d",&y); i=p-1; c=datos[i]; xo=coord[i*2]; yo=coord[i*2+1]; /* nuevas coordenadas */ coord[i*2]=x; coord[i*2+1]=y; gotoxy(50-xo,22-yo); textbackground(0); textcolor(1+128); if(c=='a') { cprintf("-"); } if(c=='b') { textcolor(4+128); cprintf(""); } delay(5000); //aca espero q llegue la pieza al destino gotoxy(50-xo,22-yo); textbackground(0); textcolor(7); cprintf(""); gotoxy(50-x,22-y); //posicion final textcolor(1); if(c=='a') { cprintf("-"); } if(c=='b') { textcolor(4); cprintf(""); } textbackground(0); textcolor(7); do{ gotoxy(1,35); cprintf("\nDESEA MOVER OTRA PIEZA ? S/N: "); q=getchar(); }while((q!='n')&&(q!='s')); if(q=='n') w=0; if(q=='s') w=1; }while(w==1);
17
fclose(fp); getch(); return(0); } //--------------------FIN DE PROGRAMA-------------------------------// zona() { int i,j; textbackground(0); textcolor(7); for(j=0;j<20;j++) { for(i=0;i<40;i++) { gotoxy(10+i,2+j); cprintf(""); } } textbackground(0); textcolor(9); gotoxy(8,2);printf("20"); gotoxy(8,12);printf("10"); gotoxy(9,22);printf("40"); gotoxy(41,22);printf("9"); gotoxy(55,4);printf("CLASE A: "); textcolor(1);cprintf("-"); gotoxy(55,5);printf("CLASE B: "); textcolor(4);cprintf(""); textbackground(0); textcolor(7); return 0; }
int ubicacion(int r,int t,char c,int xo,int yo) { int vec[20],k; int tiempo=30000; vec[r]=xo; vec[r+1]=yo; textbackground(15); textcolor(9); gotoxy(55,7);cprintf("CLASE / UBICACION"); gotoxy(55,t);cprintf(" "); gotoxy(57,t);cprintf(" %c : %d %d",c,vec[r],vec[r+1]); gotoxy(50-xo,22-yo); textbackground(0); textcolor(1+128); if(c=='a') { cprintf("-"); } if(c=='b') { textcolor(4+128); cprintf(""); }
18
Programa final:
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<dos.h> #include<string.h> #include<time.h> #include<graphics.h> #include<math.h> #include<alloc.h> int graficar(void); int zona(void); int ubicacion(int r,int t,char c,double x, double y,void far *buf[100],int pos); void salvar_pantalla(void far *buf[100],double xo,double yo,int pos); void reestablecer_pantalla(void far *buf[100],double xo,double yo,int pos);
main() { int cant,i; double dato1[20],dato2[20]; char tipo[20]; char datos[40]; double coord[40]; double xo,yo; double lon,ang,ang2; int p; double f,g; double hypaux,g2,f2,yaux,ff,gf,angf,ginter,ginter2; int k=0,l=0; int n=0,m=3; int w,h; double x,y; int v; void far *ptr[100]; int pp=0; char c,q; char nom[20]; FILE *fp; double alfa,alfa2,x1,y1,x2,y2,p1=0,o1=0; time_t timer; struct tm *tblock;
19
outtextxy(10,260, "CANTIDAD DE ELEMENTOS: "); gotoxy(30,17); scanf("%d",&cant); for(i=0;i<=cant-1;i++) { do { highvideo(); textbackground(0);textcolor(7); setfillstyle(EMPTY_FILL, getmaxcolor()); bar3d(0,250, getmaxx(), getmaxy(), 0, 1); pantalla */ /* como clreol() */ /* para la mitad de la
outtextxy(10,275,"SELECCIONE LA CLASE: (A) O (B) gotoxy(40,18);c=getchar(); } while((c!='a')&&(c!='b')); flushall(); tipo[i]=c; datos[k]=c; k++; if(c=='a') { do {
");
setfillstyle(EMPTY_FILL, getmaxcolor()); // como clreol() bar3d(0,250, getmaxx(), getmaxy(), 0, 1); // para la mitad inferiror de la pantalla
20
} while( (lon<=0)||(lon>=201)||(ang<=0)||(ang>=91) ); dato1[i]=lon; dato2[i]=ang; coord[l]=lon; l++; coord[l]=ang; l++; } if(c=='b') { do { setfillstyle(EMPTY_FILL, getmaxcolor()); bar3d(0,250, getmaxx(), getmaxy(), 0, 1); pantalla outtextxy(10,290, "COORDENADAS:"); outtextxy(10,300,"B: 0 < long < 200 flushall(); gotoxy(40,20); scanf("%lf",&lon); gotoxy(40,21); scanf("%lf",&ang); // como clreol() // para la mitad de la
for(i=0;i<=cant-1;i++) { c=tipo[i]; x=dato1[i]; y=dato2[i]; /* escribe en el archivo de texto el tipo y coordenadas de la pieza fprintf(fp,"TIPO: %c - COORDENADAS POLARES: ( %0.0lf ; %0.0lf )",c,x,y); /* toma la hora y la guarda en un puntero *timer */ timer = time(NULL); /* convierte fecha/hora a una estructura */ tblock = localtime(&timer); */
21
do{ outtextxy(10,435, "DESEA REALIZAR OTRO INGRESO ? S/N: "); gotoxy(40,28); q=getchar(); }while((q!='n')&&(q!='s')); if(q=='n') w=0; if(q=='s') w=1; setfillstyle(EMPTY_FILL, getmaxcolor()); bar3d(0,250, getmaxx(), getmaxy(),0, 1); pantalla */ /* como clreol() */ /* para la mitad de la
}while(w==1);
outtextxy(10,260, " ELEMENTOS CARGADOS: CONTINUIAR... "); for(i=0;i<=k-1;i++) { gotoxy(23,18+i); printf("%d: %c - %0.0lf %0.0lf\n",i+1,datos[i],coord[i*2],coord[i*2+1]); outtextxy(450,20, "N"); gotoxy(58,3+i);printf("%d",i+1); } getch(); do{ do{ setfillstyle(EMPTY_FILL, getmaxcolor());
/* como clreol()
*/
22
outtextxy(10,275, " INDIQUE EL NUMERO DE LA PIEZA A MOVER:"); gotoxy(45,18);scanf("%d",&p); }while( ( p <=0 )||( p>k ) ) ;
i=p-1; c=datos[i]; xo=coord[i*2]; yo=coord[i*2+1]; /* nuevas coordenadas */ coord[i*2]=x; coord[i*2+1]=y; /*calculos de pasos que cada motor debe realizar*/ setfillstyle(EMPTY_FILL, getmaxcolor()); bar3d(450,250,getmaxx(), getmaxy(), 0, 1); outtextxy(460,260,"PASOS DE CADA MOTOR:"); outtextxy(460,275,"LONG: 1mm ------ 48p"); //1 vuelta del motor es 1 milim outtextxy(460,285,"ANG: 180 ------ 100p");//1 vuelta del motor son 200 pasos outtextxy(460,308,"DIF LONG: "); gotoxy(70,20);printf("%0.0lf ",xo-x); outtextxy(460,325," 200 ------ 48px200"); gotoxy(60,22);printf("%0.0lf ------ %0.0lf",xo-x,(xo-x)*48*200/200); pasos_long= (xo-x)*48*200/200; outtextxy(460,357,"DIF ANG: "); gotoxy(70,23);printf("%0.0lf ",yo-y); outtextxy(460,374," 180 ------ 100p"); gotoxy(60,25);printf("%0.0lf ------ %0.0lf",yo-y,(yo-y)*100/180); pasos_ang= (yo-y)*100/180;
/*Calculo ideal para trayectoria recta*/ alfa= (yo*M_PI)/180; x1= xo * cos (alfa); y1= xo * sin (alfa); alfa= (y*M_PI)/180; x2= x * cos(alfa); y2= x * sin(alfa); p1=0; //sexag a rads
if((x2>=x1)&&(y2>=y1)) {
23
/*Relacion entre pasos de los motores de Long y Angulo*/ if(fabs(pasos_long) > fabs(pasos_ang) ) { pasos=1; if(pasos_ang ==0) { relacion=1; } else { relacion= pasos_long / pasos_ang ; } } if( fabs(pasos_long) < fabs(pasos_ang) ) { pasos=0;
24
/*redondeo de la relacion*/ fraccion = modf(relacion, &integer); fraccion = fraccion*10; if( (( fraccion > 5)&&(fraccion >0)) || (( fraccion >= -5)&&(fraccion ) { relacion = ceil(relacion); } if( (( fraccion <= 5)&&(fraccion >0)) || (( fraccion < -5)&&(fraccion ) { relacion = floor(relacion); } if(pasos==0) { if((pasos_long == 0)&&(pasos_ang > 0)) { pl=0; do { ang2= ((yo-pa*1.8)*M_PI)/180; f= (xo-pl*0.021) * cos(ang2) ; g= (xo-pl*0.021) * sin(ang2) ; putpixel(230+f, 220-g, 13); getch(); outtextxy(460,420,"Datos al pic: "); gotoxy(60,28); printf("Lon:%dp Ang:%dp",pl,pa); gotoxy(60,29); printf("Rel:%5.1lf",relacion); pa=pa+relacion; // pl=pl+1; }while(pa<=pasos_ang); } if((pasos_long == 0) && (pasos_ang < 0)) { pl=0; do { ang2= ((yo-pa*1.8)*M_PI)/180; f= (xo-pl*0.021) * cos(ang2) ; g= (xo-pl*0.021) * sin(ang2) ; putpixel(230+f, 220-g, 13); getch(); outtextxy(460,420,"Datos al pic: "); gotoxy(60,28); printf("Lon:%dp Ang:%dp",pl,pa); gotoxy(60,29); printf("Rel:%5.1lf",relacion); pa=pa-relacion; // pl=pl-1;
<0))
<0))
25
26
if(pasos==1) { pa=0; pl=0; if((pasos_long > 0)&&(pasos_ang == 0)) { do { ang2= ((yo-pa*1.8)*M_PI)/180; f= (xo-pl*0.021) * cos(ang2) ; g= (xo-pl*0.021) * sin(ang2) ; putpixel(230+f, 220-g, 13); getch(); outtextxy(460,420,"Datos al pic: "); gotoxy(60,28); printf("Lon:%dp Ang:%dp",pl,pa); gotoxy(60,29); printf("Rel:%5.1lf",relacion); pl=pl+relacion; // pa=pa+1; }while(pl<=pasos_long); } if((pasos_long < 0) && (pasos_ang == 0)) /*50,30 a 100.70*/ { pl=0; do { ang2= ((yo-pa*1.8)*M_PI)/180; f= (xo-pl*0.021) * cos(ang2) ; g= (xo-pl*0.021) * sin(ang2) ; putpixel(230+f, 220-g, 13); getch(); outtextxy(460,420,"Datos al pic: "); gotoxy(60,28); printf("Lon:%dp Ang:%dp",pl,pa); gotoxy(60,29); printf("Rel:%5.1lf",relacion); pl=pl-relacion; // pa=pa-1; }while(pl>=pasos_long); } if((pasos_long > 0) && (pasos_ang > 0)) /*100.80 a 50.70*/ { do { pl=pl+relacion; pa=pa+1; ang2= ((yo-pa*1.8)*M_PI)/180; f= (xo-pl*0.021) * cos(ang2) ; g= (xo-pl*0.021) * sin(ang2) ; putpixel(230+f, 220-g, 13); getch(); outtextxy(460,420,"Datos al pic: "); gotoxy(60,28); printf("Lon:%dp Ang:%dp",pl,pa);
27
do { pl=pl-relacion; pa=pa-1; ang2= ((yo-pa*1.8)*M_PI)/180; f= (xo-pl*0.021) * cos(ang2) ; g= (xo-pl*0.021) * sin(ang2) ; putpixel(230+f, 220-g, 13); getch(); outtextxy(460,420,"Datos al pic: "); gotoxy(60,28); printf("Lon:%dp Ang:%dp",pl,pa); gotoxy(60,29); printf("Rel:%5.1lf",relacion); }while(pa>=pasos_ang); } if((pasos_long < 0) && (pasos_ang > 0)) /*50.80 a 100.70 { do { pl=pl+relacion; pa=pa+1; ang2= ((yo-pa*1.8)*M_PI)/180; f= (xo-pl*0.021) * cos(ang2) ; g= (xo-pl*0.021) * sin(ang2) ; putpixel(230+f, 220-g, 13); getch(); outtextxy(460,420,"Datos al pic: "); gotoxy(60,28); printf("Lon:%dp Ang:%dp",pl,pa); gotoxy(60,29); printf("Rel:%5.1lf",relacion); }while(pa<=pasos_ang); } if((pasos_long > 0) && (pasos_ang < 0)) { */
/*100.70 a 50.80*/
do { pl=pl-relacion; pa=pa-1; ang2= ((yo-pa*1.8)*M_PI)/180; f= (xo-pl*0.021) * cos(ang2) ; g= (xo-pl*0.021) * sin(ang2) ; putpixel(230+f, 220-g, 13); getch(); outtextxy(460,420,"Datos al pic: "); gotoxy(60,28); printf("Lon:%dp Ang:%dp",pl,pa); gotoxy(60,29); printf("Rel:%5.1lf",relacion); }while(pa>=pasos_ang); } } /* escribe en el archivo de texto el movimiento de la pieza */ fprintf(fp,"LA PIEZA %c SE MOVIO DE: ( %0.0lf ; %0.0lf ) A: ( %0.0lf ; %0.0lf ) ",c,xo,yo,x,y); /* toma la hora y la guarda en un puntero *timer */ timer = time(NULL);
28
reestablecer_pantalla(ptr,xo,yo,i); /* reestablece la pntalla */ getch(); reestablecer_pantalla(ptr,xo,yo,i); /* reestablece la pantalla */ //delay(8000); /* aca espero q llegue la pieza al destino */
ang2= (y*M_PI)/180; f= x * cos(ang2) ; g= x * sin(ang2) ; x=f; y=g; line(230+xo,220-yo,230+x,220-y); /* dibuja una linea de trayectoria */
if(c=='a') { salvar_pantalla(ptr,x,y,i); /* guarda la actual pantalla */ setfillstyle(SOLID_FILL, 4); circle(230+x,220-y,5); floodfill(230+x,220-y, getmaxcolor()); } if(c=='b') { salvar_pantalla(ptr,x,y,i); /* guarda la actual pantalla */ setfillstyle(SOLID_FILL, 1); circle(230+x,220-y,5); floodfill(230+x,220-y, getmaxcolor()); }
do{ outtextxy(10,385," DESEA MOVER OTRA PIEZA ? S/N:"); gotoxy(45,25); q=getchar(); }while((q!='n')&&(q!='s')); if(q=='n') if(q=='s') }while(w==1); w=0; w=1;
fclose(fp);
/*
*/
29
/*---------------------- FIN DE PROGRAMA-------------------------*/ int graficar(void) { /* pedido auto deteccion */ int gdriver = DETECT, gmode, errorcode; /* inicializa modo grafico, variables locales */ initgraph(&gdriver, &gmode, "d:\\marce\\tc\\bgi"); /* lee resultado de inicializacion */ errorcode = graphresult(); if (errorcode != grOk) /* ocurrio un error */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); /* termina con codigo de error */ } return(0); } int zona(void) { int i; setfillstyle(EMPTY_FILL, getmaxcolor()); bar3d(0,0, getmaxx(), getmaxy(), 10, 1); bar3d(0,250,getmaxx(), getmaxy(), 0, 1); setfillstyle(SOLID_FILL, 8); bar(420,210,430,220); setfillstyle(SOLID_FILL, 2); pieslice(230, 220, 0, 180, 10); setfillstyle(EMPTY_FILL, 2); for(i=2;i<=20;i++) { pieslice(230, 220, 0, 180, 10*i); } line(230,220,230,20); outtextxy(400,230, "(200;0)"); outtextxy(210,230, "(0;0)"); outtextxy(10,230, "(200;180)"); outtextxy(210,10, "(200;90)"); outtextxy(10,20, "CLASE A:"); outtextxy(10,40, "CLASE B:"); setfillstyle(SOLID_FILL, 4); circle(90,23,5); circle(90,43,5); floodfill(90, 23, getmaxcolor()); setfillstyle(SOLID_FILL, 1); floodfill(90, 43, getmaxcolor());
30
salvar_pantalla(ptr,xo,yo,pos); circle(230+xo,220-yo,5); // //
delay(8000); /* aca espero q llegue la pieza, es el tiempo q tarda el brazo */ if(c=='a') { setfillstyle(SOLID_FILL, 4); circle(230+xo,220-yo,5); floodfill(230+xo,220-yo, getmaxcolor()); } if(c=='b') { setfillstyle(SOLID_FILL, 1); circle(230+xo,220-yo,5); floodfill(230+xo,220-yo, getmaxcolor()); }
return 0; } void salvar_pantalla(void far *buf[100],double xo,double yo,int pos) { unsigned int size; /* calcula el tamao de la imagen */ size = imagesize(100,110 ,110,120); /* toma el tamao de la imagen en bytes */ if ((buf[pos] = farmalloc(size)) == NULL) { closegraph(); printf("Error: no hay espacio suficiente en memoria.\n"); exit(1); } /* toma la imagen de la pantalla a la memoria */
31
void reestablecer_pantalla(void far *buf[100],double xo,double yo,int pos) { putimage(230+xo-5,220-yo-5 , buf[pos], COPY_PUT); farfree(buf[pos]); }
Funciones creadas:
int graficar(void); Inicializa el modo grfico cargando el driver que corresponde a la placa de video de la PC. int zona(void); Crea los grficos en la pantalla sobre los cuales se va a trabajar. int ubicacion(int r,int t,char c,double x, double y,void far *buf[100],int pos); A partir de los parmetros que recibe, esta funcin grafica en las coordenadas supuestas un circulo azul o rojo. Previamente guarda la imagen de fondo en esa posicin. void salvar_pantalla(void far *buf[100],double xo,double yo,int pos); Calcula el tamao de la imagen a guardar, toma una copia de la misma en las coordenadas deseadas y la guarda en memoria. A continuacin, borra de pantalla el rea correspondiente que se almacen en memoria. void reestablecer_pantalla(void far *buf[100],double xo,double yo,int pos); Pone la imagen previamente salvada en memoria de nuevo en la pantalla y libera el bloque de memoria que la almacenaba.
32
FOTOS DE PANTALLA
Para obtener fotos de pantalla utilic Microsoft virtual PC debido a que el uso de la librera grfica en Turbo C y las funciones correspondientes a la deteccin de los drivers de video e inicializacin del modo grfico se apoderan del control de la pantalla imposibilitando el uso de las aplicaciones (print screen) del sistema operativo (Windows 98/XP) sobre el cual corre el programa escrito en cdigo C++. Programa prototipo:
Pantalla principal: se observa el rea para ubicar las piezas, la referencia para identificar las piezas (A o B) y la cantidad a ingresar.
33
Elementos displayados en el r ea de almacenamiento y sus res pectivas coordenadas. Coordenadas de destino para la pieza que se va a reubicar.
34
Corresponde historial).
al
inicio
del
prog rama
por
primera
vez
(creacin
del
archivo
35
36
37
Movimiento de pieza seleccionada. Los datos que se ven corresponden a los pasos que cada motor debera realizar alternadamente para mover la pieza y depositarla en su nueva ubicacin. A continuacin se ven las trayectorias recta (verde) y la curva (magenta):
38
39
El destino de la ficha es el mismo tanto para la trayectoria curva como para la rectilnea.
40
Trayectoria ideal: lnea recta. Trayectoria real: Arco en puntos. La pieza clase B lleg a destino.
41
Archivo de texto creado (archivo4.txt) en el cual se observa un registro de los elementos que ingresaron a la playa, junto a sus coordenadas y la fecha de ingreso, as como el movimiento de los mismos.
42