calibracion

main.cpp

Committer:
lauralamprea
Date:
2021-04-11
Revision:
1:ecce7ee00ac2
Parent:
0:2104545a6597

File content as of revision 1:ecce7ee00ac2:

#include "mbed.h"
#include "platform/mbed_thread.h"


// Blinking rate in milliseconds
#define BLINKING_RATE1_MS                                                    500
// Blinking rate in milliseconds
#define ADDRESS_MPU                                                         0XD0
#define CONS_AC                                                      2.0/32768.0
#define CONS_GY                                                    250.0/32768.0
#define CONS_T                                                            333.87
//estados iniciales en Hexadecimal
int16_t ini_ac_x, ini_ac_y, ini_ac_z;
int16_t ini_gy_x, ini_gy_y, ini_gy_z;
int16_t ini_tem;
//varibles para el offset
float of_ac_x, of_ac_y, of_ac_z;
float of_gy_x ,of_gy_y ,of_gy_z;
float of_tem;
// variable de max y min para offset
float max_off_ac_x=-32768.0, min_off_ac_x=32768.0,max_off_ac_y=-32768.0, min_off_ac_y=32768.0,max_off_ac_z=-32768.0, min_off_ac_z=32768.0;
float max_off_gy_x=-32768.0, min_off_gy_x=32768.0,
max_off_gy_y=-32768.0, min_off_gy_y=32768.0,
max_off_gy_z=-32768.0, min_off_gy_z=32768.0;

//variable finales
float ac_x, ac_y, ac_z;
float gy_x, gy_y, gy_z;
float tem;
//data
char cmda1[2];
char data[1];
char datos_ac_gy[14];
float buffer[500][8];
int j;
Timer ts;//objeto tiempo
float timer=0.0 , cont_timer=0.0, t_fin=10.0;
bool calibracion= true;
//inicializar conexiones
Serial com_pc(SERIAL_TX, SERIAL_RX);
I2C i2c(PB_9,PB_8);//sda,scl
DigitalIn eneable (PA_0);
int main()
{
    // Initialise the digital pin LED1 as an output
    DigitalOut led(LED2);
    cmda1[0]=0x6B;
    cmda1[1]=0x00;
    i2c.write(ADDRESS_MPU,cmda1,2);
    ////
    com_pc.printf("hizo la prueba de teset");
    cmda1[0]=0x75;
    i2c.write(ADDRESS_MPU,cmda1,1);
    i2c.read(ADDRESS_MPU,data,1);
    if (data[0]!=0x68){
        com_pc.printf("conexion fallida- \n");
        com_pc.printf("%#X",data[0]);
        }
        else{
        com_pc.printf("conexion exitosa- \n");
        com_pc.printf("%#X",data[0]);
        } 
    wait(0.1);   
    //configurar resolucion
    cmda1[0]=0x1B;//giroscopio
    cmda1[1]=0x00;
    i2c.write(ADDRESS_MPU,cmda1,2);
    cmda1[0]=0x1C;//acelerometro
    cmda1[1]=0x00;
    i2c.write(ADDRESS_MPU,cmda1,2);
    wait(0.1);        
    while (calibracion){
        led = 1;
        if(com_pc.getc() == 'c'){
            for (j=0; j<=100; j++){
                cmda1[0]=0x3B;
                i2c.write(ADDRESS_MPU,cmda1,1);
                i2c.read(ADDRESS_MPU,datos_ac_gy,14);
                ini_ac_x= datos_ac_gy[0]<<8 | datos_ac_gy[1]; 
                ini_ac_y= datos_ac_gy[2]<<8 | datos_ac_gy[3];
                ini_ac_z= datos_ac_gy[4]<<8 | datos_ac_gy[5];
                ini_tem = datos_ac_gy[6]<<8 | datos_ac_gy[7];
                ini_gy_x= datos_ac_gy[8]<<8 | datos_ac_gy[9]; 
                ini_gy_y= datos_ac_gy[10]<<8 | datos_ac_gy[11];
                ini_gy_z= datos_ac_gy[12]<<8 | datos_ac_gy[13];
                }
            wait(0.1);
            for (j=0; j<=100; j++){
                cmda1[0]=0x3B;
                i2c.write(ADDRESS_MPU,cmda1,1);
                i2c.read(ADDRESS_MPU,datos_ac_gy,14);
                ini_ac_x= datos_ac_gy[0]<<8 | datos_ac_gy[1]; 
                ini_ac_y= datos_ac_gy[2]<<8 | datos_ac_gy[3];
                ini_ac_z= datos_ac_gy[4]<<8 | datos_ac_gy[5];
                ini_tem = datos_ac_gy[6]<<8 | datos_ac_gy[7];
                ini_gy_x= datos_ac_gy[8]<<8 | datos_ac_gy[9]; 
                ini_gy_y= datos_ac_gy[10]<<8 | datos_ac_gy[11];
                ini_gy_z= datos_ac_gy[12]<<8 | datos_ac_gy[13];
                //calcular maximos y minimos
                if (ini_ac_x >= max_off_ac_x){
                    max_off_ac_x=ini_ac_x;
                }
                if (ini_ac_x <= min_off_ac_x){
                    min_off_ac_x=ini_ac_x;
                }
                if (ini_ac_y >= max_off_ac_y){
                    max_off_ac_y=ini_ac_y;
                }
                if (ini_ac_y <= min_off_ac_y){
                    min_off_ac_z = ini_ac_z;
                }
                if (ini_ac_z >= max_off_ac_z){
                    max_off_ac_y=ini_ac_y;
                }
                if (ini_ac_z <= min_off_ac_z){
                    min_off_ac_z = ini_ac_z;
                }
                if (ini_gy_x >= max_off_gy_x){
                    max_off_gy_x=ini_gy_x;
                }
                if (ini_gy_x <= max_off_gy_x){
                    max_off_gy_x=ini_gy_x;
                }
                if (ini_gy_y >= max_off_gy_y){
                    max_off_gy_y=ini_gy_y;
                }
                if (ini_gy_y <= max_off_gy_y){
                    max_off_gy_y=ini_gy_y;
                }
                if (ini_gy_z >= max_off_gy_z){
                    max_off_gy_z=ini_gy_z;
                }
                if (ini_gy_z <= max_off_gy_z){
                    max_off_gy_z=ini_gy_z;
                }   
            }
            wait(0.01);          
            of_ac_x=(max_off_ac_x + min_off_ac_x ) /2;
            of_ac_y=(max_off_ac_y + min_off_ac_y ) /2;
            of_ac_z=(max_off_ac_z + min_off_ac_z ) /2;
            of_gy_x=(max_off_gy_x + min_off_gy_x ) /2;
            of_gy_y=(max_off_gy_y + min_off_gy_y ) /2;
            of_gy_z=(max_off_gy_z + min_off_gy_z ) /2;      
            
            com_pc.printf("%.2f, %.2f, %.2f, %.2f, %.2f, %.2f\n",of_ac_x,of_ac_y,of_ac_z, of_gy_x,of_gy_y,of_gy_z);
            com_pc.printf("a\n");         
        }  
        if(com_pc.getc() == 'H'){
            j=1;
            led = 0;
            while (1){
                cmda1[0]=0x3B;
                ts.reset();
                ts.start();
                i2c.write(ADDRESS_MPU,cmda1,1);
                i2c.read(ADDRESS_MPU,datos_ac_gy,14);
                ini_ac_x= datos_ac_gy[0]<<8 | datos_ac_gy[1]; 
                ini_ac_y= datos_ac_gy[2]<<8 | datos_ac_gy[3];
                ini_ac_z= datos_ac_gy[4]<<8 | datos_ac_gy[5];
                ini_tem = datos_ac_gy[6]<<8 | datos_ac_gy[7];
                ini_gy_x= datos_ac_gy[8]<<8 | datos_ac_gy[9]; 
                ini_gy_y= datos_ac_gy[10]<<8 | datos_ac_gy[11];
                ini_gy_z= datos_ac_gy[12]<<8 | datos_ac_gy[13];
                wait_us(8425); 
                ts.stop();
                timer=ts.read();
                cont_timer += timer;
                com_pc.printf("%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%2f\n",j++,cont_timer,(float)ini_ac_x,(float)ini_ac_y,(float)ini_ac_z,(float)ini_gy_x,(float)ini_gy_y,(float)ini_gy_z); 
                if(cont_timer >= t_fin){
                    cont_timer=0.0;
                    com_pc.printf("A\n");
                    break;
                }             
            }  
        }
    }        
}