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

Dependencies:   mbed

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;
+        }
+
+