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
Revision 0:3a37f6734913, committed 2021-09-03
- Comitter:
- CCastrop1012
- Date:
- Fri Sep 03 05:22:19 2021 +0000
- Commit message:
- Programa finalizado y funcional.
Changed in this revision
--- /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