
Programa del TRABAJO PRACTICO PTC -- Mayo 2020
Dependencies: mbed tsi_sensor MMA8451Q
Diff: main.cpp
- Revision:
- 0:da3f5e3d5442
- Child:
- 1:268507041816
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue May 12 18:46:22 2020 +0000 @@ -0,0 +1,189 @@ +#include "mbed.h" +#include "tsi_sensor.h" +#include "MMA8451Q.h" + +#define MMA8451_I2C_ADDRESS (0x1d<<1) +#define ELEC0 9 //Electrodos TSI +#define ELEC1 10 +#define NO_ACTIVO 0 +#define ACTIVO 1 +#define CUENTA_ACTIVO 200 +#define PERIODO_ACTIVO 1700 +#define PERIODO_INACTIVO 500 +#define ANTIRREBOTE 40 +#define EJES 250 +#define INICIO '$' +#define FIN '%' + +void Timer_Interrupt(); +void UART_Interrupt(); +char Recepcion(char); +void Dato_Enviar(double); + +PinName const SDA = PTE25; //Config I2C Acelerometro +PinName const SCL = PTE24; + +int Cont_Blink = 0, Rebote = 0, Cont_Ejes = 0; +bool Activo = 0; +char Caracter = 0; +bool Nuevo_Char = 0; +char Accion[2], Dato_a_Enviar[3]; + +Ticker ticker; //Inicializo un Timer + +DigitalIn InputRef(PTB9); +DigitalOut PWM(PTB1); +DigitalOut ROJO(LED_RED); +DigitalOut AZUL(LED_BLUE); +DigitalOut VERDE(LED_GREEN); + +AnalogIn Analog_Voltage(A0); + +RawSerial UART(USBTX, USBRX); + +int main() { + ticker.attach(&Timer_Interrupt, 0.001); //Se llamara a la funcion de timer cada 1mS + UART.attach(&UART_Interrupt); //Cada vez que se recibe algo se llama a la interrupcion de UART + TSIAnalogSlider tsi(ELEC0, ELEC1, 40); //Configuro cosita tactil + MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); //Configuro Acelerometro + + double Tactil = 0; + bool Toque = 1, Rx_OK = 0, Leer_Ejes = 0; + double EjeX = 0, EjeY = 0, EjeZ = 0; + char Signo = 0, Verif = 0; + ROJO = 1; VERDE = 1; AZUL = 1; + + while(1) { + Tactil = tsi.readPercentage(); + + if(Cont_Ejes >= EJES){ + Leer_Ejes = 1; + Cont_Ejes = 0; + } + if(Leer_Ejes){ + EjeX = acc.getAccX(); + EjeY = acc.getAccY(); + EjeZ = acc.getAccZ(); + Leer_Ejes = 0; + } + + if(Tactil != NO_TOUCH && !Rebote && !Toque){ + Rebote = 1; Toque = 1; + } + + if(Tactil == NO_TOUCH) Toque = 0; + + if(Rebote >= ANTIRREBOTE){ + if(!Activo) Activo = ACTIVO; + else Activo = NO_ACTIVO; + Rebote = 0; + } + + if(Activo){ + if(Cont_Blink < CUENTA_ACTIVO) PWM = 1; + else PWM = 0; + + if(Cont_Blink >= PERIODO_ACTIVO) Cont_Blink = 0; + }else{ + if(Cont_Blink < PERIODO_INACTIVO/2) PWM = 1; + else PWM = 0; + + if(Cont_Blink >= PERIODO_INACTIVO) Cont_Blink = 0; + } + + if(Nuevo_Char && Activo){ + Rx_OK = Recepcion(Caracter); + Nuevo_Char = 0; + } + + if(Rx_OK){ + + if(Accion[0] == 'A' && Accion[1] == 'X'){ + if(EjeX < 0){ + EjeX = EjeX * -1; + Signo = '-'; + }else Signo = '+'; + Dato_Enviar(EjeX); + Verif = '$' ^ 'A'^ 'X' ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; + printf("$AX%c%c%c%c%x%x%c\r\n",Signo, Dato_a_Enviar[2], Dato_a_Enviar[1], Dato_a_Enviar[0],(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); + } + if(Accion[0] == 'A' && Accion[1] == 'Y'){ + if(EjeY < 0){ + EjeY = EjeY * -1; + Signo = '-'; + }else Signo = '+'; + Dato_Enviar(EjeY); + Verif = '$' ^ 'A' ^ 'Y' ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; + printf("$AY%c%c%c%c%x%x%c\r\n",Signo, Dato_a_Enviar[2], Dato_a_Enviar[1], Dato_a_Enviar[0],(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); + } + if(Accion[0] == 'A' && Accion[1] == 'Z'){ + if(EjeZ < 0){ + EjeZ = EjeZ * -1; + Signo = '-'; + }else Signo = '+'; + Dato_Enviar(EjeZ); + Verif = '$' ^ 'A' ^ 'Z' ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; + printf("$AZ%c%c%c%c%x%x%c\r\n",Signo, Dato_a_Enviar[2], Dato_a_Enviar[1], Dato_a_Enviar[0],(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); + } + if(Accion[0] == 'V' && Accion[1] == '1'){ + Dato_Enviar(Analog_Voltage*3.3); + Verif = '$' ^ 'V'^ '1' ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0]; + printf("$V1%c%c%c%x%x%c\r\n", Dato_a_Enviar[2], Dato_a_Enviar[1], Dato_a_Enviar[0],(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); + } + if(Accion[0] == 'D' && Accion[1] == '1'){ + Verif = '$' ^ 'D'^ '1' ^ (InputRef + 48); + printf("$D1%c%x%x%c\r\n", InputRef + 48,(Verif & 0xF0) >> 4, Verif & 0x0F, '%'); + } + + Rx_OK = 0; + } + } +} + +void Timer_Interrupt(){ + Cont_Blink++; + Cont_Ejes++; + if(Rebote > 0) Rebote++; +} + +void UART_Interrupt(){ + Caracter = UART.getc(); + Nuevo_Char = 1; +} + +char Recepcion(char Dato){ + char Ok = 0; + static char Estado = 0; + switch(Estado){ + case(0): + if(Dato == INICIO) + Estado = 1; + break; + case(1): + Accion[0] = Dato; + Estado = 2; + break; + case(2): + Accion[1] = Dato; + Estado = 3; + break; + case(3): + if(Dato != FIN){ + Accion[0] = 0; + Accion[1] = 0; + }else + Ok = 1; + Estado = 0; + break; + } + + return Ok; +} + +void Dato_Enviar(double Dato){ + Dato_a_Enviar[2] = (char)Dato; + Dato_a_Enviar[1] = ((char)(Dato*10))%10; + Dato_a_Enviar[0] = (char)(Dato*100.0f - Dato_a_Enviar[2]*100 - Dato_a_Enviar[1]*10) + 48; + Dato_a_Enviar[2] += 48; + Dato_a_Enviar[1] += 48; +}