Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:3a420fc22672, committed 2021-09-03
- Comitter:
- CCastrop1012
- Date:
- Fri Sep 03 05:26:27 2021 +0000
- Commit message:
- Proyecto de final de semestre, finalizado y funcional.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Motor.cpp Fri Sep 03 05:26:27 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:26:27 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/UniGraphic.lib Fri Sep 03 05:26:27 2021 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/GraphicsDisplay/code/UniGraphic/#f87f06292637
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corregido.txt Fri Sep 03 05:26:27 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:26:27 2021 +0000
@@ -0,0 +1,647 @@
+#include "mbed.h"
+#include "Motor.h"
+#include "scolor_TCS3200.h"
+
+#include "Arial12x12.h"
+#include "Arial24x23.h"
+#include "Arial43x48_numb.h"
+#include "pict.h"
+#include "pavement_48x34.h"
+#include "ILI9341.h"
+
+// Puerto de comunicacion Serial
+Serial CoolTerm(USBTX, USBRX);
+
+// TFT
+ILI9341* tft;
+
+// Motores m1step
+TraccionD Motores(PB_5, PB_3, PB_10, PB_4, 200, 3.75, 15.5) ;
+
+/// PWM OUTPUTS
+PwmOut Buzzer(D14); // 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);
+
+
+// Interrupcion Externa
+InterruptIn button1(USER_BUTTON);
+
+
+//******************************************************************************
+/// 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;
+
+
+
+/// Variables y Constantes para Interrupcion Serial
+#define valorInicial 0xAA
+uint8_t n_interrupcion = 0;
+uint8_t ComandoRecivido = valorInicial;
+uint8_t Parametro = valorInicial;
+
+
+/// 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;
+uint8_t color_anterior = 0;
+
+
+/// 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
+
+Timeout TimeBuzzer;
+
+
+#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.
+
+uint8_t new_command = 0;
+// 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
+
+
+
+// Variables y constantes pulsador
+volatile bool button1_pressed = false; // Used in the main loop
+volatile bool button1_enabled = true; // Used for debouncing
+Timeout button1_timeout; // Used for debouncing
+
+
+
+bool ComandPend = true;
+
+//****************************************************************************
+// Prototipo de funciones
+void Configuracion_Inicial(void);
+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(void); // Ejerce control sobre el Movimiento del carro desde el Joistick
+void intTimeBuzzer(void);
+
+void button1_enabled_cb(void);
+void button1_onpressed_cb(void);
+
+
+//****************************************************************************
+//
+
+/// Variables y constantes para la TFT
+
+const unsigned short FOREGROUND_COLORS[] = {White, Cyan, Red, Magenta, Yellow, Orange, GreenYellow};
+const unsigned short BACKGROUND_COLORS[] = {Black, Green, Yellow, Blue, Magenta, Black, Red};
+unsigned short backgroundColor;
+unsigned short foregroundColor;
+unsigned short colorIndex = 0;
+char orient = 1;
+
+
+void Configuracion_Inicial()
+{
+
+ Buzzer.write(0); // configura el ciclo util
+ Motores.StepFreq(VelMedia); // Valor inicial de velocidad = Media
+ CoolTerm.attach(&ReadPort, Serial::RxIrq); // Se Habilita la interrupcion serial o recepcion de datos
+ //MuestrearCOLOR.attach(&leer_color, 0.6); // Se Habilita una interrupcion cada 0.6 Segundos para leer el color
+ tft = new ILI9341(SPI_8, 10000000, PC_12, PC_11, PC_10, PA_13, PA_14, PA_15, "tft"); // SPI type, SPI speed, mosi, miso, sclk, cs, reset, dc
+ tft->set_orientation(orient); // horizontal 1
+
+ CoolTerm.baud(115200);
+ //CoolTerm.printf("\n\nSystem Core Clock = %.3f MHZ\r\n",(float)SystemCoreClock/1000000);
+ //tft->printf("\n\nSystem Core Clock = %.3f MHZ\r\n",(float)SystemCoreClock/1000000);
+ foregroundColor = FOREGROUND_COLORS[0]; // white
+ backgroundColor = BACKGROUND_COLORS[0];// DarkCyan
+
+ tft->background(backgroundColor); // set background to black
+ tft->set_orientation(orient);
+ tft->cls(); // clear the screen
+
+
+
+
+
+ tft->set_font((unsigned char*) Arial24x23,32,127,false); //variable width disabled
+ tft->locate(80,80);
+ tft->printf("COLOR \n\t\t NO \n\tIDENTIFICADO \r\n");
+
+
+ //button1.mode(PullUp); // Activate pull-up
+ button1.fall(callback(button1_onpressed_cb)); // Attach ISR to handle button press event
+
+
+}
+
+
+
+
+
+
+// Enables button when bouncing is over
+void button1_enabled_cb(void)
+{
+ button1_enabled = true;
+ if (button1_enabled)
+ {
+ // Reinicializamos 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;
+ Motores.Stop();
+ TimeBuzzer.attach(&intTimeBuzzer, 0);
+ ComandPend = false;
+ }
+}
+
+// ISR handling button pressed event
+void button1_onpressed_cb(void)
+{
+ if (button1_enabled)
+ { // Disabled while the button is bouncing
+ button1_enabled = false;
+ button1_pressed = true; // To be read by the main loop
+ button1_timeout.attach(callback(button1_enabled_cb), 0.3); // Debounce time 300 ms
+ }
+
+
+
+}
+
+
+
+
+void ReadPort()
+{
+ uint8_t temp = CoolTerm.getc();
+ //if(CoolTerm.writable()) CoolTerm.abort_write(); // ELIMINA LO QUE ESTEMOS ESCRIBIENDO AL COOLTERM
+ if (ComandPend == true)
+ {
+ switch(n_interrupcion)
+ {
+ case 00: coolterm_data = temp;
+ if (coolterm_data == iniciar_telecomando)
+ n_interrupcion = 1;
+ break;
+ case 01: ComandoRecivido = temp;
+ n_interrupcion=2;
+ break;
+ case 02: Parametro = temp;
+ n_interrupcion = 0;
+ ComandPend=false;
+ break;
+
+ }
+
+ }
+
+
+}
+
+///******************************************+
+
+
+void leer_Joystick()
+{
+
+ /// Variables Joystick
+ float EjeX;
+ float EjeY;
+ float Vx;
+ float Vy;
+
+ while ( ComandPend == true )
+ {
+
+ 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"); }
+
+
+ // 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(0.5); }// CoolTerm.printf ("MOTORES BACK\n"); }
+
+ // Combinacion de estados para ATRAS
+ if(estado_x == E_Centro && estado_y == E_Atras) { Motores.Forward(); Motores.Run(0.5); }// 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(0.5); } // 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(0.5); } // CoolTerm.printf ("MOTORES IZQUIERDA\n"); }
+ //wait(1.5);
+
+ if (ComandoRecivido == C_Joistck && Parametro == 0x02) break;
+ }
+
+
+}
+
+
+
+int main()
+{
+
+ Configuracion_Inicial();
+
+ MuestrearCOLOR.attach(&leer_color, 1.5); // Se Habilita una interrupcion cada 0.6 Segundos para leer el color
+
+ while(1)
+ {
+
+ /// Espera hasta que no se tengan comandos pendientes
+ while(ComandPend == true)wait_ms(1);
+ ComandPend = true;
+
+
+ // 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: leer_Joystick();
+ break;
+ default: break;
+
+
+ }
+
+
+ // Reinicializamos nuestras variables de control a sus valores iniciales
+ // Para no seguir entrando a las sentencias IF
+ if(ComandPend == true)
+ {
+ 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);
+
+ TimeBuzzer.attach(&intTimeBuzzer, 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 intTimeBuzzer(void)
+{
+
+ // 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()
+ {
+ MuestrearCOLOR.attach(NULL, 1.5); // Se Habilita una interrupcion cada 0.6 Segundos para leer el 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 );
+ if (color_anterior != CMD_azul)
+ {
+ foregroundColor = FOREGROUND_COLORS[0]; // white
+ backgroundColor = BACKGROUND_COLORS[3];// DarkCyan
+ tft->background(backgroundColor); // set background to black
+ tft->set_font((unsigned char*) Arial24x23,32,127,false); //variable width disabled
+ tft->cls();
+ tft->locate(80,80);
+ tft->printf("COLOR \n\tAZUL\r\n");
+
+ }
+ color_anterior = CMD_azul;
+
+ }
+ }
+ }
+
+
+
+
+ /////////////////////////////////////////////////////////////
+ /// 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 );
+
+ if (color_anterior != CMD_rojo)
+ {
+ foregroundColor = FOREGROUND_COLORS[0]; // white
+ backgroundColor = BACKGROUND_COLORS[6];// DarkCyan
+ tft->background(backgroundColor); // set background to black
+ tft->set_font((unsigned char*) Arial24x23,32,127,false); //variable width disabled
+ tft->cls();
+ tft->locate(80,80);
+ tft->printf("COLOR \n\tROJO\r\n");
+ }
+ color_anterior = CMD_rojo;
+ }
+ }
+
+ if(green < 10 && green >= 6 )
+ {
+ if(blue <= 12 )
+ {
+ color_identificado = CMD_clear;
+ CoolTerm.putc( iniciar_telemetria);
+ CoolTerm.putc( CMD_clear );
+ if (color_anterior != CMD_clear)
+ {
+ foregroundColor = FOREGROUND_COLORS[0]; // white
+ backgroundColor = BACKGROUND_COLORS[2];// DarkCyan
+ tft->background(backgroundColor); // set background to black
+ tft->set_font((unsigned char*) Arial24x23,32,127,false); //variable width disabled
+ tft->cls();
+ tft->locate(80,80);
+ tft->printf("COLOR \n\tAMARILLO\r\n");
+ }
+ color_anterior = CMD_clear;
+
+ }
+
+ }
+
+ }
+
+
+ if(green >= 36 && green <= 44 )
+ {
+ if(red >= 40 && red <= 50 )
+
+ {
+ color_identificado = CMD_verde;
+ CoolTerm.putc( iniciar_telemetria);
+ CoolTerm.putc( CMD_verde );
+ if (color_anterior != CMD_verde)
+ {
+ foregroundColor = FOREGROUND_COLORS[0]; // white
+ backgroundColor = BACKGROUND_COLORS[1];// DarkCyan
+ tft->background(backgroundColor); // set background to black
+ tft->set_font((unsigned char*) Arial24x23,32,127,false); //variable width disabled
+ tft->cls();
+ tft->locate(80,80);
+ tft->printf("COLOR \n\tVERDE\r\n");
+ }
+ color_anterior = CMD_verde;
+ }
+ }
+
+ if (color_identificado == ColorNoIdentificado)
+ {
+
+
+ CoolTerm.putc( iniciar_telemetria);
+ CoolTerm.putc( ColorNoIdentificado);
+
+ if (color_anterior != ColorNoIdentificado)
+ {
+ foregroundColor = FOREGROUND_COLORS[0]; // white
+ backgroundColor = BACKGROUND_COLORS[5];// DarkCyan
+ tft->background(backgroundColor); // set background to black
+ tft->set_font((unsigned char*) Arial24x23,32,127,false); //variable width disabled
+ tft->cls();
+ tft->locate(80,80);
+ tft->printf("COLOR \n\t\t NO \n\tIDENTIFICADO \r\n");
+ }
+ color_anterior = ColorNoIdentificado;
+
+ }
+
+ color_identificado = ColorNoIdentificado;
+
+ MuestrearCOLOR.attach(&leer_color, 1.5); // Se Habilita una interrupcion cada 0.6 Segundos para leer el color
+ }
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Sep 03 05:26:27 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/pavement_48x34.h Fri Sep 03 05:26:27 2021 +0000
@@ -0,0 +1,210 @@
+__align(2)
+const unsigned char pavement_48x34[] = { /* 0X40,0X10,0X30,0X00,0X22,0X00,0X01,0X1B, */
+0X0F,0XB4,0XCD,0XB3,0XAD,0XAB,0X6D,0XA3,0XCB,0X82,0X6D,0X9B,0X6D,0X9B,0X4C,0X9B,
+0X0B,0X8B,0X48,0X62,0X4C,0X93,0XAD,0XA3,0XAE,0XA3,0X6C,0X9B,0X4C,0X93,0X0B,0X7B,
+0X8D,0X9B,0X4C,0X93,0XEB,0X82,0XEB,0X7A,0X8A,0X6A,0X6A,0X6A,0XCB,0X72,0XEB,0X7A,
+0X0B,0X83,0X4C,0X8B,0XAE,0X93,0XEE,0X9B,0XAE,0XA3,0XAE,0XA3,0XAE,0X9B,0XCE,0XA3,
+0XCE,0XAB,0XCA,0X6A,0X30,0X8C,0X71,0X94,0X71,0X94,0X31,0X8C,0XF0,0X83,0X10,0X8C,
+0XEF,0X83,0XD3,0XA4,0X51,0X94,0X71,0X94,0X0B,0X63,0X4C,0X93,0X0B,0X8B,0X50,0XB4,
+0X0E,0XBC,0XAD,0XAB,0X8D,0XA3,0XAD,0XAB,0X6C,0X9B,0X0F,0XAC,0XEE,0XAB,0X8D,0XA3,
+0X4C,0X93,0XAA,0X6A,0X6D,0X8B,0XAE,0XA3,0XAD,0XAB,0XCE,0XAB,0X2C,0X8B,0XAE,0X9B,
+0X6D,0X9B,0X2C,0X8B,0XCB,0X7A,0XCA,0X72,0XCB,0X72,0X49,0X5A,0XAA,0X6A,0X0C,0X73,
+0XEB,0X7A,0X6C,0X93,0X4C,0X93,0X8D,0X9B,0XCE,0XA3,0X8D,0XA3,0XAD,0XA3,0XCE,0XAB,
+0X2F,0XB4,0X4C,0X7B,0X51,0X8C,0X51,0X94,0X10,0X8C,0XF0,0X83,0X10,0X84,0X30,0X8C,
+0X51,0X94,0X92,0X9C,0X30,0X94,0X10,0X84,0X2C,0X6B,0X2C,0X8B,0XCE,0XAB,0X2F,0XBC,
+0XCE,0XB3,0XCE,0XAB,0XAD,0XAB,0XAD,0XAB,0X8D,0XA3,0XEF,0XAB,0XEE,0XAB,0XCE,0XA3,
+0X8D,0X9B,0X07,0X52,0XAE,0X9B,0X2F,0XB4,0XCE,0XAB,0XAE,0XA3,0X6D,0X93,0X4C,0X93,
+0X6D,0X9B,0X0B,0X83,0X2C,0X83,0X2C,0X83,0XEB,0X7A,0X6A,0X62,0XAA,0X6A,0X8E,0X8B,
+0X4D,0X83,0X4C,0X93,0X0B,0X8B,0X2C,0X8B,0X4C,0X93,0X8D,0X9B,0XCE,0XA3,0XAE,0XA3,
+0X70,0XC4,0XAA,0X62,0X31,0X8C,0X71,0X94,0XCF,0X83,0XAE,0X7B,0XCF,0X7B,0XCF,0X83,
+0XEF,0X83,0XAF,0X7B,0XEF,0X83,0X10,0X8C,0X2C,0X6B,0X6D,0X9B,0XCE,0XAB,0XEE,0XB3,
+0X8D,0XAB,0X6C,0X9B,0X4C,0X9B,0XCE,0XB3,0XAE,0XAB,0X8D,0XA3,0XEE,0XAB,0X8D,0XA3,
+0XAD,0XA3,0XAA,0X6A,0XF3,0XC4,0X0F,0XAC,0XAE,0XA3,0X6D,0X93,0X0B,0X83,0X8D,0X9B,
+0X6D,0X93,0XEF,0XA3,0X6D,0X93,0X2C,0X8B,0XEC,0X72,0XAB,0X62,0X0C,0X73,0X6D,0X83,
+0X8D,0X8B,0X8D,0X9B,0X4C,0X8B,0X2C,0X8B,0XEB,0X82,0X2C,0X93,0X6D,0X9B,0XEE,0XAB,
+0X12,0XCD,0X28,0X4A,0XF0,0X83,0X10,0X84,0XCF,0X83,0XCF,0X7B,0XF0,0X83,0XF0,0X83,
+0XEF,0X83,0XF0,0X83,0XCF,0X83,0X10,0X8C,0X2B,0X6B,0XAE,0X93,0XCE,0XAB,0XAD,0XAB,
+0XEF,0XAB,0XAE,0X9B,0XEE,0XAB,0XCE,0XA3,0XAE,0XA3,0XCE,0XAB,0XCE,0XA3,0XCE,0XA3,
+0XB1,0XBC,0X65,0X39,0X08,0X52,0XCB,0X72,0X6D,0X93,0X4D,0X93,0X2C,0X8B,0X4C,0X8B,
+0X8D,0X9B,0X6D,0X93,0X4C,0X93,0X4D,0X8B,0X6A,0X62,0X8A,0X5A,0XCB,0X72,0X0C,0X73,
+0X6D,0X83,0X4C,0X83,0XAA,0X62,0X0C,0X73,0X89,0X62,0XCB,0X72,0XEB,0X7A,0X2C,0X83,
+0X86,0X39,0XE3,0X20,0X6E,0X73,0X51,0X94,0XF0,0X83,0X31,0X8C,0X10,0X84,0XCF,0X83,
+0XEF,0X8B,0X51,0X94,0XF0,0X83,0X51,0X94,0X2C,0X6B,0X49,0X5A,0XCE,0XA3,0XAE,0XA3,
+0XAB,0X62,0XCF,0X8B,0X62,0X10,0XC3,0X18,0XE8,0X49,0XAB,0X62,0X29,0X52,0XC7,0X39,
+0X08,0X4A,0X08,0X42,0XA7,0X39,0XCB,0X62,0X08,0X4A,0XC3,0X20,0X05,0X29,0X86,0X39,
+0X6A,0X52,0X6A,0X5A,0XE8,0X41,0X86,0X39,0X08,0X42,0X49,0X52,0X44,0X29,0X25,0X29,
+0X08,0X52,0XE7,0X51,0X8A,0X6A,0XA6,0X41,0XC7,0X51,0X08,0X5A,0X28,0X62,0XAA,0X72,
+0X89,0X72,0X28,0X62,0XAA,0X72,0X65,0X39,0X46,0X29,0XEC,0X62,0X6A,0X52,0X49,0X4A,
+0X8A,0X5A,0X4D,0X73,0XEC,0X6A,0X08,0X4A,0XAB,0X5A,0XA7,0X39,0XCB,0X62,0X4D,0X73,
+0XCF,0X83,0X71,0X9C,0X45,0X29,0XC8,0X39,0XCF,0X83,0X0F,0X8C,0X30,0X8C,0X30,0X8C,
+0XCF,0X83,0XAE,0X7B,0X8E,0X7B,0X8E,0X7B,0X6D,0X7B,0X82,0X10,0XCB,0X62,0X6D,0X73,
+0X2C,0X6B,0XCB,0X62,0XAB,0X5A,0XEB,0X62,0X4D,0X73,0X2C,0X6B,0X8A,0X52,0XEB,0X7A,
+0X0B,0X83,0X4C,0X8B,0X4C,0X93,0X6D,0X93,0X4C,0X93,0XAE,0XA3,0X0E,0XAC,0XAD,0XA3,
+0X8C,0XA3,0X6C,0X9B,0X4C,0X93,0XA9,0X72,0X8B,0X5A,0X30,0X8C,0X10,0X8C,0XB2,0XA4,
+0X91,0X9C,0X91,0X9C,0X71,0X94,0XEF,0X83,0X6D,0X7B,0X10,0X8C,0X91,0X9C,0X50,0X9C,
+0XCF,0X8B,0XAE,0X83,0XE7,0X41,0X30,0X8C,0X50,0X94,0X30,0X8C,0X30,0X94,0X0F,0X8C,
+0X6D,0X73,0X6D,0X73,0X6D,0X73,0XEF,0X83,0XCF,0X83,0XC3,0X18,0X6D,0X73,0X4D,0X73,
+0X6D,0X73,0X0C,0X6B,0XEC,0X6A,0X0C,0X6B,0X2C,0X6B,0X4D,0X73,0X89,0X5A,0XEB,0X7A,
+0X0B,0X83,0X0B,0X7B,0XEB,0X82,0X0B,0X83,0X2C,0X93,0X2F,0XB4,0XCE,0XAB,0XAD,0XA3,
+0X6C,0XA3,0XEB,0X8A,0X6C,0X9B,0X47,0X5A,0X50,0X94,0X71,0X9C,0X71,0X94,0X91,0X9C,
+0XD2,0XA4,0X91,0X9C,0X10,0X8C,0X10,0X8C,0X30,0X94,0X71,0X9C,0X71,0X9C,0X30,0X94,
+0X0F,0X8C,0X0F,0X94,0X69,0X52,0XEF,0X8B,0X10,0X8C,0X30,0X8C,0XCE,0X83,0XCE,0X83,
+0XAE,0X7B,0XEF,0X83,0XCF,0X83,0X30,0X8C,0X0F,0X8C,0X45,0X29,0X6D,0X73,0X2C,0X6B,
+0X2C,0X6B,0X2D,0X73,0X2C,0X73,0X2C,0X6B,0X2C,0X73,0X2C,0X6B,0X8A,0X5A,0XCB,0X7A,
+0X0B,0X7B,0XCF,0X9B,0X6D,0X93,0XAD,0X9B,0X8D,0X9B,0XAD,0XA3,0XAD,0XA3,0XCE,0XAB,
+0X4C,0X9B,0X2C,0X93,0X70,0XB4,0X88,0X62,0X10,0X8C,0X51,0X94,0X71,0X94,0X91,0X9C,
+0X91,0X9C,0X92,0X9C,0X51,0X94,0X0F,0X8C,0X51,0X94,0X71,0X9C,0X30,0X94,0X50,0X94,
+0XEF,0X8B,0XCE,0X8B,0X28,0X4A,0XEF,0X8B,0XEF,0X8B,0XEF,0X8B,0X8E,0X7B,0XAF,0X83,
+0XCF,0X83,0XEF,0X8B,0X30,0X8C,0XEF,0X8B,0XAE,0X7B,0X44,0X29,0X2C,0X6B,0X4D,0X73,
+0X6D,0X73,0X2C,0X6B,0XAB,0X62,0XAA,0X5A,0X8E,0X7B,0XCF,0X83,0X69,0X52,0XCA,0X7A,
+0X4C,0X8B,0XAD,0X9B,0XAD,0XA3,0X8D,0X9B,0X6C,0X9B,0X8D,0X93,0XCE,0XAB,0XCE,0XAB,
+0X8D,0XA3,0XAD,0XAB,0X0F,0XB4,0XA9,0X6A,0XF0,0X8B,0X92,0X9C,0X71,0X9C,0X50,0X94,
+0X51,0X94,0X91,0X9C,0X51,0X94,0X30,0X8C,0XD2,0XA4,0XB2,0XA4,0X91,0X9C,0X50,0X9C,
+0X6E,0X7B,0XAE,0X8B,0X08,0X42,0X50,0X94,0X51,0X94,0XAE,0X7B,0X8E,0X7B,0X10,0X8C,
+0X50,0X94,0X30,0X8C,0XEF,0X83,0XCE,0X83,0X10,0X8C,0X65,0X31,0XAB,0X5A,0X8E,0X7B,
+0X4D,0X73,0X0C,0X6B,0XCB,0X62,0XCB,0X62,0XAE,0X7B,0X8E,0X7B,0XCB,0X62,0X0B,0X83,
+0X4C,0X8B,0X6C,0X93,0X8D,0X9B,0X4C,0X93,0X2C,0X8B,0XEE,0XA3,0X0E,0XB4,0XCD,0XAB,
+0XCD,0XA3,0XCE,0XAB,0XEE,0XB3,0XA9,0X72,0X10,0X8C,0X51,0X94,0X30,0X94,0XF0,0X8B,
+0X71,0X9C,0X30,0X94,0X51,0X94,0X30,0X94,0XB2,0XA4,0X91,0X9C,0X91,0XA4,0X10,0X8C,
+0XAE,0X7B,0X50,0X9C,0X69,0X52,0XD2,0XA4,0X30,0X94,0X10,0X8C,0X51,0X94,0XEF,0X8B,
+0XEF,0X83,0XAE,0X7B,0XAE,0X7B,0XEF,0X83,0X10,0X8C,0X08,0X42,0X6D,0X7B,0XAE,0X83,
+0X6D,0X73,0X0C,0X6B,0X0C,0X6B,0XEC,0X6A,0X2C,0X6B,0X2C,0X73,0X4D,0X73,0X2D,0X83,
+0X6D,0X8B,0X6D,0X93,0X2C,0X8B,0X4C,0X8B,0XAD,0X9B,0XEE,0XAB,0XEE,0XAB,0X8C,0XA3,
+0X4C,0X9B,0X8D,0XA3,0XCE,0XB3,0XAA,0X72,0X0C,0X6B,0X71,0X94,0X30,0X8C,0X30,0X8C,
+0XEF,0X8B,0X10,0X8C,0X51,0X9C,0X51,0X9C,0X71,0X9C,0X51,0X9C,0X30,0X94,0XAE,0X83,
+0X30,0X94,0X91,0XA4,0X4C,0X73,0X71,0X9C,0X0F,0X8C,0XCF,0X83,0XCF,0X83,0X30,0X8C,
+0XCF,0X83,0X6D,0X73,0XEF,0X83,0XCF,0X83,0XAE,0X83,0X66,0X31,0X6D,0X73,0XAE,0X83,
+0X2C,0X6B,0X4D,0X73,0X6D,0X7B,0X4D,0X7B,0XEB,0X62,0X8E,0X7B,0XEE,0X8B,0X66,0X39,
+0X2C,0X83,0X2C,0X83,0X2C,0X83,0XCE,0X9B,0XCE,0XA3,0X0F,0XAC,0XEF,0XAB,0X0B,0X8B,
+0X8D,0X9B,0X2F,0XB4,0XCD,0XB3,0XEA,0X7A,0XCF,0X83,0X30,0X8C,0XEF,0X8B,0X51,0X94,
+0X30,0X94,0X92,0X9C,0X51,0X9C,0X30,0X94,0X10,0X8C,0X30,0X94,0X91,0X9C,0X10,0X8C,
+0XCF,0X83,0X71,0X9C,0X69,0X52,0X30,0X8C,0XCF,0X83,0XCF,0X83,0XCF,0X83,0XEF,0X8B,
+0X10,0X8C,0XEF,0X83,0X10,0X8C,0X10,0X8C,0XAE,0X7B,0X04,0X21,0XAE,0X83,0X6D,0X73,
+0X0C,0X63,0X10,0X8C,0XCF,0X8B,0X6D,0X7B,0X0C,0X6B,0XAE,0X83,0XCE,0X83,0X49,0X62,
+0X2C,0X8B,0X0C,0X83,0XAE,0X9B,0XCE,0X9B,0XAD,0XA3,0XAD,0XA3,0XAD,0X9B,0X8D,0XA3,
+0XB1,0XBC,0XCE,0XAB,0XCE,0XB3,0X68,0X62,0XAE,0X83,0X10,0X8C,0XEF,0X8B,0X91,0X9C,
+0X91,0X9C,0X51,0X94,0X30,0X94,0XCF,0X83,0X30,0X94,0X71,0X9C,0X71,0X9C,0X50,0X94,
+0X10,0X8C,0X75,0XBD,0X29,0X4A,0XAE,0X7B,0X8E,0X7B,0XAE,0X7B,0XCF,0X83,0X0F,0X8C,
+0XEF,0X8B,0XEF,0X8B,0X10,0X8C,0X10,0X8C,0XEF,0X8B,0X86,0X39,0X8E,0X7B,0X6D,0X73,
+0X4D,0X73,0XCE,0X83,0XAE,0X83,0X4D,0X7B,0X4D,0X73,0X4D,0X73,0XD2,0XA4,0X08,0X5A,
+0XEB,0X82,0X6D,0X8B,0X50,0XAC,0XEE,0XAB,0XCE,0XA3,0XEE,0XAB,0XAD,0XAB,0X6C,0XA3,
+0XEE,0XAB,0XCD,0XB3,0X50,0XBC,0XCA,0X72,0XF0,0X8B,0X10,0X8C,0XEF,0X83,0X71,0X9C,
+0X91,0X9C,0X30,0X94,0XEF,0X8B,0X6E,0X7B,0XCF,0X83,0X71,0X9C,0X50,0X9C,0X30,0X94,
+0X92,0XA4,0X54,0XBD,0X6D,0X73,0XD3,0XA4,0X8E,0X7B,0X0F,0X8C,0XF3,0XAC,0X71,0X9C,
+0X10,0X8C,0XEF,0X83,0XEF,0X83,0X51,0X94,0X91,0X9C,0X85,0X31,0XCB,0X62,0X2C,0X6B,
+0X4D,0X73,0XCF,0X83,0X4D,0X73,0X2C,0X73,0X4D,0X73,0X6D,0X73,0X2F,0X8C,0XE7,0X49,
+0XEB,0X7A,0XAE,0X9B,0X50,0XAC,0X0F,0XAC,0X4F,0XB4,0XAD,0XA3,0XCD,0XAB,0X8D,0XA3,
+0XCE,0XAB,0XEE,0XAB,0XD1,0XD4,0XEA,0X6A,0X0C,0X6B,0X10,0X8C,0X30,0X8C,0XB2,0XA4,
+0XD2,0XA4,0X10,0X8C,0X8E,0X7B,0XCF,0X83,0X30,0X94,0X71,0X9C,0X50,0X94,0XB2,0XA4,
+0X49,0X52,0X24,0X29,0XE3,0X18,0X86,0X31,0X89,0X5A,0X28,0X4A,0X49,0X52,0X69,0X52,
+0X28,0X4A,0X8A,0X5A,0XE7,0X41,0X08,0X42,0X45,0X31,0X41,0X08,0X61,0X10,0XE7,0X41,
+0X08,0X42,0X28,0X4A,0XC7,0X41,0X65,0X31,0X85,0X31,0XE7,0X41,0XA6,0X39,0XC3,0X20,
+0X28,0X52,0X08,0X52,0XCA,0X6A,0X48,0X5A,0X89,0X5A,0XE7,0X49,0X69,0X5A,0X2C,0X7B,
+0XCA,0X6A,0X89,0X5A,0X28,0X52,0X66,0X31,0XC7,0X41,0XCB,0X62,0X69,0X52,0XCB,0X62,
+0XEB,0X6A,0X48,0X52,0X65,0X31,0XA6,0X39,0X08,0X42,0X69,0X52,0X89,0X5A,0XCA,0X62,
+0X6D,0X93,0X4C,0X83,0X4C,0X8B,0XEB,0X7A,0X0F,0X9C,0XA6,0X39,0X2C,0X7B,0XAE,0X8B,
+0XEF,0X93,0X0F,0X8C,0X8E,0X83,0X6E,0X7B,0XCF,0X83,0X2D,0X73,0X6D,0X7B,0XEF,0X8B,
+0X25,0X29,0XCB,0X72,0XCE,0XA3,0X2C,0X93,0X4C,0X93,0X6D,0X9B,0X8D,0XA3,0X4C,0X9B,
+0X2C,0X8B,0XCB,0X7A,0X0C,0X83,0XC7,0X49,0X09,0X42,0X4D,0X73,0X0F,0X8C,0X0F,0X8C,
+0XAF,0X83,0XCF,0X83,0X71,0X9C,0X92,0X9C,0X71,0X9C,0X30,0X94,0X0F,0X94,0X30,0X9C,
+0X30,0X94,0XCE,0X83,0X08,0X52,0X8D,0X93,0X2C,0X8B,0X2C,0X83,0X8D,0X93,0XEE,0X9B,
+0X0F,0XA4,0XAE,0X9B,0X4C,0X8B,0X8E,0X93,0XAE,0X93,0XAA,0X62,0X50,0XA4,0X8E,0X83,
+0X8E,0X83,0X0F,0X8C,0XAE,0X83,0X10,0X8C,0X30,0X94,0X0F,0X94,0XCE,0X83,0X10,0X8C,
+0X08,0X4A,0X2C,0X8B,0X8D,0XA3,0X2C,0X9B,0XAE,0XA3,0X50,0XB4,0XEE,0XAB,0X6D,0X9B,
+0XEB,0X8A,0XEB,0X82,0X4C,0X8B,0X08,0X52,0XCF,0X83,0X10,0X94,0XEF,0X93,0XCF,0X8B,
+0X10,0X94,0X91,0X9C,0X51,0X9C,0X71,0X9C,0X91,0XA4,0X30,0X94,0X51,0X9C,0X30,0X9C,
+0X50,0X9C,0XEF,0X8B,0XAA,0X6A,0X8D,0X93,0X4D,0X8B,0XAD,0X9B,0XAD,0X93,0XCE,0XA3,
+0X0F,0XA4,0XAE,0X9B,0XAE,0X9B,0XAE,0X9B,0XEF,0XA3,0X69,0X5A,0X30,0X9C,0XCF,0X8B,
+0XB2,0XA4,0X50,0X9C,0XEF,0X8B,0X0F,0X94,0X30,0X94,0XEF,0X8B,0XAE,0X83,0X0C,0X6B,
+0XC7,0X41,0X89,0X72,0X6C,0X9B,0X4C,0X9B,0X2F,0XAC,0XEE,0XAB,0XCE,0XA3,0X8D,0X93,
+0X6D,0X93,0X6C,0X93,0X6D,0X8B,0XC6,0X41,0XCF,0X83,0X0F,0X94,0XEF,0X93,0XAE,0X8B,
+0XEF,0X93,0X30,0X9C,0X30,0X9C,0X0F,0X94,0XCE,0X8B,0XEF,0X8B,0X91,0XA4,0X91,0XA4,
+0X51,0X9C,0X8D,0X7B,0X49,0X5A,0XAE,0X93,0XEF,0X9B,0XCE,0X9B,0X6D,0X93,0X6D,0X8B,
+0XCE,0X9B,0XCE,0X9B,0XAE,0X93,0XCE,0X9B,0XEE,0XA3,0X69,0X5A,0XEF,0X93,0XEF,0X93,
+0X50,0X9C,0X71,0X9C,0XEF,0X8B,0X6D,0X7B,0X0F,0X8C,0XAE,0X83,0XAE,0X83,0X4D,0X73,
+0XC7,0X41,0XCA,0X82,0XEB,0X8A,0X4C,0X93,0X0F,0XB4,0X71,0XBC,0X8E,0X9B,0XEB,0X7A,
+0X6D,0X93,0X2B,0X83,0XAA,0X72,0X8A,0X62,0X6E,0X7B,0X30,0X94,0XEF,0X93,0XEF,0X93,
+0X0F,0X94,0X0F,0X94,0XCF,0X8B,0XCF,0X8B,0X0F,0X94,0X30,0X9C,0X71,0XA4,0X71,0XA4,
+0X51,0X9C,0XEF,0X83,0X8A,0X62,0XEF,0XA3,0XCE,0X9B,0XAE,0X9B,0X2C,0X83,0XCE,0X9B,
+0X0F,0XA4,0XAD,0X9B,0X6D,0X93,0X6D,0X8B,0XCE,0X9B,0X48,0X5A,0X0F,0X94,0X71,0XA4,
+0X30,0X9C,0X71,0X9C,0X8D,0X7B,0XEF,0X8B,0X30,0X9C,0XEF,0X8B,0X8E,0X83,0X0F,0X8C,
+0X49,0X52,0X8A,0X72,0X2C,0X93,0X6D,0X9B,0XAE,0XA3,0X8D,0X9B,0X2C,0X8B,0X0C,0X83,
+0X0B,0X83,0X0B,0X83,0X0C,0X7B,0XCA,0X6A,0X30,0X94,0X50,0X9C,0XEF,0X93,0XCF,0X8B,
+0XCF,0X8B,0XEF,0X8B,0X30,0X9C,0XCF,0X8B,0XEF,0X93,0X0F,0X94,0X71,0XA4,0X10,0X94,
+0X30,0X9C,0XAE,0X83,0XEB,0X72,0X2F,0XAC,0X2F,0XAC,0XAE,0X9B,0XCE,0X93,0XEF,0XA3,
+0XEE,0X9B,0X0C,0X83,0XEB,0X7A,0XCE,0X93,0XEE,0X9B,0X28,0X52,0X30,0X9C,0XEF,0X8B,
+0XEF,0X8B,0XEF,0X8B,0X30,0X94,0X30,0X94,0X30,0X9C,0X30,0X94,0XCF,0X83,0XCE,0X83,
+0XA6,0X39,0XEB,0X7A,0X8E,0X9B,0X8D,0X9B,0X6D,0X9B,0X6D,0X9B,0XCB,0X7A,0X4C,0X8B,
+0X2B,0X8B,0X8D,0X9B,0X8D,0X93,0X0B,0X7B,0XCF,0X83,0X0F,0X94,0XEF,0X8B,0XCF,0X8B,
+0XEF,0X8B,0X10,0X94,0X10,0X94,0X30,0X94,0X30,0X94,0X30,0X9C,0XEF,0X93,0XEF,0X93,
+0X30,0X94,0XAD,0X83,0X8A,0X6A,0X8D,0X93,0XAE,0X93,0XAE,0X93,0XAE,0X9B,0XEF,0XA3,
+0XAD,0X93,0X4D,0X8B,0XCE,0X93,0XEE,0X9B,0XEF,0XA3,0X0B,0X73,0XAE,0X8B,0XCE,0X8B,
+0XCF,0X8B,0X30,0X94,0X50,0X94,0X10,0X94,0XAE,0X83,0X8E,0X7B,0X8E,0X7B,0X30,0X94,
+0XE8,0X41,0X6D,0X93,0XAD,0XA3,0X8D,0X9B,0X8D,0X9B,0XEB,0X82,0X8D,0X93,0X4C,0X8B,
+0X8D,0X9B,0XCE,0XA3,0X8D,0X93,0XEA,0X72,0X0D,0X6B,0XEF,0X8B,0XEF,0X93,0XAE,0X8B,
+0XEF,0X8B,0X30,0X9C,0X0F,0X94,0X30,0X94,0X91,0XA4,0X30,0X9C,0X50,0X9C,0X30,0X9C,
+0X71,0XA4,0XB1,0XA4,0X69,0X62,0X4C,0X8B,0X4D,0X8B,0XAE,0X9B,0XCE,0X9B,0X0F,0XA4,
+0XEF,0X9B,0XCE,0X9B,0X0F,0XA4,0X30,0XAC,0XEF,0XA3,0X69,0X5A,0X6D,0X7B,0X71,0X9C,
+0X51,0X9C,0X91,0XA4,0X10,0X94,0XAE,0X83,0X2C,0X73,0X8E,0X7B,0X6E,0X7B,0XEF,0X8B,
+0X08,0X4A,0X2C,0X8B,0XAD,0XA3,0XAD,0XA3,0XCE,0XA3,0X8D,0X9B,0X8D,0X93,0X8D,0X9B,
+0X8D,0X9B,0X8D,0X9B,0X8D,0X9B,0X88,0X62,0X4D,0X73,0XCF,0X8B,0XEF,0X93,0XCF,0X8B,
+0X71,0X9C,0X71,0X9C,0XEF,0X8B,0X0F,0X94,0X30,0X9C,0XEF,0X93,0X30,0X94,0X30,0X9C,
+0X50,0X9C,0X0F,0X8C,0X69,0X62,0X6D,0X8B,0XAE,0X93,0XCE,0X9B,0X0F,0XA4,0XEF,0XA3,
+0X2F,0XA4,0X0F,0XA4,0XCE,0X9B,0XCE,0X9B,0X0F,0XA4,0XE7,0X49,0X30,0X9C,0X71,0X9C,
+0X92,0X9C,0X91,0XA4,0X10,0X94,0X0F,0X8C,0XAE,0X83,0X51,0X9C,0XAE,0X83,0XAE,0X7B,
+0XC7,0X39,0X2C,0X8B,0X6D,0X9B,0X6D,0X9B,0X8D,0X9B,0X4C,0X8B,0X6C,0X93,0X8D,0XA3,
+0X2B,0X93,0X4C,0X93,0X6D,0X93,0X0A,0X73,0X4D,0X7B,0XCF,0X83,0XCF,0X8B,0XEF,0X93,
+0X0F,0X94,0X50,0X9C,0X30,0X94,0XEF,0X8B,0X10,0X8C,0X0F,0X94,0X50,0X9C,0X0F,0X94,
+0X10,0X94,0X0F,0X8C,0X69,0X62,0X8E,0X93,0XAE,0X93,0XCE,0X9B,0X0F,0XA4,0XEF,0XA3,
+0X0F,0XA4,0XEE,0XA3,0X0F,0XA4,0XCE,0X9B,0X91,0XB4,0XEB,0X62,0X92,0XA4,0X91,0XA4,
+0XD2,0XA4,0X92,0X9C,0X30,0X94,0X0F,0X8C,0XAE,0X83,0XCE,0X83,0XCF,0X83,0X51,0X94,
+0X8A,0X5A,0X4C,0X93,0XCB,0X82,0X6D,0X9B,0X4D,0X93,0X0C,0X83,0X6C,0X9B,0X4C,0X93,
+0X8D,0X9B,0XEF,0XAB,0XEF,0XA3,0X0E,0X94,0X4D,0X73,0X10,0X8C,0XEF,0X8B,0XCF,0X8B,
+0X30,0X94,0X50,0X9C,0X30,0X94,0XEF,0X8B,0XEF,0X8B,0X30,0X94,0X71,0X9C,0X51,0X9C,
+0X71,0X9C,0X6F,0X9C,0XEB,0X72,0X8E,0X8B,0XEF,0X9B,0X50,0XAC,0X0F,0XA4,0X0F,0XA4,
+0X48,0X5A,0X48,0X5A,0XCA,0X72,0XAA,0X6A,0XCA,0X6A,0X04,0X21,0X07,0X4A,0X69,0X52,
+0XCA,0X62,0X4C,0X73,0X6D,0X7B,0XCB,0X62,0XCB,0X62,0X0C,0X6B,0X69,0X52,0X2C,0X6B,
+0XE3,0X20,0X45,0X39,0XC7,0X49,0XC7,0X49,0X08,0X5A,0X49,0X62,0XCA,0X72,0XAA,0X72,
+0X07,0X5A,0X69,0X6A,0X2B,0X7B,0X65,0X31,0XE3,0X20,0X89,0X5A,0X49,0X5A,0XEB,0X62,
+0X2C,0X73,0XCA,0X62,0X0B,0X6B,0X2C,0X73,0X0C,0X6B,0X2C,0X73,0X6D,0X7B,0XCB,0X62,
+0X4C,0X73,0XA5,0X31,0XC7,0X41,0X2C,0X7B,0XCB,0X6A,0X4C,0X83,0X2C,0X7B,0X89,0X6A,
+0XCE,0XAB,0X0F,0XB4,0X8D,0XA3,0X4C,0X93,0XAE,0XA3,0X8D,0X9B,0XAD,0X9B,0X08,0X5A,
+0X0C,0X8B,0XC7,0X49,0XA7,0X41,0X09,0X52,0X0B,0X8B,0XAD,0XA3,0X8D,0XA3,0X0B,0X8B,
+0XCB,0X7A,0X69,0X72,0X89,0X72,0X08,0X52,0XE3,0X28,0X62,0X08,0X26,0X29,0X69,0X62,
+0XEA,0X7A,0X49,0X62,0XE7,0X51,0XEB,0X82,0XEB,0X82,0X0B,0X83,0X2C,0X8B,0X2C,0X8B,
+0XAE,0X93,0XA6,0X39,0XAB,0X5A,0X2D,0X6B,0XAE,0X7B,0XCF,0X83,0X6D,0X73,0XF0,0X83,
+0X8E,0X7B,0X10,0X8C,0X50,0X94,0X30,0X94,0XC3,0X18,0XA7,0X41,0XEB,0X7A,0XAE,0X9B,
+0X4F,0XBC,0X0F,0XB4,0X0E,0XB4,0XEE,0XB3,0XEE,0XB3,0X0F,0XB4,0X8D,0XA3,0X0B,0X93,
+0X8D,0X9B,0X48,0X62,0X49,0X6A,0XAB,0X7A,0X2B,0X93,0X6C,0X9B,0X8D,0XA3,0X8D,0X9B,
+0X2C,0X93,0X0C,0X8B,0XCB,0X7A,0XEB,0X82,0XAA,0X6A,0X86,0X39,0X69,0X5A,0XEB,0X7A,
+0X0B,0X83,0X4C,0X93,0X4C,0X93,0X6D,0X9B,0X4C,0X93,0XAD,0XA3,0XAD,0XAB,0XCE,0XAB,
+0X2F,0XB4,0XEB,0X6A,0X10,0X8C,0X30,0X8C,0X71,0X94,0X91,0X9C,0X10,0X8C,0X51,0X94,
+0X30,0X8C,0X51,0X94,0X10,0X94,0X10,0X8C,0X08,0X42,0X8A,0X72,0XEE,0XB3,0X50,0XBC,
+0X0F,0XBC,0X0E,0XB4,0XAE,0XAB,0X8D,0XA3,0X0F,0XB4,0XCE,0XAB,0X8D,0XA3,0X2C,0X93,
+0X2F,0XB4,0XC7,0X49,0X6C,0X9B,0X4C,0X9B,0X2C,0X93,0X6D,0X9B,0X6D,0X9B,0X6C,0X9B,
+0X2C,0X93,0XCB,0X7A,0XCB,0X7A,0X4D,0X8B,0XCB,0X7A,0XEB,0X7A,0XEB,0X72,0X6D,0X83,
+0X6D,0X8B,0XAD,0X9B,0XAD,0XA3,0X4C,0X93,0XAE,0X9B,0X2F,0XB4,0XEE,0XB3,0XAD,0XAB,
+0XEE,0XB3,0XCA,0X62,0X71,0X94,0XB2,0X9C,0XF3,0XA4,0X92,0X9C,0X10,0X8C,0X10,0X8C,
+0X71,0X9C,0X51,0X94,0X0F,0X8C,0X30,0X94,0X89,0X5A,0XCE,0XAB,0X0E,0XB4,0X2F,0XBC,
+0XCE,0XAB,0XAD,0XAB,0X6D,0X9B,0X2F,0XB4,0X0F,0XBC,0XCE,0XAB,0XEE,0XAB,0XCE,0XA3,
+0XEE,0XAB,0X89,0X6A,0X8D,0XA3,0X6D,0X9B,0XEF,0XA3,0X70,0XB4,0X0F,0XB4,0X8D,0XA3,
+0X2C,0X93,0XEB,0X82,0X0C,0X8B,0X8D,0X9B,0XCB,0X72,0X0B,0X7B,0X4C,0X83,0X6D,0X8B,
+0X8D,0X93,0X4C,0X93,0XAD,0X9B,0X2C,0X93,0XAE,0X9B,0X2F,0XB4,0X0F,0XB4,0X2C,0X93,
+0X30,0XB4,0X69,0X52,0X92,0X9C,0XB2,0X9C,0X91,0X9C,0XEF,0X83,0XEF,0X83,0X30,0X8C,
+0X92,0X9C,0XEF,0X83,0XEF,0X8B,0XEF,0X8B,0X6D,0X73,0XAE,0XA3,0X2F,0XBC,0X0F,0XB4,
+0XAD,0XAB,0X8D,0XA3,0X0F,0XB4,0X0F,0XB4,0XCE,0XAB,0XAD,0XA3,0XAD,0XA3,0XEE,0XAB,
+0X0F,0XAC,0X48,0X62,0X8D,0XA3,0X8D,0X9B,0XEE,0XAB,0XEE,0XB3,0X50,0XB4,0X4C,0X93,
+0X2C,0X93,0X2C,0X93,0X6C,0X9B,0X0C,0X8B,0XCB,0X72,0X0B,0X7B,0X2C,0X83,0X4C,0X8B,
+0X4C,0X93,0X2C,0X8B,0X0B,0X8B,0X4C,0X93,0X6D,0X9B,0XEE,0XAB,0XAD,0XA3,0X8D,0XA3,
+0X0F,0XB4,0XCA,0X62,0X91,0X94,0X92,0X9C,0X30,0X8C,0XEF,0X83,0X6E,0X73,0X51,0X94,
+0XCF,0X83,0XAE,0X83,0XEF,0X83,0XEF,0X83,0X2C,0X6B,0X70,0XBC,0X50,0XBC,0X6D,0XA3,
+0X8D,0XA3,0XCD,0XB3,0XCD,0XB3,0XCE,0XAB,0X8D,0XA3,0X0B,0X93,0X2C,0X93,0XAD,0XA3,
+0X8D,0X9B,0X89,0X6A,0X8D,0X9B,0X8D,0XA3,0XCE,0XA3,0XAD,0XA3,0X6D,0X9B,0XCB,0X7A,
+0X2C,0X8B,0XAD,0X9B,0X4C,0X9B,0X0C,0X8B,0X8A,0X62,0X49,0X5A,0X2C,0X83,0X4C,0X8B,
+0X2C,0X8B,0X2C,0X83,0X2C,0X83,0X6D,0X93,0XEF,0XA3,0X0F,0XAC,0XEF,0XA3,0XCE,0XA3,
+0X0F,0XB4,0XEB,0X6A,0X92,0X94,0X51,0X94,0X51,0X94,0X10,0X8C,0X10,0X8C,0X10,0X8C,
+0XCF,0X83,0XCF,0X7B,0XF0,0X83,0X10,0X8C,0X6D,0X73,0XCE,0XAB,0X4D,0X8B,0X2C,0X93,
+};
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pict.h Fri Sep 03 05:26:27 2021 +0000
@@ -0,0 +1,38 @@
+__align(2)
+char burp[] = { /* 0X00,0X01,0X40,0X00,0X40,0X00, */
+0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X00,0X00,
+0X00,0X00,0X00,0X1F,0X10,0XF0,0X00,0X00,0X00,0X00,0X40,0X0F,0XC9,0XE0,0X00,0X00,
+0X00,0X00,0X3C,0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XF8,0X00,0X00,
+0X00,0X00,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
+0X00,0X00,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XF8,0X00,0X00,
+0X00,0X01,0XFF,0XFF,0XFF,0XBC,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0X07,0X00,0X00,
+0X00,0X0F,0XFF,0XFF,0XF1,0X80,0X30,0X00,0X00,0X0F,0XFF,0XFF,0XC0,0X67,0XF0,0X00,
+0X00,0X0F,0XFF,0XFF,0X80,0X38,0X08,0X00,0X00,0X0F,0XFF,0XFC,0X00,0X10,0X00,0X00,
+0X00,0X1F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X1F,0XFD,0XE8,0X00,0X00,0X00,0X00,
+0X00,0X3F,0XDD,0XC8,0X00,0X00,0X00,0X00,0X00,0X7F,0XEF,0X88,0X18,0X00,0X18,0X00,
+0X01,0X7F,0X3F,0X08,0X18,0X00,0X18,0X00,0X07,0X7C,0X35,0X08,0X00,0X00,0X00,0X00,
+0X26,0X7E,0X00,0X0C,0X00,0X18,0X00,0X00,0X84,0X5E,0X00,0X04,0X00,0X3F,0XFE,0X00,
+0X84,0X1B,0XC0,0X02,0X00,0X40,0X01,0X00,0X84,0X00,0X00,0X01,0X80,0X80,0X01,0X00,
+0X84,0X00,0X00,0X00,0X7E,0X00,0X01,0X00,0X8E,0X00,0X00,0X23,0XFC,0X00,0X01,0X00,
+0X8E,0X00,0X00,0X98,0XE0,0X0C,0X02,0X00,0X8A,0X00,0X01,0X04,0X06,0X0F,0XFE,0X00,
+0X8A,0X00,0X02,0X02,0X08,0X80,0X21,0X86,0X8B,0X00,0X02,0X81,0X30,0X40,0X60,0X7E,
+0X89,0X00,0X07,0XC4,0XC0,0X21,0XB8,0X0C,0X89,0X00,0X0F,0XFE,0X20,0X1E,0X06,0X38,
+0X89,0X80,0X1F,0XFF,0XFC,0X00,0X00,0XC0,0X88,0X80,0X3F,0XFF,0XF8,0X00,0X00,0X00,
+0X88,0XC0,0X1F,0XFF,0XE8,0X00,0X00,0X00,0X88,0X40,0X0F,0XFF,0XE8,0X00,0X00,0X00,
+0X88,0X60,0X07,0XFF,0XFC,0X00,0X00,0X00,0X88,0X20,0X07,0XFF,0XFE,0X00,0X00,0X00,
+0X88,0X30,0X07,0XFF,0XFC,0X80,0X00,0X00,0X88,0X18,0X03,0XFF,0XFC,0X00,0X00,0X00,
+0XC4,0X08,0X03,0XE3,0XFE,0X10,0X00,0X00,0XC4,0X0C,0X00,0XC3,0XF1,0X98,0X00,0X00,
+0XC4,0X06,0X00,0X00,0XE0,0XFC,0X00,0X00,0XC4,0XE3,0X00,0X00,0X00,0X18,0X00,0X00,
+0XA3,0XFD,0X00,0X00,0X0F,0XF0,0X00,0X00,0XA0,0X07,0X80,0X00,0X3A,0XC1,0X00,0X00,
+0XA0,0X03,0XC0,0X00,0XF2,0X00,0X80,0X00,0XA0,0X01,0XC0,0X00,0XF2,0X00,0X80,0X00,
+0XA0,0X00,0X60,0X00,0XFE,0X00,0X00,0X00,0XE0,0X00,0X20,0X00,0X4E,0X00,0X40,0X00,
+0XE0,0X00,0X30,0X00,0XC4,0X00,0X00,0X00,0XC0,0X00,0X10,0X00,0XC2,0X00,0X20,0X00,
+0XC0,0X00,0X18,0X77,0X82,0X00,0X80,0X00,0X80,0X00,0X0D,0XF7,0X81,0X01,0X00,0X00,
+0X80,0X00,0X05,0XB7,0X81,0X06,0X00,0X00,0X80,0X00,0X07,0XFF,0X01,0XFA,0X00,0X00,
+0X80,0X00,0X02,0XFD,0X00,0XC2,0X00,0X00,0X80,0X00,0X02,0X7F,0X00,0X82,0X00,0X00,
+0X80,0X00,0X03,0X7E,0X00,0XC2,0X00,0X00,0X80,0X00,0X01,0XFE,0X00,0X42,0X00,0X00,
+0X80,0X00,0X01,0XB4,0X00,0X42,0X00,0X00,0X80,0X00,0X00,0XBC,0X00,0X42,0X00,0X00,
+};
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scolor_TCS3200.cpp Fri Sep 03 05:26:27 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:26:27 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