
Entrega 2 Proyecto Sistemas Embebidos
main.cpp
- Committer:
- andriuxone
- Date:
- 2019-04-26
- Revision:
- 0:4b10df072322
File content as of revision 0:4b10df072322:
#include "mbed.h" #include "scolor_TCS3200.h" /***************************************************************************** generar un programa que controle por el puerto serial el grado de 4 servo motores. por medio de la comunicacion serial el comando es | | | | | INITCMD | N_motor | N_grados | | 0xff | 0x01- 0x04 | 0x00 - 0xb4 | *****************************************************************************/ /*CONSTANTES*/ #define INITCMD 0xFF #define DEGREES_MAX 180 /*TELECOMANDO*/ #define AUTOMATIC 0x01 #define PINZA 0x02 #define M1_MANUAL 0x03 #define M2_MANUAL 0x04 #define M3_MANUAL 0x05 #define M4_MANUAL 0x06 #define VELOCIDAD 0x07 #define JOYSTICK 0x08 #define COLOR 0x09 /*PARAMETRO*/ #define HOME 0x01 #define MATERIAL 0x02 #define CELDA1 0x03 #define CELDA2 0x04 #define CELDA3 0x05 #define CELDA4 0x06 #define ABRIR_PINZA 0x01 #define CERRAR_PINZA 0x02 #define VELOCIDAD_LENTA 0x01 #define VELOCIDAD_MEDIA 0x02 #define VELOCIDAD_ALTA 0x03 #define INICIA_JOYSTICK 0x01 #define PARA_JOYSTICK 0x02 #define LEE_COLOR 0x00 /*VARIABLES GLOBALES*/ uint8_t N_motor; // variable almacena el número de motor en leer_datos() uint8_t N_grados; // varable almacena los grados que se mueve el motor en leer_datos() /*VARIABLE RECIBE COMANDOS*/ /*Mueve Base y Eslabon Izquierdo*/ Serial pc(USBTX, USBRX); unsigned char telecomando; unsigned char parametro; unsigned char teleJoys; unsigned char paramJoys; /*CONFIGURACIÓN SERVOS*/ PwmOut myservo1(PB_4);//d5 -- BASE PwmOut myservo2(PB_10);//d6 -- IZQUIERDO PwmOut myservo3(PA_8);//d7 -- DERECHO PwmOut myservo4(PA_9);//d8 -- PINZA /*CONFIGURACIÓN JOYSTICK 1*/ /*Mueve Base y Eslabon Izquierdo*/ AnalogIn analog1_value_x(A0);//A0 -- POSICION X -- BASE AnalogIn analog1_value_y(A1);//A1 -- POSICION Y -- ESLABON INZQUIERDO /*Mueve Eslabon Derecho y Pinza*/ AnalogIn analog2_value_x(A2);//A2 -- POSICION X -- ESLABON DERECHO AnalogIn analog2_value_y(A3); DigitalIn sw2(PB_6);//D10 -- BOTON JOYSTICK -- 0-ABRE PINZA , 1-CIERRA PINZA /*CONFIGURACION SENSOR DE COLOR*/ // S0, S1, S2, S3, OUT //scolor_TCS3200 scolor(PA_8, PB_10, PB_9, PB_5, PB_8); // D2 D3 D14 D4 D15 scolor_TCS3200 scolor(PA_10, PB_3, PB_9, PB_5, PB_8); /*DEFINICIÓN FUNCIONES*/ void setup_uart(); void setup_servo(); void mover_servo(uint8_t motor, uint8_t gradss); uint32_t degrees2usec(uint8_t grados); void motor_velocidad(uint8_t motor, float valor); //MOVIMIENTO ESLABONES POR POSICION void mover_base(int posicion); void mover_izquierdo(int posicion); void mover_derecho(int posicion); void mover_pinza(int posicion); void mover_home(); void mover_material(); void mover_celda1(); void mover_celda2(); void mover_celda3(); void mover_celda4(); void abrir_pinza(); void cerrar_pinza(); void mover_servo(uint8_t motor, uint8_t pos); void mover_con_joystick(); void leer_color(); /*INICIO DE PROGRAMA*/ int main() { pc.printf("INICIO PROGRAMA...\n\r"); setup_uart();//Configuración Velocidad de Transmisión setup_servo();//Configuración de Motores -> periodo = 20 ms while(1){ pc.printf("\nEsperando Telecomando...\n"); while(pc.getc() != INITCMD);//0xFF telecomando = pc.getc(); parametro= pc.getc(); pc.printf("Validando Telecomando: "); pc.printf("%02x",telecomando);pc.printf("\n"); if(telecomando == AUTOMATIC) { pc.printf("MOVIMIENTO AUTOMATICO\n"); pc.printf("Validando Parametro: "); pc.printf("%02x",parametro); switch (parametro) { case HOME: pc.printf("\nHOME..\n"); mover_home(); NVIC_SystemReset(); break; case MATERIAL: pc.printf("\nMATERIAL.\n"); mover_material(); NVIC_SystemReset(); break; case CELDA1: pc.printf("\nCELDA1.\n"); mover_celda1(); NVIC_SystemReset(); break; case CELDA2: pc.printf("\nCELDA2.\n"); mover_celda2(); NVIC_SystemReset(); break; case CELDA3: pc.printf("\nCELDA3.\n"); mover_celda3(); NVIC_SystemReset(); break; case CELDA4: pc.printf("\nCELDA4.\n"); mover_celda4(); NVIC_SystemReset(); break; default: pc.printf("No se encontro parametro valido.\n"); break ; }//Fin Switch }else if(telecomando == PINZA){ pc.printf("PINZA\n"); pc.printf("Validando Parametro: "); pc.printf("%02x",parametro); switch (parametro) { case ABRIR_PINZA: pc.printf("\nABRE PINZA..\n"); abrir_pinza(); break; case CERRAR_PINZA: pc.printf("\nCIERRA PINZA..\n"); cerrar_pinza(); break; default: pc.printf("No se encontro comando valido.\n"); break ; }//Fin Switch }else if(telecomando == M1_MANUAL){ pc.printf("M1_MANUAL\n"); pc.printf("Validando Parametro: "); pc.printf("%02x",parametro); mover_servo(telecomando, parametro); }else if(telecomando == M2_MANUAL){ pc.printf("M2_MANUAL\n"); pc.printf("Validando Parametro: "); pc.printf("%02x",parametro); mover_servo(telecomando, parametro); }else if(telecomando == M3_MANUAL){ pc.printf("M3_MANUAL\n"); pc.printf("Validando Parametro: "); pc.printf("%02x",parametro); mover_servo(telecomando, parametro); }else if(telecomando == M4_MANUAL){ pc.printf("M4_MANUAL\n"); pc.printf("Validando Parametro: "); pc.printf("%02x",parametro); mover_servo(telecomando, parametro); }else if(telecomando == VELOCIDAD){ pc.printf("VELOCIDAD\n"); pc.printf("Validando Parametro: "); pc.printf("%02x",parametro); switch (parametro) { case VELOCIDAD_LENTA: pc.printf("\nVELOCIDAD_LENTA..\n"); break; case VELOCIDAD_MEDIA: pc.printf("\nVELOCIDAD_MEDIA..\n"); break; case VELOCIDAD_ALTA: pc.printf("\nVELOCIDAD_ALTA..\n"); break; default: pc.printf("No se encontro comando valido.\n"); break ; }//Fin Switch }else if(telecomando == JOYSTICK){ pc.printf("JOYSTICK\n"); pc.printf("Validando Parametro: "); pc.printf("%02x",parametro); switch (parametro) { case INICIA_JOYSTICK: pc.printf("\nINICIA_JOYSTICK ..\n"); mover_con_joystick(); break; case PARA_JOYSTICK: pc.printf("\nPARA_JOYSTICK..\n"); break; default: pc.printf("No se encontro comando valido.\n"); break ; }//Fin Switch }else if(telecomando == COLOR){ pc.printf("COLOR\n"); leer_color(); }else { pc.printf("Telecomando No Encontrado...\n"); }//Fin Validación Telecomando }//Fin While }// Fin main /*CONFIGURA VELOCIDAD DE TRAMSMISIÓN*/ void setup_uart() { pc.baud(9600); } /*CONFIGURACIÓN DE SERVOS*/ void setup_servo() { myservo1.period_ms(20); myservo2.period_ms(20); myservo3.period_ms(20); myservo4.period_ms(20); } //MOVER BASE void mover_base(int posicion) { myservo1.pulsewidth_us(posicion); } // //MOVER IZQUIERDO void mover_izquierdo(int posicion) { myservo2.pulsewidth_us(posicion); } //MOVER DERECHO void mover_derecho(int posicion) { myservo3.pulsewidth_us(posicion); } //MOVER PINZA void mover_pinza(int posicion) { myservo4.pulsewidth_us(posicion); } //MUEVE A POSICIÓN HOME void mover_home() { myservo1.pulsewidth_us(600); wait(1.0); myservo2.pulsewidth_us(600); wait(1.0); myservo3.pulsewidth_us(600); wait(1.0); } //MUEVE A POSICIÓN MATERIAL void mover_material() { myservo1.pulsewidth_us(700); wait(1.0); myservo2.pulsewidth_us(650); wait(1.0); myservo3.pulsewidth_us(630); wait(1.0); } //MUEVE A POSICIÓN CELDA1 void mover_celda1() { myservo1.pulsewidth_us(800); wait(1.0); myservo2.pulsewidth_us(700); wait(1.0); myservo3.pulsewidth_us(660); wait(1.0); } //MUEVE A POSICIÓN CELDA2 void mover_celda2() { myservo1.pulsewidth_us(900); wait(1.0); myservo2.pulsewidth_us(750); wait(1.0); myservo3.pulsewidth_us(690); wait(1.0); } //MUEVE A POSICIÓN CELDA3 void mover_celda3() { myservo1.pulsewidth_us(1000); wait(1.0); myservo2.pulsewidth_us(770); wait(1.0); myservo3.pulsewidth_us(720); wait(1.0); } //MUEVE A POSICIÓN CELDA4 void mover_celda4() { myservo1.pulsewidth_us(1100); wait(1.0); myservo2.pulsewidth_us(780); wait(1.0); myservo3.pulsewidth_us(750); wait(1.0); } //ABRE PINZA void abrir_pinza() { myservo4.pulsewidth_us(600); } //CIERRA PINZA void cerrar_pinza() { myservo4.pulsewidth_us(900); } // Mover Servo con posicion void mover_servo(uint8_t motor, uint8_t pos){ int position = degrees2usec(pos); switch (motor) { case 0x01: myservo1.pulsewidth_us(position); break; case 0x02: myservo2.pulsewidth_us(position); break; case 0x03: myservo3.pulsewidth_us(position); break; case 0x04: myservo4.pulsewidth_us(position); break; default: break; } } /*CONVERTIR GRADOS A SEGUNDOS*/ uint32_t degrees2usec(uint8_t grados) { // Retorna el valor en microsegundos, donde // y − y1 = m(x − x1 ) // y= b + mx if(grados <= DEGREES_MAX) return int(750+grados*1900/180);// u6 return 750; } /*MOVIMIENTOS CON JOYSTICK*/ void mover_con_joystick(){ double base = 0.0; double izquierdo = 0.0; double derecho = 0.0; int posBase=600; int posIzquierdo=600; int posDerecho=600; while(1){ base = analog1_value_x.read() * 3.3; izquierdo = analog1_value_y.read() * 3.3; derecho= analog2_value_x.read() * 3.3; //Valida Joystick 1 en X - base if (base < 2.0){ posBase= posBase+3; mover_base(posBase); } else if(base > 3.0){ posBase= posBase-3; mover_base(posBase); } //Valida Joystick 1 en Y - Izquierdo if (izquierdo < 2){ posIzquierdo= posIzquierdo+3; mover_izquierdo(posIzquierdo); } else if(izquierdo > 3){ posIzquierdo= posIzquierdo-13; mover_izquierdo(posIzquierdo); } //Valida Joystic 2 en X - Derecho if (derecho < 2){ posDerecho= posDerecho+3; mover_derecho(posDerecho); } else if(derecho > 3){ posDerecho= posDerecho-3; mover_derecho(posDerecho); } if(sw2.read() == 0){ cerrar_pinza(); } else if(sw2.read() == 1){ abrir_pinza(); } } } //LECTURA DE COLOR void leer_color(){ long red; long green; long blue; long clear; red = scolor.ReadRed(); green = scolor.ReadGreen(); blue = scolor.ReadBlue(); clear = scolor.ReadClear(); if (red < 100 && green<100 && blue<100){ pc.printf("COLOR LEIDO: CLARO\n"); pc.printf("%#04x","04"); pc.printf("\n"); }else if (blue<100){ pc.printf("COLOR LEIDO: AZUL\n"); pc.printf("%#04x","02"); pc.printf("\n"); }else if (red < 100){ pc.printf("COLOR LEIDO: ROJO\n"); pc.printf("%#04x","01"); pc.printf("\n"); }else if (red > 100 && green>100 && blue>100 && red < 140 && green<140 && blue<140){ pc.printf("COLOR LEIDO: VERDE\n"); pc.printf("%#04x","03"); pc.printf("\n"); } pc.printf("RED: %5d GREEN: %5d BLUE: %5d CLEAR: %5d \n ", red, green, blue, clear); }