Algoritmo funcionando com a biblioteca de inatividade utilizando dos dados do acelerômetro e a biblioteca de PeakSearch se utilizando dos dados filtrados pelo filtro Kalman.

Dependencies:   mbed MatrixMath Matrix nrf51_rtc BMP180 MPU9250

Committer:
Rogercl
Date:
Wed Apr 03 22:52:28 2019 +0000
Revision:
2:5d0d7997e461
Parent:
1:d1002dc109b9
Child:
3:db3f7831bcea
teste

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rogercl 0:095b19b8fb7e 1 ///////////////// Breakout Board//////////////////
Rogercl 0:095b19b8fb7e 2 // OpenLog tx->27 rx->26
Rogercl 0:095b19b8fb7e 3 //MPL SCL->12 SDA->13 INT1->14 INT2->15
Rogercl 0:095b19b8fb7e 4 //MPU SDA->17 SCL->16
Rogercl 0:095b19b8fb7e 5
Rogercl 0:095b19b8fb7e 6
Rogercl 0:095b19b8fb7e 7 #include "mbed.h"
Rogercl 0:095b19b8fb7e 8 #include <events/mbed_events.h>
Rogercl 0:095b19b8fb7e 9 #include "ble/BLE.h"
Rogercl 0:095b19b8fb7e 10 #include "ble/Gap.h"
Rogercl 0:095b19b8fb7e 11 #include "ble/services/UARTService.h"
Rogercl 0:095b19b8fb7e 12 #include<string>
Rogercl 0:095b19b8fb7e 13 #include "nrf51_rtc.h"
Rogercl 0:095b19b8fb7e 14 #include "MPL3115A2.h" // Barometer
Rogercl 0:095b19b8fb7e 15 #include "MPU9250.h" //IMU
Rogercl 0:095b19b8fb7e 16
Rogercl 0:095b19b8fb7e 17 #define ON 0
Rogercl 0:095b19b8fb7e 18 #define OFF 1
Rogercl 0:095b19b8fb7e 19
Rogercl 0:095b19b8fb7e 20 UARTService *uart;
Rogercl 0:095b19b8fb7e 21 BLE &ble = BLE::Instance();
Rogercl 0:095b19b8fb7e 22 MPU9250 mpu9250;
Rogercl 0:095b19b8fb7e 23 Timer t;
Rogercl 0:095b19b8fb7e 24 Ticker interrupt;
Rogercl 0:095b19b8fb7e 25 DigitalOut led(p7); // Azul
Rogercl 0:095b19b8fb7e 26
Rogercl 0:095b19b8fb7e 27 const int SlaveAddressI2C = 0xC0; //This is the slave address of the device
Rogercl 0:095b19b8fb7e 28 // para o IMU
Rogercl 0:095b19b8fb7e 29 int status=-1; // Status da IMU
Rogercl 0:095b19b8fb7e 30 char I2C_Read[8];
Rogercl 0:095b19b8fb7e 31
Rogercl 0:095b19b8fb7e 32 char buff[500]; //used to printf all the data to OpenLog (Serial)
Rogercl 0:095b19b8fb7e 33 char buff_Values[500]; //used in the process to get de data to OpenLog (Serial)
Rogercl 0:095b19b8fb7e 34 char day1[10],day2[10]; //Store the day, to check if the day changed
Rogercl 0:095b19b8fb7e 35 int frame=0; //store the frames
Rogercl 0:095b19b8fb7e 36 int BaudRate=115200; //OpenLog's BaudRate
Rogercl 2:5d0d7997e461 37 float TimeInterrupt=20000; //Interruption time in [us] 1/20000[us] =50[Hz] ESTÁ EM 50HZ
Rogercl 0:095b19b8fb7e 38 float t1,t2; //time values
Rogercl 0:095b19b8fb7e 39 double aa, ta; //altimeter and temperature values
Rogercl 0:095b19b8fb7e 40 double ti; // temperature values - IMU
Rogercl 0:095b19b8fb7e 41 bool flagNewCapture = false; // Realiza nova captura somente quando os dados
Rogercl 0:095b19b8fb7e 42 // anteriores já foram gravados
Rogercl 0:095b19b8fb7e 43 bool flagPrint = true;
Rogercl 0:095b19b8fb7e 44
Rogercl 0:095b19b8fb7e 45 //Teste DTW
Rogercl 2:5d0d7997e461 46 float AcceABS=0; //Valor absoluto aceleração
Rogercl 2:5d0d7997e461 47 float AcceABSF=0; //Valor absoluto aceleração filtrado
Rogercl 0:095b19b8fb7e 48 float alfa=0.8;
Rogercl 0:095b19b8fb7e 49
Rogercl 2:5d0d7997e461 50 //variaveis DTW global
Rogercl 2:5d0d7997e461 51 int TBS=0;
Rogercl 2:5d0d7997e461 52 int steps=0;
Rogercl 2:5d0d7997e461 53 float Calibration=33;
Rogercl 2:5d0d7997e461 54 bool flagStep=false;
Rogercl 2:5d0d7997e461 55 int iiDTW=0;
Rogercl 2:5d0d7997e461 56 int kkDTW=0;
Rogercl 2:5d0d7997e461 57 #define StepSize 73
Rogercl 2:5d0d7997e461 58 float Signal[StepSize+1];
Rogercl 2:5d0d7997e461 59
Rogercl 2:5d0d7997e461 60
Rogercl 0:095b19b8fb7e 61 /////////////////Day and Time Configuration//////////////////////////////
Rogercl 0:095b19b8fb7e 62 // TODO : Update through BLE
Rogercl 0:095b19b8fb7e 63 char paciente[20]="TesteDTW";
Rogercl 0:095b19b8fb7e 64 char DD[3],MM[3],AA[3],hh[3],mm[3],ss[3];
Rogercl 0:095b19b8fb7e 65 /*
Rogercl 0:095b19b8fb7e 66 int Day=02;
Rogercl 0:095b19b8fb7e 67 int Month=06;
Rogercl 0:095b19b8fb7e 68 int Year=2018;
Rogercl 0:095b19b8fb7e 69 int Hour=10;
Rogercl 0:095b19b8fb7e 70 int Minutes=24;
Rogercl 0:095b19b8fb7e 71 int Seconds=00;
Rogercl 0:095b19b8fb7e 72 */
Rogercl 0:095b19b8fb7e 73 //////////////////////////////////////////////////////////////////////////
Rogercl 0:095b19b8fb7e 74
Rogercl 0:095b19b8fb7e 75 ////////////////Configurating peripherals/////////////////////////////
Rogercl 0:095b19b8fb7e 76 Serial Open(p27,p26); //tx,rx,baudrate // OpenLog
Rogercl 0:095b19b8fb7e 77 MPL3115A2 Sensor1(SlaveAddressI2C, p13, p12, p14, p15); //SDA SCL INT1 INT2 //
Rogercl 0:095b19b8fb7e 78 //MPL SCL->12 SDA->13 INT1->14 INT2->15
Rogercl 0:095b19b8fb7e 79 // barometro
Rogercl 0:095b19b8fb7e 80 //////////// Change MPU conections in myMPU9250.h/////////////// p17, p16
Rogercl 0:095b19b8fb7e 81 // Estao nesta parte poque dependem de delcarações anteriores
Rogercl 0:095b19b8fb7e 82 #include "SubDTW.h" // DTW
Rogercl 0:095b19b8fb7e 83 #include "time_config.h" //Time configuration and util
Rogercl 0:095b19b8fb7e 84 #include "file_comands.h" //File comands
Rogercl 0:095b19b8fb7e 85 #include "ble_comands.h" //ble
Rogercl 0:095b19b8fb7e 86
Rogercl 0:095b19b8fb7e 87
Rogercl 0:095b19b8fb7e 88 void get_values() //Function that get all the data from the sensors
Rogercl 0:095b19b8fb7e 89 {
Rogercl 0:095b19b8fb7e 90 frame=frame+1;
Rogercl 0:095b19b8fb7e 91
Rogercl 0:095b19b8fb7e 92 if (!flagNewCapture)
Rogercl 0:095b19b8fb7e 93 {
Rogercl 0:095b19b8fb7e 94 ////////////////////////////Getting MPU Values/////////////////////////
Rogercl 0:095b19b8fb7e 95 mpu9250.readAccelData(accelCount); // Read the x/y/z adc values
Rogercl 0:095b19b8fb7e 96
Rogercl 0:095b19b8fb7e 97 mpu9250.readGyroData(gyroCount); // Read the x/y/z adc values
Rogercl 0:095b19b8fb7e 98
Rogercl 0:095b19b8fb7e 99 mpu9250.readMagData(magCount); // Read the x/y/z adc values
Rogercl 0:095b19b8fb7e 100
Rogercl 0:095b19b8fb7e 101 tempCount = mpu9250.readTempData(); // Read the adc values
Rogercl 0:095b19b8fb7e 102
Rogercl 0:095b19b8fb7e 103 ////////////////////////////Getting Altimeter Values/////////////////////////
Rogercl 0:095b19b8fb7e 104 status = -1;
Rogercl 0:095b19b8fb7e 105 status = Sensor1.Read_Altitude_Data();
Rogercl 0:095b19b8fb7e 106
Rogercl 0:095b19b8fb7e 107 flagNewCapture = true;
Rogercl 0:095b19b8fb7e 108 }
Rogercl 0:095b19b8fb7e 109
Rogercl 0:095b19b8fb7e 110 } //end get_values()
Rogercl 0:095b19b8fb7e 111
Rogercl 0:095b19b8fb7e 112 /////////////////////Main Funcition////////////////////////
Rogercl 0:095b19b8fb7e 113
Rogercl 0:095b19b8fb7e 114 int main(void)
Rogercl 0:095b19b8fb7e 115 {
Rogercl 0:095b19b8fb7e 116 led=OFF; // led azul - que indica quando esta gravando no OpenLog
Rogercl 0:095b19b8fb7e 117
Rogercl 0:095b19b8fb7e 118 Open.set_flow_control(Serial::Disabled); // Without that the serial communication won't work
Rogercl 0:095b19b8fb7e 119 Open.baud(BaudRate); //Starting the serial comunication
Rogercl 0:095b19b8fb7e 120
Rogercl 0:095b19b8fb7e 121 getting_pacient_data();// Get the pacient name, date and time
Rogercl 0:095b19b8fb7e 122
Rogercl 0:095b19b8fb7e 123 // TODO: modificar para que o ultimo valor de hora esteja gravado ou no SD ou EEPROM,
Rogercl 0:095b19b8fb7e 124 // verificar se eh possivel manter o RTC ligado, mesmo com o micro desligado.
Rogercl 0:095b19b8fb7e 125 // ou então, criar um app que realize a atualização sempre que o dispositivo
Rogercl 0:095b19b8fb7e 126 // seja reiniciado.
Rogercl 0:095b19b8fb7e 127 time_init(); //initialize the RTC timer
Rogercl 0:095b19b8fb7e 128
Rogercl 0:095b19b8fb7e 129 // FIXME: atualmente sempre que reinicia o dispositivo ele sobrescreve o arquivo
Rogercl 0:095b19b8fb7e 130 // pre-existente, uma vez que a DataStamp setado eh igual
Rogercl 0:095b19b8fb7e 131 new_file(); //create a new file
Rogercl 0:095b19b8fb7e 132
Rogercl 0:095b19b8fb7e 133 ask_day(day1); // verificar se mudou o dia
Rogercl 0:095b19b8fb7e 134
Rogercl 0:095b19b8fb7e 135 //////////////////// Starting MPU ///////////////////////
Rogercl 0:095b19b8fb7e 136
Rogercl 0:095b19b8fb7e 137 // Read the WHO_AM_I register, this is a good test of communication
Rogercl 0:095b19b8fb7e 138 uint8_t whoami = mpu9250.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250); // Read WHO_AM_I register for MPU-9250
Rogercl 0:095b19b8fb7e 139 if (whoami == 0x71) // WHO_AM_I should always be 0x68
Rogercl 0:095b19b8fb7e 140 {
Rogercl 0:095b19b8fb7e 141 wait(1);
Rogercl 0:095b19b8fb7e 142 mpu9250.resetMPU9250(); // Reset registers to default in preparation for device calibration
Rogercl 0:095b19b8fb7e 143 mpu9250.MPU9250SelfTest(SelfTest); // Start by performing self test and reporting values
Rogercl 0:095b19b8fb7e 144 mpu9250.calibrateMPU9250(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers
Rogercl 0:095b19b8fb7e 145 wait(2);
Rogercl 0:095b19b8fb7e 146 mpu9250.initMPU9250();
Rogercl 0:095b19b8fb7e 147 mpu9250.initAK8963(magCalibration);
Rogercl 0:095b19b8fb7e 148 wait(1);
Rogercl 0:095b19b8fb7e 149 } //end if
Rogercl 0:095b19b8fb7e 150 else
Rogercl 0:095b19b8fb7e 151 {
Rogercl 0:095b19b8fb7e 152 Open.printf("Could not connect to MPU9250: \n\r");
Rogercl 0:095b19b8fb7e 153 // TODO/FIXME: Verificar se eh possivel disparar um Hardware/Reset quando a
Rogercl 0:095b19b8fb7e 154 // MPU não for inicializada
Rogercl 0:095b19b8fb7e 155 while(1) ; // Loop forever if communication doesn't happen
Rogercl 0:095b19b8fb7e 156 } //end else
Rogercl 0:095b19b8fb7e 157
Rogercl 0:095b19b8fb7e 158 mpu9250.getAres(); // Get accelerometer sensitivity
Rogercl 0:095b19b8fb7e 159 mpu9250.getGres(); // Get gyro sensitivity
Rogercl 0:095b19b8fb7e 160 mpu9250.getMres(); // Get magnetometer sensitivity
Rogercl 0:095b19b8fb7e 161
Rogercl 0:095b19b8fb7e 162 // TODO : Carregar ficheiros de calibração em funcao da temperatura
Rogercl 0:095b19b8fb7e 163 magbias[0] = +470.; // User environmental x-axis correction in milliGauss, should be automatically calculated
Rogercl 0:095b19b8fb7e 164 magbias[1] = +120.; // User environmental x-axis correction in milliGauss
Rogercl 0:095b19b8fb7e 165 magbias[2] = +125.; // User environmental x-axis correction in milliGauss
Rogercl 0:095b19b8fb7e 166
Rogercl 0:095b19b8fb7e 167 //////////////////// Starting MPL ///////////////////////
Rogercl 0:095b19b8fb7e 168 if(!Sensor1.Init())
Rogercl 0:095b19b8fb7e 169 {
Rogercl 0:095b19b8fb7e 170 // Open.printf("Altimeter Initialized\n\r");
Rogercl 0:095b19b8fb7e 171 } //end if
Rogercl 0:095b19b8fb7e 172 else
Rogercl 0:095b19b8fb7e 173 {
Rogercl 0:095b19b8fb7e 174 Open.printf("Altimeter Failed To Initialize\n\r");
Rogercl 0:095b19b8fb7e 175 while(1);
Rogercl 0:095b19b8fb7e 176 } //end els
Rogercl 0:095b19b8fb7e 177
Rogercl 0:095b19b8fb7e 178 wait(1); // 1 seg
Rogercl 0:095b19b8fb7e 179 ////////////////Interrupçã0///////////////////////
Rogercl 0:095b19b8fb7e 180 interrupt.attach_us(&get_values,TimeInterrupt); // the address of the function to be attached and the interval
Rogercl 0:095b19b8fb7e 181 t.start(); // inicia a interrupcao
Rogercl 0:095b19b8fb7e 182
Rogercl 0:095b19b8fb7e 183 led=ON; // indica q a gravacao (openlog) esta apta a ser inciada
Rogercl 0:095b19b8fb7e 184 wait_ms(1);
Rogercl 0:095b19b8fb7e 185 while (true)
Rogercl 0:095b19b8fb7e 186 {
Rogercl 0:095b19b8fb7e 187 ble.waitForEvent();
Rogercl 0:095b19b8fb7e 188 if(strcmp(data_ble,"Stop")== 0||strcmp(data_ble,"Stop ")== 0) //strcmp return 0 whhen true
Rogercl 0:095b19b8fb7e 189 {
Rogercl 0:095b19b8fb7e 190 led=OFF;
Rogercl 0:095b19b8fb7e 191 char alc[10];
Rogercl 0:095b19b8fb7e 192 sprintf(alc,"%d",steps);
Rogercl 0:095b19b8fb7e 193 uart->writeString("Steps: ");
Rogercl 0:095b19b8fb7e 194 uart->writeString(alc);
Rogercl 0:095b19b8fb7e 195 uart->writeString("\n");
Rogercl 2:5d0d7997e461 196 Open.printf("Quantidade total de passos: %d",steps);
Rogercl 0:095b19b8fb7e 197 return 0;
Rogercl 0:095b19b8fb7e 198 }
Rogercl 0:095b19b8fb7e 199 if (flagNewCapture)
Rogercl 0:095b19b8fb7e 200 {
Rogercl 0:095b19b8fb7e 201 t1=t.read_us();
Rogercl 0:095b19b8fb7e 202 ////////////////////////////Getting MPU Values/////////////////////////
Rogercl 0:095b19b8fb7e 203 // Now we'll calculate the accleration value into actual g's
Rogercl 0:095b19b8fb7e 204 ax = (float)accelCount[0]*aRes; // get actual g value, this depends on scale being set
Rogercl 0:095b19b8fb7e 205 ay = (float)accelCount[1]*aRes;
Rogercl 0:095b19b8fb7e 206 az = (float)accelCount[2]*aRes;
Rogercl 0:095b19b8fb7e 207
Rogercl 0:095b19b8fb7e 208 AcceABS=sqrt(ax*ax + ay*ay + az*az);
Rogercl 0:095b19b8fb7e 209 AcceABSF=alfa*AcceABSF+(1-alfa)*AcceABS;
Rogercl 0:095b19b8fb7e 210
Rogercl 0:095b19b8fb7e 211 // Calculate the gyro value into actual degrees per second
Rogercl 0:095b19b8fb7e 212 gx = (float)gyroCount[0]*gRes; // get actual gyro value, this depends on scale being set
Rogercl 0:095b19b8fb7e 213 gy = (float)gyroCount[1]*gRes;
Rogercl 0:095b19b8fb7e 214 gz = (float)gyroCount[2]*gRes;
Rogercl 0:095b19b8fb7e 215
Rogercl 0:095b19b8fb7e 216 // Calculate the magnetometer values in milliGauss
Rogercl 0:095b19b8fb7e 217 // Include factory calibration per data sheet and user environmental corrections
Rogercl 0:095b19b8fb7e 218 mx = (float)magCount[0]*mRes*magCalibration[0]; // get actual magnetometer value, this depends on scale being set
Rogercl 0:095b19b8fb7e 219 my = (float)magCount[1]*mRes*magCalibration[1];
Rogercl 0:095b19b8fb7e 220 mz = (float)magCount[2]*mRes*magCalibration[2];
Rogercl 0:095b19b8fb7e 221
Rogercl 0:095b19b8fb7e 222 ti = ((float) tempCount) / 333.87f + 21.0f; // Temperature in degrees Centigrade
Rogercl 0:095b19b8fb7e 223
Rogercl 0:095b19b8fb7e 224 mpu9250.MahonyQuaternionUpdate(ax, ay, az, gx, gy, gz, my, mx, mz);
Rogercl 0:095b19b8fb7e 225 aa=Sensor1.Altitude_m();
Rogercl 0:095b19b8fb7e 226 ta=Sensor1.Temp_C();
Rogercl 2:5d0d7997e461 227 wait_us(1);
Rogercl 0:095b19b8fb7e 228 //////////////////////////// Is there a new step? //////////////////
Rogercl 2:5d0d7997e461 229 if (iiDTW>StepSize)
Rogercl 2:5d0d7997e461 230 {
Rogercl 2:5d0d7997e461 231 Open.printf("iiDTW>StepSize \r\n");
Rogercl 2:5d0d7997e461 232 int jjDTW;
Rogercl 2:5d0d7997e461 233 for (jjDTW=0;jjDTW<=(StepSize-1);jjDTW=jjDTW+1)
Rogercl 2:5d0d7997e461 234 {
Rogercl 2:5d0d7997e461 235 Signal[jjDTW]=Signal[jjDTW+1];
Rogercl 2:5d0d7997e461 236 }
Rogercl 2:5d0d7997e461 237 Signal[StepSize]=AcceABSF;
Rogercl 2:5d0d7997e461 238 kkDTW=kkDTW+1;
Rogercl 2:5d0d7997e461 239
Rogercl 2:5d0d7997e461 240 if (kkDTW>=50);
Rogercl 2:5d0d7997e461 241 {
Rogercl 2:5d0d7997e461 242 kkDTW=0;
Rogercl 2:5d0d7997e461 243 SubDTW();
Rogercl 2:5d0d7997e461 244 }
Rogercl 2:5d0d7997e461 245 }
Rogercl 2:5d0d7997e461 246 else
Rogercl 2:5d0d7997e461 247 {
Rogercl 2:5d0d7997e461 248 Signal[iiDTW]=AcceABSF;
Rogercl 2:5d0d7997e461 249 iiDTW=iiDTW+1;
Rogercl 2:5d0d7997e461 250 kkDTW=kkDTW+1;
Rogercl 2:5d0d7997e461 251 }
Rogercl 1:d1002dc109b9 252
Rogercl 0:095b19b8fb7e 253
Rogercl 1:d1002dc109b9 254 if (flagPrint==true)
Rogercl 1:d1002dc109b9 255 {
Rogercl 1:d1002dc109b9 256 ////////////////////////////Printing Values/////////////////////////
Rogercl 1:d1002dc109b9 257 ask_time(buff);
Rogercl 1:d1002dc109b9 258 //sprintf(buff_Values,"%2.4f,%2.4f,%2.4f,%2.4f,%2.4f,%2.4f,%2.4f,%2.4f,%2.4f,%2.2f,%2.0f,%2.0f,%d\r\n",ax, ay, az, gx, gy, gz, mx, my, mz, aa, ta, ti, frame);
Rogercl 1:d1002dc109b9 259 sprintf(buff_Values,"Steps %d \r\n",steps);
Rogercl 1:d1002dc109b9 260 strcat(buff,buff_Values);
Rogercl 0:095b19b8fb7e 261
Rogercl 1:d1002dc109b9 262 ///////////////////////////////Cheking if the day changed/////////////////////////////////////
Rogercl 1:d1002dc109b9 263 ask_day(day2);
Rogercl 1:d1002dc109b9 264 if (strcmp (day2,day1) != 0) //compare todays day with the day that the file was created
Rogercl 1:d1002dc109b9 265 {
Rogercl 1:d1002dc109b9 266 new_file(); //cria novo arquivo
Rogercl 1:d1002dc109b9 267 ask_day(day1);
Rogercl 1:d1002dc109b9 268 } // end if
Rogercl 2:5d0d7997e461 269 //////////////////////////////////////////////////////////////////////////////////////////////
Rogercl 1:d1002dc109b9 270 if (flagStep==true)
Rogercl 1:d1002dc109b9 271 {
Rogercl 2:5d0d7997e461 272 Open.printf(buff); //Printing values on the SD card
Rogercl 2:5d0d7997e461 273 } //end if flag step
Rogercl 1:d1002dc109b9 274
Rogercl 1:d1002dc109b9 275 flagNewCapture = false;
Rogercl 1:d1002dc109b9 276 t2=t.read_us();
Rogercl 1:d1002dc109b9 277 if ((t2 - t1) < TimeInterrupt)
Rogercl 1:d1002dc109b9 278 {
Rogercl 1:d1002dc109b9 279 wait_us((TimeInterrupt) - (t2-t1));
Rogercl 1:d1002dc109b9 280 led=OFF;
Rogercl 1:d1002dc109b9 281 }//end if time
Rogercl 1:d1002dc109b9 282 led=ON;
Rogercl 1:d1002dc109b9 283 flagPrint=false;
Rogercl 1:d1002dc109b9 284 } //end if flag print
Rogercl 0:095b19b8fb7e 285 else
Rogercl 0:095b19b8fb7e 286 {
Rogercl 0:095b19b8fb7e 287 flagPrint=true;
Rogercl 0:095b19b8fb7e 288 }
Rogercl 0:095b19b8fb7e 289 } // end if flag new capture
Rogercl 0:095b19b8fb7e 290 } // end while true
Rogercl 0:095b19b8fb7e 291 } //end main