Programa del TRABAJO PRACTICO PTC -- Mayo 2020

Dependencies:   mbed tsi_sensor MMA8451Q

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