Program for FRDM-64k for read five accelerometers
Dependencies: FXOS8700CQ LSM303D MMA8451Q MPU6050 mbed
Fork of fxos8700cq_example by
main.cpp
- Committer:
- vinajarr
- Date:
- 2016-12-01
- Revision:
- 1:a7e3df03721c
- Parent:
- 0:6c6060a8a2f6
- Child:
- 2:237bd73c27e9
File content as of revision 1:a7e3df03721c:
#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 FXOS8700CQ fxos(SDA, SCL, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1) MMA8451Q mma(SDA, SCL, MMA8451_I2C_ADDRESS); LSM303D lsm(SDA, SCL); ADXL335 adx(PTB2,PTB3,PTB10); MPU6050 mpu(SDA, SCL); 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<5;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",us_ellapsed); for(int i=0;i<5;i++){ 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(115200); //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); // 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(); //esperar a pulsador while(!sw3_push){ wait_ms(50); } pc.printf("Iniciando lectura de acelerometros\r\n"); //lectura de todos los accelerometros t.start(); print_cabecera(); while(1){ readAcc(); print_data(); } }