
Programa del TRABAJO PRACTICO PTC -- Mayo 2020
Dependencies: mbed tsi_sensor MMA8451Q
main.cpp@2:e970a9093797, 2020-06-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |