.

Dependencies:   mbed tsi_sensor MMA8451Q

Committer:
Naza00
Date:
Tue May 12 15:55:25 2020 +0000
Revision:
0:6c94c5ac5e8c
Child:
1:57b0bfa26afb
FUNCIONA

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Naza00 0:6c94c5ac5e8c 1 #include "mbed.h"
Naza00 0:6c94c5ac5e8c 2 #include "MMA8451Q.h"
Naza00 0:6c94c5ac5e8c 3
Naza00 0:6c94c5ac5e8c 4 #define ESPERA 0
Naza00 0:6c94c5ac5e8c 5 #define ORDEN 1
Naza00 0:6c94c5ac5e8c 6 #define FIN 2
Naza00 0:6c94c5ac5e8c 7
Naza00 0:6c94c5ac5e8c 8 #define X 0
Naza00 0:6c94c5ac5e8c 9 #define Y 1
Naza00 0:6c94c5ac5e8c 10 #define Z 2
Naza00 0:6c94c5ac5e8c 11 #define V 3
Naza00 0:6c94c5ac5e8c 12 #define S 4
Naza00 0:6c94c5ac5e8c 13
Naza00 0:6c94c5ac5e8c 14 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
Naza00 0:6c94c5ac5e8c 15 PinName const SDA = PTE25;
Naza00 0:6c94c5ac5e8c 16 PinName const SCL = PTE24;
Naza00 0:6c94c5ac5e8c 17 #elif defined (TARGET_KL05Z)
Naza00 0:6c94c5ac5e8c 18 PinName const SDA = PTB4;
Naza00 0:6c94c5ac5e8c 19 PinName const SCL = PTB3;
Naza00 0:6c94c5ac5e8c 20 #elif defined (TARGET_K20D50M)
Naza00 0:6c94c5ac5e8c 21 PinName const SDA = PTB1;
Naza00 0:6c94c5ac5e8c 22 PinName const SCL = PTB0;
Naza00 0:6c94c5ac5e8c 23 #else
Naza00 0:6c94c5ac5e8c 24 #error TARGET NOT DEFINED
Naza00 0:6c94c5ac5e8c 25 #endif
Naza00 0:6c94c5ac5e8c 26 #define MMA8451_I2C_ADDRESS (0x1d<<1)
Naza00 0:6c94c5ac5e8c 27
Naza00 0:6c94c5ac5e8c 28 //Definimos que el puerto serie se llama pc
Naza00 0:6c94c5ac5e8c 29 Serial pc(USBTX, USBRX);
Naza00 0:6c94c5ac5e8c 30
Naza00 0:6c94c5ac5e8c 31 //Variable donde se guarda lo leido
Naza00 0:6c94c5ac5e8c 32 char c = '\0';
Naza00 0:6c94c5ac5e8c 33
Naza00 0:6c94c5ac5e8c 34 //bit usado como flag para procesar datos
Naza00 0:6c94c5ac5e8c 35 bool newdata = false; //Se pone en true cuando hay nuevos datos
Naza00 0:6c94c5ac5e8c 36
Naza00 0:6c94c5ac5e8c 37
Naza00 0:6c94c5ac5e8c 38 AnalogIn voltaje_entrada(PTC1);
Naza00 0:6c94c5ac5e8c 39 DigitalIn entrada_digital(PTC7);
Naza00 0:6c94c5ac5e8c 40
Naza00 0:6c94c5ac5e8c 41 DigitalOut led1(LED1);
Naza00 0:6c94c5ac5e8c 42 DigitalOut led2(LED2);
Naza00 0:6c94c5ac5e8c 43 DigitalOut led3(LED3);
Naza00 0:6c94c5ac5e8c 44
Naza00 0:6c94c5ac5e8c 45 //Callback cuando se detecta una entrada
Naza00 0:6c94c5ac5e8c 46 void onCharReceived(){
Naza00 0:6c94c5ac5e8c 47
Naza00 0:6c94c5ac5e8c 48 //Copiamos lo leido en c
Naza00 0:6c94c5ac5e8c 49 c = pc.getc();
Naza00 0:6c94c5ac5e8c 50 newdata = true;
Naza00 0:6c94c5ac5e8c 51 }
Naza00 0:6c94c5ac5e8c 52 //Funciones
Naza00 0:6c94c5ac5e8c 53 int acelerometro_x();
Naza00 0:6c94c5ac5e8c 54 int acelerometro_y();
Naza00 0:6c94c5ac5e8c 55 int acelerometro_z();
Naza00 0:6c94c5ac5e8c 56 int adc();
Naza00 0:6c94c5ac5e8c 57 int in_digital();
Naza00 0:6c94c5ac5e8c 58 int lrc();
Naza00 0:6c94c5ac5e8c 59
Naza00 0:6c94c5ac5e8c 60 int estado=ESPERA;
Naza00 0:6c94c5ac5e8c 61 float x,y,z;
Naza00 0:6c94c5ac5e8c 62 int valor_x; //
Naza00 0:6c94c5ac5e8c 63 int valor_y; // VALORES BIEN DEL ACELEROMETRO
Naza00 0:6c94c5ac5e8c 64 int valor_z; //
Naza00 0:6c94c5ac5e8c 65 unsigned int valor_adc;
Naza00 0:6c94c5ac5e8c 66 float in_analog; //VALOR BIEN DE LA ENTRADA ANALOGICA
Naza00 0:6c94c5ac5e8c 67 int valor_dig=0; // VALOR BIEN DE LA ENTRADA DIGITAL
Naza00 0:6c94c5ac5e8c 68 int valor_analog;
Naza00 0:6c94c5ac5e8c 69 char vector_respuesta[10]= {0};
Naza00 0:6c94c5ac5e8c 70 int decena_valor_medido=0,unidad_valor_medido=0;
Naza00 0:6c94c5ac5e8c 71 unsigned char valor_lrc=0;
Naza00 0:6c94c5ac5e8c 72 int orden=0,a=0,j=0;
Naza00 0:6c94c5ac5e8c 73
Naza00 0:6c94c5ac5e8c 74 int main() {
Naza00 0:6c94c5ac5e8c 75
Naza00 0:6c94c5ac5e8c 76 //Apagamos los leds
Naza00 0:6c94c5ac5e8c 77 led1 = 1;
Naza00 0:6c94c5ac5e8c 78 led2 = 1;
Naza00 0:6c94c5ac5e8c 79 led3 = 1;
Naza00 0:6c94c5ac5e8c 80
Naza00 0:6c94c5ac5e8c 81 //Ejecutar onCharReceived por cada entrada por puerto
Naza00 0:6c94c5ac5e8c 82 pc.attach(&onCharReceived);
Naza00 0:6c94c5ac5e8c 83
Naza00 0:6c94c5ac5e8c 84 while(true){
Naza00 0:6c94c5ac5e8c 85 if(newdata){
Naza00 0:6c94c5ac5e8c 86 newdata = false;
Naza00 0:6c94c5ac5e8c 87 switch(estado){
Naza00 0:6c94c5ac5e8c 88
Naza00 0:6c94c5ac5e8c 89 case ESPERA:
Naza00 0:6c94c5ac5e8c 90 if(c=='@'){
Naza00 0:6c94c5ac5e8c 91 estado=ORDEN;
Naza00 0:6c94c5ac5e8c 92 vector_respuesta[0]='@';
Naza00 0:6c94c5ac5e8c 93 c = '\0';
Naza00 0:6c94c5ac5e8c 94 }
Naza00 0:6c94c5ac5e8c 95 break;
Naza00 0:6c94c5ac5e8c 96
Naza00 0:6c94c5ac5e8c 97 case ORDEN:
Naza00 0:6c94c5ac5e8c 98 switch(c){
Naza00 0:6c94c5ac5e8c 99
Naza00 0:6c94c5ac5e8c 100 default:
Naza00 0:6c94c5ac5e8c 101 estado = ESPERA;
Naza00 0:6c94c5ac5e8c 102 break;
Naza00 0:6c94c5ac5e8c 103
Naza00 0:6c94c5ac5e8c 104 case 'X':
Naza00 0:6c94c5ac5e8c 105 acelerometro_x();
Naza00 0:6c94c5ac5e8c 106 vector_respuesta[1]='X';
Naza00 0:6c94c5ac5e8c 107
Naza00 0:6c94c5ac5e8c 108 vector_respuesta[2]=valor_x/10;
Naza00 0:6c94c5ac5e8c 109 vector_respuesta[3]=valor_x - (vector_respuesta[2] * 10);
Naza00 0:6c94c5ac5e8c 110
Naza00 0:6c94c5ac5e8c 111 a=vector_respuesta[2];
Naza00 0:6c94c5ac5e8c 112 j=vector_respuesta[3];
Naza00 0:6c94c5ac5e8c 113 orden='X';
Naza00 0:6c94c5ac5e8c 114
Naza00 0:6c94c5ac5e8c 115 lrc();
Naza00 0:6c94c5ac5e8c 116
Naza00 0:6c94c5ac5e8c 117 if(c=='%'){
Naza00 0:6c94c5ac5e8c 118 estado=FIN;
Naza00 0:6c94c5ac5e8c 119 }
Naza00 0:6c94c5ac5e8c 120
Naza00 0:6c94c5ac5e8c 121 c = '\0';
Naza00 0:6c94c5ac5e8c 122 break;
Naza00 0:6c94c5ac5e8c 123
Naza00 0:6c94c5ac5e8c 124 case 'Y':
Naza00 0:6c94c5ac5e8c 125 acelerometro_y();
Naza00 0:6c94c5ac5e8c 126 vector_respuesta[1]='Y';
Naza00 0:6c94c5ac5e8c 127
Naza00 0:6c94c5ac5e8c 128 vector_respuesta[2]=valor_y/10;
Naza00 0:6c94c5ac5e8c 129 vector_respuesta[3]=valor_y - (vector_respuesta[2] * 10);
Naza00 0:6c94c5ac5e8c 130
Naza00 0:6c94c5ac5e8c 131 a=vector_respuesta[2];
Naza00 0:6c94c5ac5e8c 132 j=vector_respuesta[3];
Naza00 0:6c94c5ac5e8c 133 orden='Y';
Naza00 0:6c94c5ac5e8c 134
Naza00 0:6c94c5ac5e8c 135 lrc();
Naza00 0:6c94c5ac5e8c 136
Naza00 0:6c94c5ac5e8c 137 if(c=='%'){
Naza00 0:6c94c5ac5e8c 138 estado=FIN;
Naza00 0:6c94c5ac5e8c 139 }
Naza00 0:6c94c5ac5e8c 140
Naza00 0:6c94c5ac5e8c 141 c = '\0';
Naza00 0:6c94c5ac5e8c 142 break;
Naza00 0:6c94c5ac5e8c 143
Naza00 0:6c94c5ac5e8c 144 case 'Z':
Naza00 0:6c94c5ac5e8c 145 acelerometro_z();
Naza00 0:6c94c5ac5e8c 146 vector_respuesta[1]='Z';
Naza00 0:6c94c5ac5e8c 147
Naza00 0:6c94c5ac5e8c 148 vector_respuesta[2]=valor_z/10;
Naza00 0:6c94c5ac5e8c 149 vector_respuesta[3]=valor_z - (vector_respuesta[2] * 10);
Naza00 0:6c94c5ac5e8c 150
Naza00 0:6c94c5ac5e8c 151 a=vector_respuesta[2];
Naza00 0:6c94c5ac5e8c 152 j=vector_respuesta[3];
Naza00 0:6c94c5ac5e8c 153 orden='Z';
Naza00 0:6c94c5ac5e8c 154
Naza00 0:6c94c5ac5e8c 155 lrc();
Naza00 0:6c94c5ac5e8c 156
Naza00 0:6c94c5ac5e8c 157 if(c=='%'){
Naza00 0:6c94c5ac5e8c 158 estado=FIN;
Naza00 0:6c94c5ac5e8c 159 }
Naza00 0:6c94c5ac5e8c 160
Naza00 0:6c94c5ac5e8c 161 c = '\0';
Naza00 0:6c94c5ac5e8c 162 break;
Naza00 0:6c94c5ac5e8c 163
Naza00 0:6c94c5ac5e8c 164 case 'V':
Naza00 0:6c94c5ac5e8c 165 adc();
Naza00 0:6c94c5ac5e8c 166 vector_respuesta[1]='V';
Naza00 0:6c94c5ac5e8c 167
Naza00 0:6c94c5ac5e8c 168 vector_respuesta[2]=valor_analog/10;
Naza00 0:6c94c5ac5e8c 169 vector_respuesta[3]=valor_analog-(vector_respuesta[2]*10);
Naza00 0:6c94c5ac5e8c 170
Naza00 0:6c94c5ac5e8c 171 a=vector_respuesta[2];
Naza00 0:6c94c5ac5e8c 172 j=vector_respuesta[3];
Naza00 0:6c94c5ac5e8c 173 orden='V';
Naza00 0:6c94c5ac5e8c 174
Naza00 0:6c94c5ac5e8c 175 lrc();
Naza00 0:6c94c5ac5e8c 176 wait_ms(250);
Naza00 0:6c94c5ac5e8c 177
Naza00 0:6c94c5ac5e8c 178 if(c=='%'){
Naza00 0:6c94c5ac5e8c 179 estado=FIN;
Naza00 0:6c94c5ac5e8c 180 }
Naza00 0:6c94c5ac5e8c 181
Naza00 0:6c94c5ac5e8c 182 c = '\0';
Naza00 0:6c94c5ac5e8c 183 break;
Naza00 0:6c94c5ac5e8c 184
Naza00 0:6c94c5ac5e8c 185 case 'S':
Naza00 0:6c94c5ac5e8c 186 in_digital();
Naza00 0:6c94c5ac5e8c 187 vector_respuesta[1]='S';
Naza00 0:6c94c5ac5e8c 188
Naza00 0:6c94c5ac5e8c 189 vector_respuesta[2]=0;
Naza00 0:6c94c5ac5e8c 190 vector_respuesta[3]=valor_dig;
Naza00 0:6c94c5ac5e8c 191 a=0;
Naza00 0:6c94c5ac5e8c 192 j=vector_respuesta[3];
Naza00 0:6c94c5ac5e8c 193 orden='S';
Naza00 0:6c94c5ac5e8c 194
Naza00 0:6c94c5ac5e8c 195 lrc();
Naza00 0:6c94c5ac5e8c 196 wait_ms(250);
Naza00 0:6c94c5ac5e8c 197
Naza00 0:6c94c5ac5e8c 198 if(c=='%'){
Naza00 0:6c94c5ac5e8c 199 estado=FIN;
Naza00 0:6c94c5ac5e8c 200 }
Naza00 0:6c94c5ac5e8c 201
Naza00 0:6c94c5ac5e8c 202 c = '\0';
Naza00 0:6c94c5ac5e8c 203 break;
Naza00 0:6c94c5ac5e8c 204
Naza00 0:6c94c5ac5e8c 205 case '@':
Naza00 0:6c94c5ac5e8c 206 break;
Naza00 0:6c94c5ac5e8c 207 }
Naza00 0:6c94c5ac5e8c 208 break;
Naza00 0:6c94c5ac5e8c 209
Naza00 0:6c94c5ac5e8c 210 case FIN:
Naza00 0:6c94c5ac5e8c 211 vector_respuesta[4]='%';
Naza00 0:6c94c5ac5e8c 212 printf("\r\n%c%c%d%d%x%c",vector_respuesta[0],vector_respuesta[1],vector_respuesta[2],vector_respuesta[3],valor_lrc,vector_respuesta[4]);
Naza00 0:6c94c5ac5e8c 213 estado=ESPERA;
Naza00 0:6c94c5ac5e8c 214 c = '\0';
Naza00 0:6c94c5ac5e8c 215 break;
Naza00 0:6c94c5ac5e8c 216
Naza00 0:6c94c5ac5e8c 217 } //switch
Naza00 0:6c94c5ac5e8c 218 }// if newdata
Naza00 0:6c94c5ac5e8c 219 } //while
Naza00 0:6c94c5ac5e8c 220 } //main
Naza00 0:6c94c5ac5e8c 221
Naza00 0:6c94c5ac5e8c 222
Naza00 0:6c94c5ac5e8c 223 int acelerometro_x(){
Naza00 0:6c94c5ac5e8c 224 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
Naza00 0:6c94c5ac5e8c 225 x = abs(acc.getAccX());
Naza00 0:6c94c5ac5e8c 226 wait(0.1f);
Naza00 0:6c94c5ac5e8c 227 valor_x=x*100;
Naza00 0:6c94c5ac5e8c 228 return valor_x;
Naza00 0:6c94c5ac5e8c 229 }
Naza00 0:6c94c5ac5e8c 230
Naza00 0:6c94c5ac5e8c 231 int acelerometro_y(){
Naza00 0:6c94c5ac5e8c 232 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
Naza00 0:6c94c5ac5e8c 233 y = abs(acc.getAccY());
Naza00 0:6c94c5ac5e8c 234 wait(0.1f);
Naza00 0:6c94c5ac5e8c 235 valor_y=y*100;
Naza00 0:6c94c5ac5e8c 236 return valor_y;
Naza00 0:6c94c5ac5e8c 237 }
Naza00 0:6c94c5ac5e8c 238
Naza00 0:6c94c5ac5e8c 239 int acelerometro_z(){
Naza00 0:6c94c5ac5e8c 240 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
Naza00 0:6c94c5ac5e8c 241 z = abs(acc.getAccZ());
Naza00 0:6c94c5ac5e8c 242 wait(0.1f);
Naza00 0:6c94c5ac5e8c 243 valor_z=z*100;
Naza00 0:6c94c5ac5e8c 244 return valor_z;
Naza00 0:6c94c5ac5e8c 245 }
Naza00 0:6c94c5ac5e8c 246
Naza00 0:6c94c5ac5e8c 247 int adc(){
Naza00 0:6c94c5ac5e8c 248 valor_adc = voltaje_entrada.read_u16();
Naza00 0:6c94c5ac5e8c 249 in_analog = valor_adc * (3.3f / 65535.0f);
Naza00 0:6c94c5ac5e8c 250 valor_analog = in_analog*10;
Naza00 0:6c94c5ac5e8c 251 return valor_analog;
Naza00 0:6c94c5ac5e8c 252 }
Naza00 0:6c94c5ac5e8c 253
Naza00 0:6c94c5ac5e8c 254 int in_digital(){
Naza00 0:6c94c5ac5e8c 255 if(entrada_digital==1)valor_dig=1;
Naza00 0:6c94c5ac5e8c 256 else valor_dig=0;
Naza00 0:6c94c5ac5e8c 257
Naza00 0:6c94c5ac5e8c 258 return valor_dig;
Naza00 0:6c94c5ac5e8c 259 }
Naza00 0:6c94c5ac5e8c 260
Naza00 0:6c94c5ac5e8c 261 int lrc(){
Naza00 0:6c94c5ac5e8c 262 int inicio= '@';
Naza00 0:6c94c5ac5e8c 263 valor_lrc=0;
Naza00 0:6c94c5ac5e8c 264 valor_lrc ^= inicio;
Naza00 0:6c94c5ac5e8c 265 valor_lrc ^= orden;
Naza00 0:6c94c5ac5e8c 266 valor_lrc ^= (a + 48);
Naza00 0:6c94c5ac5e8c 267 valor_lrc ^= (j + 48);
Naza00 0:6c94c5ac5e8c 268
Naza00 0:6c94c5ac5e8c 269 return valor_lrc;
Naza00 0:6c94c5ac5e8c 270 }