Program for FRDM-64k for read five accelerometers

Dependencies:   FXOS8700CQ LSM303D MMA8451Q MPU6050 mbed

Fork of fxos8700cq_example by Thomas Murphy

main.cpp

Committer:
vinajarr
Date:
2016-12-05
Revision:
2:237bd73c27e9
Parent:
1:a7e3df03721c
Child:
4:c6b4d8c152cd

File content as of revision 2:237bd73c27e9:

#include "mbed.h"

#include "FXOS8700CQ.h"
#include "MMA8451Q.h"
#include "LSM303D.h"
#include "MPU6050.h"
#include "ADXL335.h"

#define SDA  PTE25
#define SCL  PTE24

#define MMA8451_I2C_ADDRESS (0x1c<<1)


#define DATA_RECORD_TIME_MS 1000

Serial pc(USBTX, USBRX); // Primary output to demonstrate library


//objetos de los acelerometros
MMA8451Q mma(SDA, SCL, MMA8451_I2C_ADDRESS);
LSM303D lsm(SDA, SCL);
ADXL335 adx(PTB2,PTB3,PTB10);
MPU6050 mpu(SDA, SCL); 
FXOS8700CQ fxos(SDA, SCL, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)

DigitalOut green(LED_GREEN); // waiting light
DigitalOut blue(LED_BLUE); // collection-in-progress light
DigitalOut red(LED_RED); // completed/error ligt

Timer t; // Microsecond timer, 32 bit int, maximum count of ~30 minutes
InterruptIn int_sw2(PTC6); // unused, common with SW2 on FRDM-K64F
InterruptIn fxos_int2(PTC13); // should just be the Data-Ready interrupt
InterruptIn int_sw3(PTA4); // switch SW3

// Interrupt status flags and data

bool fxos_int2_triggered = false;
uint32_t us_ellapsed = 0, beforePrint = 0;
bool sw2_push = false;
bool sw3_push = false;

// Storage for the data from the sensor
SRAWDATA acc[5];



void trigger_fxos_int2(void)
{
    fxos_int2_triggered = true;
    us_ellapsed = t.read_us();
}

void interruptSW3(void)
{
    sw3_push=true;
    
}

void print_cabecera(){
    pc.printf("T\t");
    for(int i=0;i<1;i++){
        pc.printf("X%d\tY%d\tZ%d\t",i,i,i);
    }
    pc.printf("\r\n");
    }
    
void print_data(){
    
    //us_ellapsed= t.read_us()-beforePrint;
    pc.printf("%d\t",t.read_us());
    for(int i=0;i<1;i++){
        pc.printf("%+.5f\t\t", acc[i].z);
       // pc.printf("%+.4f\t%+.4f\t%+.4f\t", acc[i].x, acc[i].y, acc[i].z);
    }
    pc.printf("\r\n");
    //beforePrint=t.read_us();
    
    }

void print_reading()
{
    us_ellapsed= t.read_us()-beforePrint;
    pc.printf("%d ",us_ellapsed);
    for(int i=0;i<5;i++){
        
    pc.printf("A[%d] X:%+.4f,Y:%+.4f,Z:%+.4f\t",
              i,
              acc[i].x, acc[i].y, acc[i].z
              );
    }
    pc.printf("\r\n");
    beforePrint=t.read_us();
}

void readAcc()
{
    
    //acelerometro 0
    
    while(!fxos_int2_triggered && fxos_int2.read()==1){}
    fxos_int2_triggered = false; // un-trigger
    fxos.get_dataAcc(&acc[0]); // clear interrupt from device
    /*
    //acelerometro 1
    acc[1].x=mma.getAccX();
    acc[1].y=mma.getAccY();
    acc[1].z=mma.getAccZ();
    
    //acelerometro 2
    float xyz[3];
    mpu.getAccelero( xyz );
    acc[2].x = xyz[0];
    acc[2].y = xyz[1];
    acc[2].z = xyz[2];
    
    //acelerometro 3
    lsm.readA(&acc[3].x,&acc[3].y,&acc[3].z); 
    
    //acclerometro 4
    adx.getAcc(acc[4]);
    */
   
}

void    initFxox(){
    SRAWDATA accel_data;
    // Diagnostic printing of the FXOS WHOAMI register value
    pc.printf("\r\n\nFXOS8700Q Who Am I= %X\r\n", fxos.get_whoami());
    fxos.enable();
    fxos.get_dataAcc(&accel_data);
    while(!fxos_int2_triggered && fxos_int2.read()==1){}
    fxos_int2_triggered = false; // un-trigger
    fxos.get_dataAcc(&accel_data); // clear interrupt from device
    pc.printf(" A[0] X:%+.4f,Y:%+.4f,Z:%+.4f\n\r",
              accel_data.x, accel_data.y, accel_data.z
              );
    }
    
void    initMma(){
    printf("MMA8451 ID: %d\n", mma.getWhoAmI());
    pc.printf(" A[1] X:%+.4f,Y:%+.4f,Z:%+.4f\n\r",
              mma.getAccX(), mma.getAccX(), mma.getAccX()
              );
    }
    
void    initMpu(){
        mpu.setAcceleroRange(MPU6050_ACCELERO_RANGE_2G);
         pc.printf("MPU6050 testConnection \n\r");
     
        bool mpu6050TestResult = mpu.testConnection();
        if(mpu6050TestResult) {
            pc.printf("\r\nMPU6050 test passed\r\n");
        } else {
            pc.printf("\r\nMPU6050 test failed \n\r");
        }
        float acc[3];
        
         pc.printf(" A[2] temp:%+.4f",
              mpu.getTemp()
              );
        mpu.getAccelero( acc );
        pc.printf(" X:%+.4f,Y:%+.4f,Z:%+.4f\r\n",
              acc[2], acc[1],acc[2]
              );     
}

void    initLsm(){
    double acc[3];
    if (lsm.readA(&acc[0],&acc[1],&acc[2])){
        pc.printf(" A[3] X:%+.4f,Y:%+.4f,Z:%+.4f\r\n",
              acc[2], acc[1],acc[2]
              );    
        }
    else{
        pc.printf(" LSM303D don't work ");
        }
}

int main(void)
{
    
    //inicializacion basico
    t.reset();
    pc.baud(230400); //probar con 460800 // Print quickly! 200Hz x line of output data!
    fxos_int2.fall(&trigger_fxos_int2);
    
    int_sw3.mode(PullUp);
    int_sw3.fall(&interruptSW3);
    
    int_sw2.mode(PullUp);
    
    
    // Lights off (FRDM-K64F has active-low LEDs)
    green.write(1);
    red.write(1);
    blue.write(1);
    
    //inicializacion Acelerometros
    initFxox();
    initMma();
    initMpu();
    initLsm();
    
    readAcc();
    print_reading();
    
    green.write(0);
    red.write(1);
    blue.write(1);
    
    
    //esperar a pulsador
    while(!sw3_push){
        wait_ms(50);
        }
        
    pc.printf("Iniciando lectura de acelerometros\r\n");
    
    green.write(1);
    red.write(1);
    blue.write(0);
    
    //lectura de todos los accelerometros
    t.start();
    print_cabecera();
    while(1){
    readAcc();
    print_data();
    if(int_sw2.read()==0) break;
    }
    
    green.write(1);
    red.write(0);
    blue.write(1);
    
    while(1){}
    
    
}