Programa del TRABAJO PRACTICO PTC -- Mayo 2020

Dependencies:   mbed tsi_sensor MMA8451Q

Committer:
nacho9640
Date:
Tue Jun 23 19:05:24 2020 +0000
Revision:
2:e970a9093797
Parent:
1:268507041816
Trabajo Practico PTC; ; IGNACIO BETTIG

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nacho9640 0:da3f5e3d5442 1 #include "mbed.h"
nacho9640 0:da3f5e3d5442 2 #include "tsi_sensor.h"
nacho9640 0:da3f5e3d5442 3 #include "MMA8451Q.h"
nacho9640 0:da3f5e3d5442 4
nacho9640 0:da3f5e3d5442 5 #define MMA8451_I2C_ADDRESS (0x1d<<1)
nacho9640 0:da3f5e3d5442 6 #define ELEC0 9 //Electrodos TSI
nacho9640 0:da3f5e3d5442 7 #define ELEC1 10
nacho9640 0:da3f5e3d5442 8 #define NO_ACTIVO 0
nacho9640 0:da3f5e3d5442 9 #define ACTIVO 1
nacho9640 1:268507041816 10 #define TIEMPO_ACTIVO1 100
nacho9640 1:268507041816 11 #define TIEMPO_ACTIVO2 1700
nacho9640 0:da3f5e3d5442 12 #define PERIODO_INACTIVO 500
nacho9640 0:da3f5e3d5442 13 #define ANTIRREBOTE 40
nacho9640 0:da3f5e3d5442 14 #define EJES 250
nacho9640 1:268507041816 15 #define INICIO '@'
nacho9640 1:268507041816 16 #define FIN '#'
nacho9640 1:268507041816 17 #define ENVIAR_EJE_X '1'
nacho9640 1:268507041816 18 #define ENVIAR_EJE_Y '2'
nacho9640 1:268507041816 19 #define ENVIAR_EJE_Z '3'
nacho9640 1:268507041816 20 #define ENVIAR_ENTRADA_ANALOGICA '4'
nacho9640 1:268507041816 21 #define ENVIAR_ENTRADA_DIGITAL '5'
nacho9640 0:da3f5e3d5442 22
nacho9640 0:da3f5e3d5442 23 void Timer_Interrupt();
nacho9640 0:da3f5e3d5442 24 void UART_Interrupt();
nacho9640 0:da3f5e3d5442 25 char Recepcion(char);
nacho9640 0:da3f5e3d5442 26 void Dato_Enviar(double);
nacho9640 0:da3f5e3d5442 27
nacho9640 0:da3f5e3d5442 28 PinName const SDA = PTE25; //Config I2C Acelerometro
nacho9640 0:da3f5e3d5442 29 PinName const SCL = PTE24;
nacho9640 0:da3f5e3d5442 30
nacho9640 0:da3f5e3d5442 31 int Cont_Blink = 0, Rebote = 0, Cont_Ejes = 0;
nacho9640 0:da3f5e3d5442 32 bool Activo = 0;
nacho9640 0:da3f5e3d5442 33 char Caracter = 0;
nacho9640 0:da3f5e3d5442 34 bool Nuevo_Char = 0;
nacho9640 1:268507041816 35 char Accion, Dato_a_Enviar[3];
nacho9640 0:da3f5e3d5442 36
nacho9640 0:da3f5e3d5442 37 Ticker ticker; //Inicializo un Timer
nacho9640 0:da3f5e3d5442 38
nacho9640 0:da3f5e3d5442 39 DigitalIn InputRef(PTB9);
nacho9640 1:268507041816 40 DigitalOut LED_EXTERNO(PTB1);
nacho9640 0:da3f5e3d5442 41 DigitalOut ROJO(LED_RED);
nacho9640 0:da3f5e3d5442 42 DigitalOut AZUL(LED_BLUE);
nacho9640 0:da3f5e3d5442 43 DigitalOut VERDE(LED_GREEN);
nacho9640 0:da3f5e3d5442 44
nacho9640 0:da3f5e3d5442 45 AnalogIn Analog_Voltage(A0);
nacho9640 0:da3f5e3d5442 46
nacho9640 0:da3f5e3d5442 47 RawSerial UART(USBTX, USBRX);
nacho9640 0:da3f5e3d5442 48
nacho9640 0:da3f5e3d5442 49 int main() {
nacho9640 0:da3f5e3d5442 50 ticker.attach(&Timer_Interrupt, 0.001); //Se llamara a la funcion de timer cada 1mS
nacho9640 0:da3f5e3d5442 51 UART.attach(&UART_Interrupt); //Cada vez que se recibe algo se llama a la interrupcion de UART
nacho9640 0:da3f5e3d5442 52 TSIAnalogSlider tsi(ELEC0, ELEC1, 40); //Configuro cosita tactil
nacho9640 0:da3f5e3d5442 53 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); //Configuro Acelerometro
nacho9640 0:da3f5e3d5442 54
nacho9640 0:da3f5e3d5442 55 double Tactil = 0;
nacho9640 0:da3f5e3d5442 56 bool Toque = 1, Rx_OK = 0, Leer_Ejes = 0;
nacho9640 0:da3f5e3d5442 57 double EjeX = 0, EjeY = 0, EjeZ = 0;
nacho9640 1:268507041816 58 char Signo = 0, Verif = 0, Etapa_Activo = 1;
nacho9640 0:da3f5e3d5442 59 ROJO = 1; VERDE = 1; AZUL = 1;
nacho9640 0:da3f5e3d5442 60
nacho9640 0:da3f5e3d5442 61 while(1) {
nacho9640 0:da3f5e3d5442 62 Tactil = tsi.readPercentage();
nacho9640 0:da3f5e3d5442 63
nacho9640 1:268507041816 64 if(1 >= 3.3*Analog_Voltage){
nacho9640 1:268507041816 65 ROJO = 0; VERDE = 1; AZUL = 1;
nacho9640 1:268507041816 66 }else if(2 < 3.3 * Analog_Voltage){
nacho9640 1:268507041816 67 ROJO = 1; VERDE = 1; AZUL = 0;
nacho9640 1:268507041816 68 }else{
nacho9640 1:268507041816 69 ROJO = 1; VERDE = 0; AZUL = 1;
nacho9640 1:268507041816 70 }
nacho9640 1:268507041816 71
nacho9640 0:da3f5e3d5442 72 if(Cont_Ejes >= EJES){
nacho9640 0:da3f5e3d5442 73 Leer_Ejes = 1;
nacho9640 0:da3f5e3d5442 74 Cont_Ejes = 0;
nacho9640 0:da3f5e3d5442 75 }
nacho9640 0:da3f5e3d5442 76 if(Leer_Ejes){
nacho9640 0:da3f5e3d5442 77 EjeX = acc.getAccX();
nacho9640 0:da3f5e3d5442 78 EjeY = acc.getAccY();
nacho9640 0:da3f5e3d5442 79 EjeZ = acc.getAccZ();
nacho9640 0:da3f5e3d5442 80 Leer_Ejes = 0;
nacho9640 0:da3f5e3d5442 81 }
nacho9640 0:da3f5e3d5442 82
nacho9640 0:da3f5e3d5442 83 if(Tactil != NO_TOUCH && !Rebote && !Toque){
nacho9640 0:da3f5e3d5442 84 Rebote = 1; Toque = 1;
nacho9640 0:da3f5e3d5442 85 }
nacho9640 0:da3f5e3d5442 86
nacho9640 0:da3f5e3d5442 87 if(Tactil == NO_TOUCH) Toque = 0;
nacho9640 0:da3f5e3d5442 88
nacho9640 0:da3f5e3d5442 89 if(Rebote >= ANTIRREBOTE){
nacho9640 0:da3f5e3d5442 90 if(!Activo) Activo = ACTIVO;
nacho9640 0:da3f5e3d5442 91 else Activo = NO_ACTIVO;
nacho9640 0:da3f5e3d5442 92 Rebote = 0;
nacho9640 0:da3f5e3d5442 93 }
nacho9640 0:da3f5e3d5442 94
nacho9640 0:da3f5e3d5442 95 if(Activo){
nacho9640 1:268507041816 96 switch(Etapa_Activo){
nacho9640 1:268507041816 97 case 1:
nacho9640 1:268507041816 98 LED_EXTERNO = 1;
nacho9640 1:268507041816 99 if(Cont_Blink >= TIEMPO_ACTIVO1){
nacho9640 1:268507041816 100 Etapa_Activo = 2;
nacho9640 1:268507041816 101 Cont_Blink = 0;
nacho9640 1:268507041816 102 }
nacho9640 1:268507041816 103 break;
nacho9640 1:268507041816 104 case 2:
nacho9640 1:268507041816 105 LED_EXTERNO = 0;
nacho9640 1:268507041816 106 if(Cont_Blink >= TIEMPO_ACTIVO1){
nacho9640 1:268507041816 107 Etapa_Activo = 3;
nacho9640 1:268507041816 108 Cont_Blink = 0;
nacho9640 1:268507041816 109 }
nacho9640 1:268507041816 110 break;
nacho9640 1:268507041816 111 case 3:
nacho9640 1:268507041816 112 LED_EXTERNO = 1;
nacho9640 1:268507041816 113 if(Cont_Blink >= TIEMPO_ACTIVO1){
nacho9640 1:268507041816 114 Etapa_Activo = 4;
nacho9640 1:268507041816 115 Cont_Blink = 0;
nacho9640 1:268507041816 116 }
nacho9640 1:268507041816 117 break;
nacho9640 1:268507041816 118 case 4:
nacho9640 1:268507041816 119 LED_EXTERNO = 0;
nacho9640 1:268507041816 120 if(Cont_Blink >= TIEMPO_ACTIVO2){
nacho9640 1:268507041816 121 Etapa_Activo = 1;
nacho9640 1:268507041816 122 Cont_Blink = 0;
nacho9640 1:268507041816 123 }
nacho9640 1:268507041816 124 break;
nacho9640 1:268507041816 125 }
nacho9640 0:da3f5e3d5442 126 }else{
nacho9640 1:268507041816 127 if(Cont_Blink < PERIODO_INACTIVO/2) LED_EXTERNO = 1;
nacho9640 1:268507041816 128 else LED_EXTERNO = 0;
nacho9640 0:da3f5e3d5442 129
nacho9640 0:da3f5e3d5442 130 if(Cont_Blink >= PERIODO_INACTIVO) Cont_Blink = 0;
nacho9640 0:da3f5e3d5442 131 }
nacho9640 0:da3f5e3d5442 132
nacho9640 0:da3f5e3d5442 133 if(Nuevo_Char && Activo){
nacho9640 0:da3f5e3d5442 134 Rx_OK = Recepcion(Caracter);
nacho9640 0:da3f5e3d5442 135 Nuevo_Char = 0;
nacho9640 0:da3f5e3d5442 136 }
nacho9640 0:da3f5e3d5442 137
nacho9640 0:da3f5e3d5442 138 if(Rx_OK){
nacho9640 0:da3f5e3d5442 139
nacho9640 1:268507041816 140 if(Accion == ENVIAR_EJE_X){
nacho9640 0:da3f5e3d5442 141 if(EjeX < 0){
nacho9640 0:da3f5e3d5442 142 EjeX = EjeX * -1;
nacho9640 0:da3f5e3d5442 143 Signo = '-';
nacho9640 0:da3f5e3d5442 144 }else Signo = '+';
nacho9640 0:da3f5e3d5442 145 Dato_Enviar(EjeX);
nacho9640 2:e970a9093797 146 Verif = INICIO ^ ENVIAR_EJE_X ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0];
nacho9640 2:e970a9093797 147 printf("@1%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, FIN);
nacho9640 0:da3f5e3d5442 148 }
nacho9640 1:268507041816 149 if(Accion == ENVIAR_EJE_Y){
nacho9640 0:da3f5e3d5442 150 if(EjeY < 0){
nacho9640 0:da3f5e3d5442 151 EjeY = EjeY * -1;
nacho9640 0:da3f5e3d5442 152 Signo = '-';
nacho9640 0:da3f5e3d5442 153 }else Signo = '+';
nacho9640 0:da3f5e3d5442 154 Dato_Enviar(EjeY);
nacho9640 2:e970a9093797 155 Verif = INICIO ^ ENVIAR_EJE_Y ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0];
nacho9640 2:e970a9093797 156 printf("@2%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, FIN);
nacho9640 0:da3f5e3d5442 157 }
nacho9640 1:268507041816 158 if(Accion == ENVIAR_EJE_Z){
nacho9640 0:da3f5e3d5442 159 if(EjeZ < 0){
nacho9640 0:da3f5e3d5442 160 EjeZ = EjeZ * -1;
nacho9640 0:da3f5e3d5442 161 Signo = '-';
nacho9640 0:da3f5e3d5442 162 }else Signo = '+';
nacho9640 0:da3f5e3d5442 163 Dato_Enviar(EjeZ);
nacho9640 2:e970a9093797 164 Verif = INICIO ^ ENVIAR_EJE_Z ^ Signo ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0];
nacho9640 2:e970a9093797 165 printf("@3%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, FIN);
nacho9640 0:da3f5e3d5442 166 }
nacho9640 1:268507041816 167 if(Accion == ENVIAR_ENTRADA_ANALOGICA){
nacho9640 0:da3f5e3d5442 168 Dato_Enviar(Analog_Voltage*3.3);
nacho9640 2:e970a9093797 169 Verif = INICIO ^ ENVIAR_ENTRADA_ANALOGICA ^ Dato_a_Enviar[2] ^ Dato_a_Enviar[1] ^ Dato_a_Enviar[0];
nacho9640 2:e970a9093797 170 printf("@4%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, FIN);
nacho9640 0:da3f5e3d5442 171 }
nacho9640 1:268507041816 172 if(Accion == ENVIAR_ENTRADA_DIGITAL){
nacho9640 2:e970a9093797 173 Verif = INICIO ^ ENVIAR_ENTRADA_DIGITAL ^ (InputRef + 48);
nacho9640 2:e970a9093797 174 printf("@5%c%x%x%c\r\n", InputRef + 48,(Verif & 0xF0) >> 4, Verif & 0x0F, FIN);
nacho9640 0:da3f5e3d5442 175 }
nacho9640 0:da3f5e3d5442 176
nacho9640 0:da3f5e3d5442 177 Rx_OK = 0;
nacho9640 0:da3f5e3d5442 178 }
nacho9640 0:da3f5e3d5442 179 }
nacho9640 0:da3f5e3d5442 180 }
nacho9640 0:da3f5e3d5442 181
nacho9640 0:da3f5e3d5442 182 void Timer_Interrupt(){
nacho9640 0:da3f5e3d5442 183 Cont_Blink++;
nacho9640 0:da3f5e3d5442 184 Cont_Ejes++;
nacho9640 0:da3f5e3d5442 185 if(Rebote > 0) Rebote++;
nacho9640 0:da3f5e3d5442 186 }
nacho9640 0:da3f5e3d5442 187
nacho9640 0:da3f5e3d5442 188 void UART_Interrupt(){
nacho9640 0:da3f5e3d5442 189 Caracter = UART.getc();
nacho9640 0:da3f5e3d5442 190 Nuevo_Char = 1;
nacho9640 0:da3f5e3d5442 191 }
nacho9640 0:da3f5e3d5442 192
nacho9640 0:da3f5e3d5442 193 char Recepcion(char Dato){
nacho9640 0:da3f5e3d5442 194 char Ok = 0;
nacho9640 0:da3f5e3d5442 195 static char Estado = 0;
nacho9640 0:da3f5e3d5442 196 switch(Estado){
nacho9640 0:da3f5e3d5442 197 case(0):
nacho9640 0:da3f5e3d5442 198 if(Dato == INICIO)
nacho9640 0:da3f5e3d5442 199 Estado = 1;
nacho9640 0:da3f5e3d5442 200 break;
nacho9640 0:da3f5e3d5442 201 case(1):
nacho9640 1:268507041816 202 Accion = Dato;
nacho9640 0:da3f5e3d5442 203 Estado = 2;
nacho9640 0:da3f5e3d5442 204 break;
nacho9640 0:da3f5e3d5442 205 case(2):
nacho9640 0:da3f5e3d5442 206 if(Dato != FIN){
nacho9640 1:268507041816 207 Accion = 0;
nacho9640 0:da3f5e3d5442 208 }else
nacho9640 0:da3f5e3d5442 209 Ok = 1;
nacho9640 0:da3f5e3d5442 210 Estado = 0;
nacho9640 0:da3f5e3d5442 211 break;
nacho9640 0:da3f5e3d5442 212 }
nacho9640 0:da3f5e3d5442 213
nacho9640 0:da3f5e3d5442 214 return Ok;
nacho9640 0:da3f5e3d5442 215 }
nacho9640 0:da3f5e3d5442 216
nacho9640 0:da3f5e3d5442 217 void Dato_Enviar(double Dato){
nacho9640 0:da3f5e3d5442 218 Dato_a_Enviar[2] = (char)Dato;
nacho9640 0:da3f5e3d5442 219 Dato_a_Enviar[1] = ((char)(Dato*10))%10;
nacho9640 0:da3f5e3d5442 220 Dato_a_Enviar[0] = (char)(Dato*100.0f - Dato_a_Enviar[2]*100 - Dato_a_Enviar[1]*10) + 48;
nacho9640 0:da3f5e3d5442 221 Dato_a_Enviar[2] += 48;
nacho9640 0:da3f5e3d5442 222 Dato_a_Enviar[1] += 48;
nacho9640 0:da3f5e3d5442 223 }