Se leen comando por el puerto serial realiza las siguientes funciones según el comando: - Genera distintos tonos por un buzzer. - Controla el movimiento de un carro (con 2 motores) con comandos - Controla el movimiento de un carro (con 2 motores) con Joystick. - Lee y envía el color leido por el puerto serial al PC
Diff: main.cpp
- Revision:
- 0:3a37f6734913
diff -r 000000000000 -r 3a37f6734913 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Sep 03 05:22:19 2021 +0000 @@ -0,0 +1,458 @@ +#include "mbed.h" +#include "Motor.h" +#include "scolor_TCS3200.h" + +// Puerto de comunicacion Serial +Serial CoolTerm(USBTX, USBRX); + +// Motores m1step +TraccionD Motores(PB_5, PB_3, PB_10, PB_4, 200, 3.75, 15.5) ; + +/// PWM OUTPUTS +PwmOut Buzzer(D10); // LED1 + +// Temporizadores +Ticker MuestrearCOLOR; + +// SENSOR DE COLOR +scolor_TCS3200 SENSOR_COLOR (PA_9, PC_7, PB_6, PA_7, PA_8); + + +// Lecturas Analogas de Joystick +AnalogIn JEjeX(A0); +AnalogIn JEjeY(A1); + + +// Salidas digitales +DigitalOut LED(PA_5); + + +//****************************************************************************** +/// Declarar Variables Globales + + +/// Variables sensor de color +long red; //Almacenan el Tiempo que dura el CicloUtil de la frecuencia +long blue; //Generada por el Sensor TSC3200, al leer el componente +long green; //R, G, B o Clear del color que tenga en Frente +long clear; + + +/// Constantes Sensor de Color +#define CMD_rojo 0x01 +#define CMD_azul 0x02 +#define CMD_verde 0x03 +#define CMD_clear 0x04 +#define ColorNoIdentificado 0x00 + + +uint8_t color_identificado = ColorNoIdentificado; + + + +/// Varialbles Buzzer +uint8_t duracion_tono = 1; // Variable que almacena el Tiempo que es ESCUCHARÁ el Tono +uint8_t tipo_tono = 1; // Variable que almacena el Tono que se desee escuchar + +/// Constantes Buzzer +#define TONO_DO 0x01 /// si tipo_tono == 0x01, se escuchará un DO +#define TONO_RE 0x02 /// si tipo_tono == 0x02, se escuchará un RE +#define TONO_MI 0x03 /// si tipo_tono == 0x03, se escuchará un MI +#define TONO_SI 0x04 /// si tipo_tono == 0x04, se escuchará un SI + +#define DO 3.78 /// Duración del periodo en ms, que se pondrá en el Buzzer.period_ms() PARA ESCUCHAR UN DO +#define RE 3.36 /// Duración del periodo en ms, que se pondrá en el Buzzer.period_ms() PARA ESCUCHAR UN RE +#define MI 3.03 /// Duración del periodo en ms, que se pondrá en el Buzzer.period_ms() PARA ESCUCHAR UN MI +#define SI 2.82 /// Duración del periodo en ms, que se pondrá en el Buzzer.period_ms() PARA ESCUCHAR UN SI + + + + +#define limite 0.727 + +// variables de control y flujo de programa + +uint8_t programa_ejecutar = 0; // Variable que almacena la ORDEN (Telemetria ó Telecomando) + // enviada desde el CoolTerm +uint8_t coolterm_data; // Se almacenan Todos los Caracteres recividos por el CoolTerm. + + +// Constantes de velocidad + +#define VelAlta 300 +#define VelMedia 200 +#define VelBaja 100 + + +//****************************************************************************** +// COMANDOS + +#define iniciar_telemetria 0xFE +#define iniciar_telecomando 0xFF + +#define telemetria_1 0x01 // +#define telemcomando_1 0x01 + +#define C_LeerColor 0x00 +#define C_Sonido1 0x01 +#define C_Sonido2 0x02 +#define C_Sonido3 0x03 +#define C_Sonido4 0x04 +#define C_Adelante 0x05 +#define C_Atras 0x06 +#define C_Izquierda 0x07 +#define C_Derecha 0x08 +#define C_Velocidad 0x09 +#define C_Joistck 0x0A +int comando_joystick = 0; + + +// variables y constantes del Joystick + +uint8_t estado_x; +uint8_t estado_y; +#define E_Derecha 1 +#define E_Izquier 0 +#define E_Adelante 1 +#define E_Atras 0 +#define E_Centro 3 +#define Lim_JKIn 150 +#define Lim_JKSup 180 + +//**************************************************************************** +// Prototipo de funciones + +void ReadPort(void); // Lee el puerto Serial +void MainConfig(void); // Configuracion Inicial de los Perifericos del uC +void Buzzer_Tone(uint8_t tipo_tono, uint8_t duracion_tono); // configura el tono y la duracion escuchada a travez del Buzzer +void leer_color(void); // funcion que retorna los componentes + // RGB y Clear del color leido +void leer_Joystick(); // Ejerce control sobre el Movimiento del carro desde el Joistick + +//**************************************************************************** +// +#define valorInicial 0xAA +uint8_t n_interrupcion = 0; +uint8_t ComandoRecivido = valorInicial, Parametro = valorInicial; + +void ReadPort() +{ + + //if(CoolTerm.writable()) CoolTerm.abort_write(); // ELIMINA LO QUE ESTEMOS ESCRIBIENDO AL COOLTERM + + if (n_interrupcion == 0) { coolterm_data = CoolTerm.getc(); } + if (n_interrupcion == 1) { ComandoRecivido = CoolTerm.getc(); n_interrupcion++; } + if (n_interrupcion == 2) { Parametro = CoolTerm.getc(); n_interrupcion = 0;} + if (coolterm_data == iniciar_telecomando) { programa_ejecutar = iniciar_telecomando; n_interrupcion++; } + if (ComandoRecivido == 0x0A) comando_joystick = 0; // Da valores diferentes al inicial de cada variable + +} + +///******************************************+ + + +void leer_Joystick() +{ + +/// Variables Joystick +float EjeX; +float EjeY; +float Vx; +float Vy; + + while (comando_joystick == 1) // + { + + EjeX = JEjeX.read(); + Vx = EjeX * 3300; + wait (0.1); + EjeY = JEjeY.read(); + Vy = EjeY * 3300; + +// CoolTerm.printf ("ejex: %f ejey: %f Vx: %f Vy: %f \n ", EjeX, EjeY, Vx, Vy); + + if(int(Vx/10) > Lim_JKIn && int(Vx/10) < Lim_JKSup) {estado_x = E_Centro; }//(CoolTerm.printf ("Estado X Centro \n"); } + if(int(Vy/10) > Lim_JKIn && int(Vy/10) < Lim_JKSup) {estado_y = E_Centro; }//CoolTerm.printf ("Estado Y Centro \n"); } + + if(int(Vx/10) > Lim_JKSup && estado_y == E_Centro){ estado_x = E_Izquier; }// CoolTerm.printf ("Estado X Izquierda\n"); } + if(int(Vy/10) > Lim_JKSup && estado_x == E_Centro){ estado_y = E_Atras; }// CoolTerm.printf ("Estado Y Adelante\n"); } + + if(int(Vx/10) < Lim_JKIn && estado_y == E_Centro){ estado_x = E_Derecha; } //CoolTerm.printf ("Estado X Derecha\n"); } + if(int(Vy/10) < Lim_JKIn && estado_x == E_Centro){ estado_y = E_Adelante; } //CoolTerm.printf ("Estado Y Atras\n"); } + + + // CoolTerm.printf ("\n\n X = %d Y = %d \n",estado_x , estado_y); + // wait(2); + // Combinacion de estados para STOP + if( estado_x == E_Centro && estado_y == E_Centro){ Motores.Stop(); CoolTerm.printf ("MOTORES STOP\n"); } + + // Combinacion de estados para ADELANTE + if(estado_x == E_Centro && estado_y == E_Adelante) { Motores.Back(); Motores.Run(1);CoolTerm.printf ("MOTORES BACK\n"); } + + // Combinacion de estados para ATRAS + if(estado_x == E_Centro && estado_y == E_Atras) { Motores.Forward(); Motores.Run(1);CoolTerm.printf ("MOTORES FORWARD\n"); } + + + // Combinacion de estados para DERECHA + if(estado_y == E_Centro && estado_x == E_Derecha) { Motores.Giro(15, false); Motores.Run(1); CoolTerm.printf ("MOTORES DERECHA\n"); } + + // Combinacion de estados para IZQUIERDA + if(estado_y == E_Centro && estado_x == E_Izquier) { Motores.Giro(15, true); Motores.Run(1); CoolTerm.printf ("MOTORES IZQUIERDA\n"); } + //wait(1.5); +} + comando_joystick = 0; + +} + + +int main() { + + Buzzer.write(0); ///configura el ciclo util + Motores.StepFreq(VelMedia); + CoolTerm.attach(&ReadPort, Serial::RxIrq); //// se Habilita la interrupcion serial o recepcion de datos + //MuestrearCOLOR.attach(&leer_color, 0.6); + + //CoolTerm.printf("Hello World, System Run !!\n"); // mensaje inicial + //leer_Joystick (); + + while(1) + { + + + /// Espera hasta recivir OxFF + while(programa_ejecutar != iniciar_telecomando)wait(0.01); + + /// Espera hasta que reciva algo diferente de 0xAA + while(ComandoRecivido == valorInicial)wait(0.01); + + /// Espera hasta que reciva algo diferente de 0xAA + while(Parametro == valorInicial)wait(0.01); + + + //// Desactivamos la interrupcion serial o recepcion de datos PORQUE NO NECESITAMOS recibir mas datos por AHORA + CoolTerm.attach(NULL, Serial::RxIrq); + + switch(ComandoRecivido) + { + + //case C_LeerColor: // Ejecutamos la Funcion LeerColor(); + // leer_color(); + //break; + case C_Sonido1: //CoolTerm.printf("SONIDO 1\n"); + duracion_tono = Parametro; // lo almacenamos en: duracion_tono + tipo_tono = TONO_DO; + Buzzer_Tone(tipo_tono, duracion_tono); + break; + case C_Sonido2: //CoolTerm.printf("SONIDO 2\n"); + duracion_tono = Parametro; // lo almacenamos en: duracion_tono + tipo_tono = TONO_RE; + Buzzer_Tone(tipo_tono, duracion_tono); + break; + case C_Sonido3: //CoolTerm.printf("SONIDO 3\n"); + duracion_tono = Parametro; // lo almacenamos en: duracion_tono + tipo_tono = TONO_MI; + Buzzer_Tone(tipo_tono, duracion_tono); + break; + case C_Sonido4: //CoolTerm.printf("SONIDO 4\n"); + duracion_tono = Parametro; // lo almacenamos en: duracion_tono + tipo_tono = TONO_SI; + Buzzer_Tone(tipo_tono, duracion_tono); + break; + case C_Adelante: Motores.Forward(); Motores.RunRound(Parametro); + break; + case C_Atras: Motores.Back(); Motores.RunRound(Parametro); + break; + case C_Izquierda: Motores.Giro(65, true); + break; + case C_Derecha: Motores.Giro(65, false); + break; + case C_Velocidad: if(Parametro == 0x01)Motores.StepFreq(VelBaja); + if(Parametro == 0x02)Motores.StepFreq(VelMedia); + if(Parametro == 0x03)Motores.StepFreq(VelAlta); + break; + case C_Joistck: comando_joystick = 1; leer_Joystick(); + break; + default: break; + + + } + + //CoolTerm.printf("ProgramaFinalizado!!\n"); + + // Re inicializamos nuestras variables de control a sus valores iniciales + // Para no seguir entrando a las sentencias IF + programa_ejecutar = 0; coolterm_data = 0; + ComandoRecivido = valorInicial; Parametro = valorInicial; + //// HABILITAMOS NUEVAMENTE la interrupcion serial o recepcion de datos + CoolTerm.attach(&ReadPort, Serial::RxIrq); + + } + +} + + + +void Buzzer_Tone(uint8_t tipo_tono, uint8_t duracion_tono) + { + + + switch (tipo_tono) + { + + case TONO_DO: Buzzer.period_ms(DO); + //CoolTerm.printf("Tono Seleccionado DO!!\n"); + + break; // salimos del SWITCH + + case TONO_RE: Buzzer.period_ms(RE); + //CoolTerm.printf("Tono Seleccionado RE!!\n"); + + break; // salimos del SWITCH + + case TONO_MI: Buzzer.period_ms(MI); + //CoolTerm.printf("Tono Seleccionado MI!!\n"); + + break; // salimos del SWITCH + + case TONO_SI: Buzzer.period_ms(SI); + //CoolTerm.printf("Tono Seleccionado SI!!\n"); + + break; // salimos del SWITCH + + // si no fue ninguno de los valores anteriores entonces: + default: //CoolTerm.printf("teleComando desconocido, inicie nuevamente !!\n"); + + break; // salimos del SWITCH + + } + // COMO EL CICLO UTIL DEL BUZZER ESTABA EN 0, POR LO CUAL NO SONABA + // SE PONE AL 50% DEL PERIODO + Buzzer.write(0.5); + // SE ESPERA DURANTE EN TIEMPO INGRESADO (EN SEGUNDOS ) + wait(duracion_tono); + + // Se Reinicializa el Periodo y el Ciclo útil de la señal PWM + // que va al Buzzer + Buzzer.period_ms(1); + Buzzer.write(0); + + + + } + + + +void leer_color() + { + + red = SENSOR_COLOR.ReadRed(); // OBTENEMOS EL TIEMPO DEL CICLO UTIL DE LA FRECUENCIA DE SALIDA + green = SENSOR_COLOR.ReadGreen(); + blue = SENSOR_COLOR.ReadBlue(); + clear = SENSOR_COLOR.ReadClear(); + + //printf("RED: %5d GREEN: %5d BLUE: %5d CLEAR: %5d \n ", red, green, blue, clear); + + red *= 2; // Calculamos EL PERIODO de la frecuencia generada por la lectura del fotodiodo rojo + blue *= 2; // Calculamos EL PERIODO de la frecuencia generada por la lectura del fotodiodo rojo + green *= 2; // Calculamos EL PERIODO de la frecuencia generada por la lectura del fotodiodo rojo + clear *= 2; // Calculamos EL PERIODO de la frecuencia generada por la lectura del fotodiodo rojo + + //printf("RED: %5d GREEN: %5d BLUE: %5d CLEAR: %5d \n ", red, green, blue, clear); + + + ////////////////////////////////////////////////////////////// + //// identificar azul + + + if(red <=42 && red >=24) + { + if(green >= 20 && green <= 28 ) + { + if(blue >= 10 && blue <= 16) + { + color_identificado = CMD_azul; + CoolTerm.putc( iniciar_telemetria); + CoolTerm.putc( CMD_azul ); + //Buzzer.period_ms(DO); + //Buzzer.write(0.5); + //wait(4); + //Buzzer.write(0); + + } + } + } + + + + + ///////////////////////////////////////////////////////////// + /// identificar rojo + if(red <= 12 ) + { + if(green >= 10 && green <= 28 ) + { + if(blue >= 18 && blue <= 24) + { + color_identificado = CMD_rojo; + CoolTerm.putc( iniciar_telemetria); + CoolTerm.putc( CMD_rojo ); + //Buzzer.period_ms(RE); + //Buzzer.write(0.5); //PERIODO UTIL + //wait(4); //TIEMPO ACTIVO DEL BUZZER + //Buzzer.write(0.0); + } + } + + if(green < 10 && green >= 6 ) + { + if(blue <= 12 ) + { + color_identificado = CMD_clear; + CoolTerm.putc( iniciar_telemetria); + CoolTerm.putc( CMD_clear ); + //Buzzer.period_ms(MI); + //Buzzer.write(0.5); + //wait(4); + //Buzzer.write(0); + } + + } + + } + + + if(green >= 36 && green <= 44 ) + { + if(red >= 40 && red <= 50 ) + + { + color_identificado = CMD_verde; + CoolTerm.putc( iniciar_telemetria); + CoolTerm.putc( CMD_verde ); + //Buzzer.period_ms(SI); + //Buzzer.write(0.5); + //wait(4); + //Buzzer.write(0); + + + } + } + + if (color_identificado == ColorNoIdentificado) + { + + + CoolTerm.putc( iniciar_telemetria); + CoolTerm.putc( ColorNoIdentificado); + //Buzzer.period_ms(10); + //Buzzer.write(0.5); + //wait(4); + //Buzzer.write(0); + + + } + + color_identificado = ColorNoIdentificado; + } + +