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

Files at this revision

API Documentation at this revision

Comitter:
CCastrop1012
Date:
Fri Sep 03 05:22:19 2021 +0000
Commit message:
Programa finalizado y funcional.

Changed in this revision

Motor.cpp Show annotated file Show diff for this revision Revisions of this file
Motor.h Show annotated file Show diff for this revision Revisions of this file
corregido.txt Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
scolor_TCS3200.cpp Show annotated file Show diff for this revision Revisions of this file
scolor_TCS3200.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Motor.cpp	Fri Sep 03 05:22:19 2021 +0000
@@ -0,0 +1,180 @@
+#include "mbed.h"
+#include "Motor.h"
+#include "Ticker.h"
+
+#define Pi 3.14159265
+#define Horario         1
+#define AntiHorario     0
+
+///************  MOTOR CONTINUO ********************************//
+
+/// CONSTRUCTOR
+MotorContinuo::MotorContinuo(PinName _L1, PinName _L2, PinName _speedPin, PinName _encodin, PinName _PosInicial, int _EncodPulses) :
+L1(_L1), L2(_L2), speedPin(_speedPin), encodin(_encodin), PosInicial(_PosInicial), EncodPulses(_EncodPulses)
+{
+    speedPin.period_ms(2);
+    speedPin.write(0);
+    
+};
+
+
+
+void MotorContinuo::Forward()   { L1=1;  L2=0;}
+void MotorContinuo::Back()      { L1=0;  L2=1;}
+void MotorContinuo::Stop()      { L1=0;  L2=0;}
+void MotorContinuo::StopT()     { L1=1;  L2=1;}
+void MotorContinuo::SpeedDuty(int v) { speedPin.write(float(v/100.0));}
+void MotorContinuo::SpinLength_ms(float t)    { t++;}// Duración del giro en ms
+void MotorContinuo::SpinLength(float t)       { t++;};
+    
+    
+
+///************  MOTOR DISCRETO ********************************//    
+
+/// CONSTRUCTOR
+MotorDiscreto::MotorDiscreto(PinName _Dir, PinName _Step, int _NPasos, PinName _encodin, PinName _PosInicial, int _EncodPulses) :
+Dir(_Dir), Step(_Step), NPasos(_NPasos), encodin(_encodin), PosInicial(_PosInicial), EncodPulses(_EncodPulses)
+{
+};    
+ 
+ 
+ // *************   METODOS ***************** ///
+    
+void MotorDiscreto::moveMotor(void)  
+    {
+        if (StepOnHold != 0 && _moveMotorStopped == false) 
+            {
+                Step = !Step; // Se hace elcambio de estado en el pin Step
+                entradas++; // se registra cada paso efectivo el cual es valido cada 2 entradas 
+                            // 1ra entrada: tiempo en Bajo
+                            // 2da entrada: tiempo en Alto
+                            // Es decir cuando Step cumple un periodo.
+                if (entradas >= 2) // cuando se registran 2 entradas se disminuye un paso
+                {
+                    StepOnHold--; // Se elimina 1 paso de los pendientes
+                    entradas = 0; 
+                }
+                
+                Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); // Reiniciamos el tiempo de imterrupcion
+                
+            }
+        else if (StepOnHold == 0 || _moveMotorStopped == true) // si no hay mas pasos pendientes
+            {
+                Move.detach(); // desabilita la interrupcion
+                entradas = 0;
+            }
+    }
+
+
+void MotorDiscreto::Forward()   { Dir=1;}
+void MotorDiscreto::Back()      { Dir=0;}
+void MotorDiscreto::Stop()      { EnablePin = 0; _moveMotorStopped = true;}
+void MotorDiscreto::StopT()     { Move.detach(); _moveMotorStopped = true;}
+void MotorDiscreto::StepFreq(long n) { StepsBySecond = n; TStep = (1/float(n));}
+void MotorDiscreto::RunStep(long n) { StepOnHold = n; Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; }// Duración del giro en ms
+void MotorDiscreto::Run(float t)    { float Fp = (1/TStep); StepOnHold = long(t*Fp); Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; }
+void MotorDiscreto::RunRound(int n) { StepOnHold = (NPasos * n); Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; }
+long MotorDiscreto::getStepOnHold(void){return StepOnHold; }
+
+void Ustep(int resolucion, DigitalOut* _M0, DigitalOut* _M1, DigitalOut* _M2)
+    {
+        
+        switch(resolucion)
+        {
+            case 1: *_M0 = 0; *_M1 = 0; *_M2 = 0;
+                    break;
+            case 2: *_M0 = 1; *_M1 = 0; *_M2 = 0;
+                    break;
+            case 4: *_M0 = 0; *_M1 = 1; *_M2 = 0;
+                    break; 
+            case 8: *_M0 = 1; *_M1 = 1; *_M2 = 1;
+                    break;
+            case 16: *_M0 = 0; *_M1 = 0; *_M2 = 1;
+                    break;
+            case 32: *_M0 = 1; *_M1 = 0; *_M2 = 1;
+                    break;
+        
+            default: *_M0 = 0; *_M1 = 0; *_M2 = 0;
+        
+        
+        }
+    
+    
+    }
+
+      
+///************  TRACCIONDISCRETA ********************************//    
+
+
+/// ***************** CONSTRUCTOR ********************** ///
+TraccionD::TraccionD(PinName _StepMI, PinName _DirMI, PinName _StepMD, PinName _DirMD, int _NPasos, float _r, float _L ):
+                    StepMI(_StepMI), DirMI(_DirMI), StepMD(_StepMD), DirMD(_DirMD), NPasos(_NPasos), r(_r), L(_L)
+    {
+        // 1. se halla la Relacion(Rl) de distacia entre los dos Radios(r y L)
+            Rl  = (L / r); 
+            
+        };
+
+ // *************   METODOS ***************** ///
+
+void TraccionD::moveMotor(void)  
+    {
+        if (StepOnHold != 0) 
+            {
+            
+                
+                StepMI = !StepMI; // Se hace elcambio de estado en el pin Step para ambos motores
+                StepMD =  StepMI; 
+                
+                entradas++; // se registra cada paso efectivo el cual es valido cada 2 entradas 
+                            // 1ra entrada: tiempo en Bajo
+                            // 2da entrada: tiempo en Alto
+                            // Es decir cuando Step cumple un periodo.
+                if (entradas >= 2) // cuando se registran 2 entradas se disminuye un paso
+                {
+                    StepOnHold--; // Se elimina 1 paso de los pendientes
+                    entradas = 0; 
+                }
+                
+                Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); // Reiniciamos el tiempo de imterrupcion
+                
+            }
+        else if (StepOnHold == 0) // si no hay mas pasos para dar se deshabilita las interrupciones.
+            {
+                Move.detach(); 
+            }
+    }
+
+
+void TraccionD::Forward()   { DirMI=1; DirMD=1;} // Configua de giro de ambos motores el el mismo sentido para avanzar hacia adelante
+void TraccionD::Back()      { DirMI=0; DirMD=0;} // Configua el sentido giro en ambos motores contrario al de Forward(), para avanzar hacia atras
+void TraccionD::Left()      { DirMI=0; DirMD=1;} // Configura el sentido de giro de ambos motores de manera contraria para girar hacia la izquierda
+void TraccionD::Right()     { DirMI=1; DirMD=0;} // Configura el sentido de giro de ambos motores de manera contraria e inverso al de Left() para girar hacia la derecha
+void TraccionD::Stop()      { EnablePinM1 = 0; EnablePinM2 = 0;}
+void TraccionD::StopT()     { Move.detach();}
+void TraccionD::StepFreq(long n) { StepsBySecond = n; TStep = (1/float(n));}
+void TraccionD::RunStep(long n){ StepOnHold = n; Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); }// Duración del giro en ms
+void TraccionD::Run(float t)    { float Fp = (1/TStep); StepOnHold = long(t*Fp); Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); }
+void TraccionD::RunRound(int n) { StepOnHold = (NPasos * n); Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); }
+long TraccionD::getStepOnHold(void){return StepOnHold; }
+
+void TraccionD::Giro(long grados, bool sentido)     
+{ 
+    
+    StepOnHold = grados * int(Rl * NPasos);
+    StepOnHold /= 360; 
+    if(sentido == true) Right(); else if (sentido == false) Left();
+    Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) );
+
+}
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Motor.h	Fri Sep 03 05:22:19 2021 +0000
@@ -0,0 +1,160 @@
+#ifndef Motor_H
+#define Motor_H
+#include "mbed.h"
+ /* **************************************************************************
+ 
+@CCastrop
+cristiank.castrop@ecci.edu.co
+
+    L1      Terminal A del motor
+    L2      Terminal B del motor
+    SpeedPin Pin de salida PWM
+    
+ LastVersion: 21 - Abril - 2019  7:45pm
+******************************************************************************/
+
+
+class MotorContinuo {
+  public:
+    /// Constructores para Motores Continuos
+    MotorContinuo(PinName _L1, PinName _L2, PinName _speedPin, PinName _encodin, PinName _PosInicial, int _EncodPulses);
+    
+    void Forward();     // Da un sentido de giro al motor
+    void Back();        // Genera un sentido de giro contrario al de Forward
+    void Stop();        // Detiene el motor dejando el movimiento libre
+    void StopT();       // Detiene el motor truncando o enclavando el movimiento(Lo mantiene quieto).
+    void SpeedDuty(int v);   // Varia la velocidad de giro del motor de 0 a 100%
+    void SpinLength_ms(float t);  // Duración del giro en ms
+    void SpinLength(float t);  // Duración del giro
+    
+  private:
+
+    DigitalOut L1;
+    DigitalOut L2;
+    PwmOut     speedPin;
+    DigitalIn  encodin;
+    DigitalIn  PosInicial;
+    int EncodPulses;
+
+
+    
+
+};
+
+
+class MotorDiscreto {
+  public:
+    /// Constructores para Motores Continuos
+    MotorDiscreto(PinName _Dir, PinName _Step, int _NPasos, PinName _encodin, PinName _PosInicial, int _EncodPulses);
+      
+    MotorDiscreto(void);    
+    
+    void Forward();                 // Da un sentido de giro al motor
+    void Back();                    // Genera un sentido de giro contrario al de Forward
+    void Stop();                    // Detiene el motor dejando el movimiento libre. Pin Enable = 0
+    void StopT();                   // Detiene el motor truncando o enclavando el movimiento(Lo mantiene quieto).
+    void StepFreq(long n);           // Configura la Velocidad en Número(n) de pasos por segundos. Es decir la Frecuencia de paso.
+    void RunStep(long n);           // Se mueve el motor la cantidad de pasos ingresada
+    void Run(float t);              // Gira el motor durante el tiempo ingresado, si es 0 indefinidamente hasta llamada a Stop().
+    void RunRound(int n);           // Girar n vueltas
+    void Ustep(int resolucion, PinName M0, PinName M1, PinName M2);
+                                    // Configura los pasos a 1/2, 1/4, 1/8, 1/16, 1/32
+    long getStepOnHold(void);
+                                    
+    long StepOnHold;                // Pasos faltantes por ejecutar
+    long StepsBySecond;             // Pasos por segundo
+    
+  private:
+    
+    void moveMotor(void);
+    
+    DigitalOut Dir;
+    DigitalOut Step;
+    int        NPasos;
+    DigitalIn  encodin;
+    DigitalIn  PosInicial;
+    int        EncodPulses;
+    
+    DigitalOut* EnablePin;
+    DigitalOut* M0;
+    DigitalOut* M1;
+    DigitalOut* M2;
+    
+    Ticker Move;                /// Timer de interrupcion
+    float TStep;                /// periodo del paso TStep = 1/StepsBySecond;
+    
+    int entradas;               /// registra cada 2 ingresos a la interrupcion
+    bool _moveMotorStopped;     // en 1 cuando se da la orden al motor de detenerse
+};
+
+
+
+
+class TraccionD
+{
+    
+    public:
+    
+    TraccionD(PinName _StepMI, PinName _DirMI, PinName _StepMD, PinName _DirMD, int _NPasos, float _r, float _L); // para giro declarar primero la frecuencia de paso
+    
+    void Forward();                 // Da un sentido de giro al motor
+    void Back();                    // Genera un sentido de giro contrario al de Forward
+    void Left();                    // Configura el sentido de giro de ambos motores de manera contraria para girar hacia la izquierda
+    void Right();                   // Configura el sentido de giro de ambos motores de manera contraria e inverso al de Left() para girar hacia la derecha
+    void Stop();                    // Detiene el motor dejando el movimiento libre. Pin Enable = 0
+    void StopT();                   // Detiene el motor truncando o enclavando el movimiento(Lo mantiene quieto).
+    void StepFreq(long n);//maximo~350 // Configura la Velocidad en Número(n) de pasos por segundos. Es decir la Frecuencia de paso.
+    void RunStep(long n);           // Se mueve el motor la cantidad de pasos ingresada
+    void Run(float t);              // Gira el motor durante el tiempo ingresado, si es 0 indefinidamente hasta llamada a Stop().
+    void RunRound(int n);           // Girar n vueltas
+    void Giro(long grados, bool sentido);      // IMPORTANTE: Para llamar esta funcino PRIMERO se debe definir la frecuencia de paso
+                                               // Gira el movil la cantidad de grados indicados en sentido indicado. 
+                                               // en función del radio de las llantas y el radio del eje que une las llantas.
+                                               // ejemplo: (90, Horario) o (120, AntiHorario)
+
+    long getStepOnHold(void);
+    
+    
+    private:
+    
+    void moveMotor(void);           // Funcion que es ejecutada cada interupcion del Ticker Move
+    
+                                    // Configuracion de los pines
+    DigitalOut StepMI,DirMI;        
+    DigitalOut StepMD, DirMD;
+    int        NPasos;
+    float r;                        // Radio de la llanta
+    float L;                        // Longitud desde del eje medido entre las 2 llantas dividido en 2.
+    float Rl;                       // Relacion(Rl) de distacia entre los dos Radios(r y L)
+    long StepOnHold;                // Pasos faltantes por ejecutar
+    long StepsBySecond;             // Pasos por segundo
+    
+    DigitalOut* EnablePinM1;
+    DigitalOut* EnablePinM2;
+    
+    Ticker Move;                /// Timer de interrupcion
+    float TStep;                /// periodo del paso TStep = 1/StepsBySecond;
+    
+    int entradas;               /// registra cada 2 ingresos a la interrupcion
+                                    
+    
+
+
+
+};
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/corregido.txt	Fri Sep 03 05:22:19 2021 +0000
@@ -0,0 +1,472 @@
+#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;
+
+bool comm_pendi=false;
+void ReadPort()
+{
+    uint8_t tm=CoolTerm.getc();
+    //if(CoolTerm.writable()) CoolTerm.abort_write(); // ELIMINA LO QUE ESTEMOS ESCRIBIENDO AL COOLTERM
+    if (comm_pendi==false){
+    switch(n_interrupcion){
+    case 00:
+        coolterm_data =  tm; 
+        if (coolterm_data == iniciar_telecomando)  
+        n_interrupcion=1;
+    break;
+    case 01:ComandoRecivido =  tm; n_interrupcion=2; break;
+    case 02: 
+        Parametro       =  tm; 
+        n_interrupcion = 0;
+        comm_pendi=true;
+        break;
+    }
+    
+  }
+//  printf("%d",tm);
+}
+
+///******************************************+
+
+
+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() {
+
+    CoolTerm.printf("inicio");
+    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);
+         
+       /// Espera hasta que reciva algo diferente de 0xAA 
+       // while(ComandoRecivido == valorInicial);
+        
+       /// Espera hasta que reciva algo diferente de 0xAA 
+       // while(Parametro == valorInicial);
+        
+        while(comm_pendi ==false);
+
+        printf("okey comando :%d %d ", ComandoRecivido, Parametro);
+
+        ////  Desactivamos la interrupcion serial o recepcion de datos PORQUE NO NECESITAMOS recibir mas datos por AHORA
+        // CoolTerm.attach(NULL, Serial::RxIrq);
+        comm_pendi= false;   
+         
+        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;    
+         
+        }
+        comm_pendi= false;   
+            //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;
+        }
+
+
--- /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;
+        }
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Sep 03 05:22:19 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scolor_TCS3200.cpp	Fri Sep 03 05:22:19 2021 +0000
@@ -0,0 +1,37 @@
+#include "mbed.h"
+#include "scolor_TCS3200.h"
+
+
+scolor_TCS3200::scolor_TCS3200(PinName s0, PinName s1, PinName s2, PinName s3, PinName s_in) : 
+_s0(s0), _s1(s1), _s2(s2), _s3(s3), _s_in(s_in) 
+{
+    SetMode(SCALE_100);
+
+};
+ 
+
+long scolor_TCS3200::ReadRed()   { _s2=0;  _s3=0; return pulsewidth();}
+long scolor_TCS3200::ReadBlue()  { _s2=0;  _s3=1; return pulsewidth();}
+long scolor_TCS3200::ReadClear() { _s2=1;  _s3=0; return pulsewidth();}
+long scolor_TCS3200::ReadGreen() { _s2=1;  _s3=1; return pulsewidth();}
+
+void scolor_TCS3200::SetMode(uint8_t mode) {
+    switch (mode){
+        case SCALE_100:  _s0= 1; _s1=1; break;
+        case SCALE_20:   _s0=1 ; _s1=0; break;
+        case SCALE_2:    _s0=0 ; _s1=1; break;
+        case POWER_DOWN: _s0=0 ; _s1=0; break;
+    } 
+};
+ 
+long  scolor_TCS3200::pulsewidth() {
+    while(!_s_in);
+    timer.start();
+    while(_s_in);
+    timer.stop();
+    float pulsewidth_v = timer.read_us();
+    timer.reset();
+    return pulsewidth_v;
+};
+            
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scolor_TCS3200.h	Fri Sep 03 05:22:19 2021 +0000
@@ -0,0 +1,63 @@
+#ifndef SCOLOR_TCS3200_H
+#define SCOLOR_TCS3200_H
+#include "mbed.h"
+ /* **************************************************************************
+ 
+@fabeltranm 2019
+fbeltranm@ecci.edu.co
+
+
+   datasheet https://www.mouser.com/catalog/specsheets/TCS3200-E11.pdf
+
+
+    S0      Frequency scaling 
+    S1      Frequency scaling 
+    S2      Photo diode selection 
+    S3      Photo diode selection 
+    OutFreq Frequency
+
+       -----------------------------------
+      |   ____________     ____________   |
+----> |  |            |   |            |  |                ___     ___ 
+Light |  | Photodiode |   |   Current  |--|---OUTPUT_FREQ |   |___|   |___
+----> |  |   Array    |---|     to     |  |
+      |  |            |   |  Frequency |  |
+      |  |____________|   |____________|  |
+      |       ^  ^             ^  ^       |
+       -------|--|-------------|--|-------
+              |  |             |  |
+             S2 S3            S0  S1
+             
+SO | S1 | OUTPUT FREQUENCY SCALING |        | S2 | S3 |   PHOTODIODE TYPE   |
+ 0 | 0  |        power down        |        |  0 | 0  |         Red         |
+ 0 | 1  |           2%             |        |  0 | 1  |         Blue        |
+ 1 | 0  |           20%            |        |  1 | 0  |  Clear (no filter)  |
+ 1 | 1  |           100%           |        |  1 | 1  |         Green       | 
+             
+******************************************************************************/
+
+
+#define SCALE_100   1
+#define SCALE_20    2
+#define SCALE_2     3    
+#define POWER_DOWN  4
+
+class scolor_TCS3200 {
+  public:
+    scolor_TCS3200(PinName s0, PinName s1, PinName s2, PinName s3, PinName s_in);
+    long ReadRed();     // retorno el tiempo en alto de OutFreq para Rojo en ns
+    long ReadGreen();   // retorno el tiempo en alto de OutFreq para verde en ns
+    long ReadBlue();    // retorno el tiempo en alto de OutFreq color azul en ns
+    long ReadClear();   // retorno el tiempo en alto de OutFreq sin filtro en ns
+    void SetMode(uint8_t mode);
+  private:
+    DigitalOut _s0;
+    DigitalOut _s1;
+    DigitalOut _s2;
+    DigitalOut _s3;
+    DigitalIn _s_in;
+    Timer timer;
+    long pulsewidth();
+
+};
+#endif
\ No newline at end of file