Program for FRDM-64k for read five accelerometers
Dependencies: FXOS8700CQ LSM303D MMA8451Q MPU6050 mbed
Fork of fxos8700cq_example by
main.cpp
- Committer:
- vinajarr
- Date:
- 2018-01-18
- Revision:
- 4:c6b4d8c152cd
- Parent:
- 2:237bd73c27e9
File content as of revision 4:c6b4d8c152cd:
#include "mbed.h" #include "SDFileSystem.h" Serial pc(USBTX, USBRX); // Primary output to demonstrate library SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS FILE *fp; #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 uint32_t do_list(const char *fsrc); I2C i2c(SDA, SCL); //objetos de los acelerometros MMA8451Q mma(&i2c, MMA8451_I2C_ADDRESS); LSM303D lsm(&i2c); ADXL335 adx(PTB2,PTB3,PTB10); MPU6050 mpu(&i2c); FXOS8700CQ fxos(&i2c, 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 fxos_int2(PTC13); // should just be the Data-Ready interrupt InterruptIn sw3_int(PTA4); // switch SW3 InterruptIn sw2_int(PTC6); // switch SW2 InterruptIn mpu_int(PTC3);// should just be the Data-Ready interrupt InterruptIn mma_int1(PTD1);// should just be the Data-Ready interrupt InterruptIn lsm_int1(PTA2); // should just be the Data-Ready interrupt // Interrupt status flags and data bool fxos_int2_triggered = false; bool mpu_int_triggered = false; bool mma_int1_triggered = false; bool lsm_int1_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]; volatile SRAWDATA ac; const uint16_t size = 400; volatile float accT[size][2]; volatile uint32_t tiempo[size][2]; volatile uint32_t puntero[2] = {0,0}; bool escribirSD = false; void fxos_int2_interrupt(void) { fxos_int2_triggered = true; //fxos.get_dataAcc(&acc[0]); } void mpu_int_interrupt (void) { mpu_int_triggered = true; } void mma_int1_interrupt (void) { mma_int1_triggered = true; ac.x=mma.getAccX(); ac.y=mma.getAccY(); ac.z=mma.getAccZ(); accT[puntero[0]][puntero[1]]=sqrt(ac.x*ac.x+ac.y*ac.y+ac.z*ac.z); tiempo[puntero[0]][puntero[1]]=t.read_us(); puntero[0]++; if(puntero[0]>(size-1)){ puntero[0]=0; puntero[1] = (puntero[1] + 1) % 2; escribirSD=true; } } void lsm_int1_interrupt (void) { lsm_int1_triggered = true; } void SW3_interrupt(void) { sw3_push=true; } void print_cabecera(){ pc.printf("T\t"); pc.printf("Va\t\t"); /*for(int i=1;i<5;i++){ pc.printf("Z%d\t\t",i); }*/ pc.printf("\r\n"); } void print_data(){ //us_ellapsed= t.read_us()-beforePrint; pc.printf("%d\t",t.read_us()); pc.printf("%.5f\t", accT); /*for(int i=0;i<5;i++){ if(i!=7){ pc.printf("%+.3f\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; beforePrint=t.read_us(); pc.printf("%d ",us_ellapsed); for(int i=1;i<5;i++){ pc.printf("A[%d] X:%+.3f,Y:%+.3f,Z:%+.3f\t", i, acc[i].x, acc[i].y, acc[i].z ); } pc.printf("\r\n"); } void readAcc() { uint64_t int_time = t.read_us(); //acelerometro 0 /* while(!fxos_int2_triggered && t.read_us()-int_time < 4000 && fxos_int2.read()){wait_us(1);} fxos_int2_triggered = false; // un-trigger fxos.get_dataAcc(&acc[0]); // clear interrupt from device if(t.read_us()-int_time>4000) pc.printf("Error lectura Fxos "); */ int_time = t.read_us(); while(!mma_int1_triggered && t.read_us()-int_time<4000 && mma_int1.read()){} mma_int1_triggered = false; // un-trigger //acelerometro 1 /*acc[1].x=mma.getAccX(); acc[1].y=mma.getAccY(); acc[1].z=mma.getAccZ();*/ //accT=sqrt(ac.x*ac.x+ac.y*ac.y+ac.z*ac.z); if(t.read_us()-int_time>4000) pc.printf("Error lectura mma \t\t"); /* int_time = t.read_us(); while(!mpu_int_triggered && t.read_us()-int_time<4000 && mpu_int.read()){wait_us(1);} mpu_int_triggered = false; // un-trigger //acelerometro 2 float xyz[3]; mpu.getAccelero( xyz ); mpu.read(0x3A); acc[2].x = xyz[0]; acc[2].y = xyz[1]; acc[2].z = xyz[2]; if(t.read_us()-int_time>4000) pc.printf("Error lectura mpu "); int_time = t.read_us(); while(!lsm_int1_triggered && t.read_us()-int_time<4000 && !lsm_int1.read()){ wait_us(1);} lsm_int1_triggered = false; // un-trigger //acelerometro 3 lsm.readA(&acc[3].x,&acc[3].y,&acc[3].z); if(t.read_us()-int_time>4000) pc.printf("Error lectura lsm "); //acclerometro 4 adx.getAcc(acc[4]); */ } void initFxox(){ // 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_int2.mode(PullUp); wait_ms(20); fxos_int2.fall(&fxos_int2_interrupt); /*for(int i=0;i<0x7A;i++){ uint8_t data =0; fxos.read_regs(i,&data,1); pc.printf("0x%x:\t0x%x\r\n",i,data); }*/ while(fxos_int2.read()==0){ uint8_t data =0; fxos.get_dataAcc(&acc[0]); fxos.read_regs(0x00,&data,1); pc.printf("0x%x:\t0x%x\r\n",0x00,data); } while(!fxos_int2_triggered){ wait_ms(1); } fxos_int2_triggered = false; // un-trigger fxos.get_dataAcc(&acc[0]); // clear interrupt from device pc.printf(" A[0] X:%+.4f,Y:%+.4f,Z:%+.4f\n\r", acc[0].x, acc[0].y, acc[0].z); } void initMma(){ pc.printf("MMA8451 ID: %d\n", mma.getWhoAmI()); /*for(int i=0;i<0x32;i++){ uint8_t data =0; mma.readRegs(i,&data,1); pc.printf("0x%x:\t0x%x\r\n",i,data); }*/ mma_int1.mode(PullUp); wait_ms(20); mma_int1.fall(&mma_int1_interrupt); while(mma_int1.read()==0){ ac.x=mma.getAccX(); ac.y=mma.getAccY(); ac.z=mma.getAccZ(); } while(!mma_int1_triggered){ wait_ms(1); } mma_int1_triggered = false; // un-trigger pc.printf(" A[1] X:%+.4f,Y:%+.4f,Z:%+.4f\r\n", mma.getAccX(), mma.getAccY(), mma.getAccZ() ); } void initMpu(){ float acc[3]; mpu.setAcceleroRange(MPU6050_ACCELERO_RANGE_2G); pc.printf("MPU6050 testConnection \r\n"); /*for(int i=0xD;i<0x76;i++) { pc.printf("Ox%x: 0x%x\r\n",i,mpu.read(i)); }*/ mpu_int.mode(PullUp); wait_ms(20); mpu_int.fall(&mpu_int_interrupt); while(mpu_int.read()==0){ mpu.getAccelero( acc ); pc.printf("Ox%x: 0x%x\r\n",0x3A,mpu.read(0x3A)); } while(!mpu_int_triggered){ wait_ms(1);} //wait interrupt mpu_int_triggered = false; // un-trigger bool mpu6050TestResult = mpu.testConnection(); if(mpu6050TestResult) { pc.printf("\r\nMPU6050 test passed\r\n"); } else { pc.printf("\r\nMPU6050 test failed \r\n"); } pc.printf(" A[2] temp:%+.4f", mpu.getTemp()); mpu.getAccelero( acc ); pc.printf(" X:%+.4f,Y:%+.4f,Z:%+.4f\r\n",acc[0], ac,acc[2]); pc.printf("Ox%x: 0x%x\r\n",0x3A,mpu.read(0x3A)); } void initLsm(){ double acc[3]; char reg_v=0; pc.printf("LSM303D comprobacion de configuracion: \r\n"); for(int i=0;i<0x3E;i++) { if(lsm.read_reg(addr_acc_mag,i,®_v)){ pc.printf("Ox%x: 0x%x\r\n",i,reg_v); } } lsm.readA(&acc[0],&acc[1],&acc[2]); lsm.readA(&acc[0],&acc[1],&acc[2]); lsm.read(&acc[0],&acc[1],&acc[2],&acc[0],&acc[1],&acc[2]); lsm.read(&acc[0],&acc[1],&acc[2],&acc[0],&acc[1],&acc[2]); lsm.read(&acc[0],&acc[1],&acc[2],&acc[0],&acc[1],&acc[2]); lsm.read(&acc[0],&acc[1],&acc[2],&acc[0],&acc[1],&acc[2]); for(int i=0;i<0x3E;i++) { if(lsm.read_reg(addr_acc_mag,i,®_v)){ pc.printf("Ox%x: 0x%x\r\n",i,reg_v); } } lsm_int1.mode(PullUp); wait_ms(20); lsm_int1.rise(&lsm_int1_interrupt); while(lsm_int1.read()==1){ lsm.readA(&acc[0],&acc[1],&acc[2]); /*if(lsm.read_reg(addr_acc_mag,0x27,®_v)){ //registro de status_A pc.printf("Ox%x: 0x%x\r\n",0x27,reg_v); }*/ } while(!lsm_int1_triggered){ wait_ms(1);} lsm_int1_triggered = false; // un-trigger 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(250000); sw3_int.mode(PullUp); sw3_int.fall(&SW3_interrupt); sw2_int.mode(PullUp); i2c.frequency(200000); //Configure speed I2C 200kHz // 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"); t.start(); initMma(); green.write(1); red.write(1); blue.write(0); //Escribir en la SD mkdir("/sd/data", 0777); uint32_t number = do_list("/sd/data"); char archivo[50]; snprintf(archivo,50,"/sd/data/%06ld.xls",number); fp = fopen(archivo, "w"); if (fp == NULL) { pc.printf("Unable to write the file \n"); while(1){wait(1);} } fprintf(fp,"T\tVa\r\n"); while(1) { if(escribirSD) { uint8_t j = puntero[1]==0?1:0; for(uint32_t i=0; i<size;i++) { fprintf(fp,"%d\t %.5f\r\n",tiempo[i][j],accT[i][j]); } escribirSD = false; } if(sw2_int.read()==0){ mma_int1.disable_irq (); for(uint32_t i=0; i<puntero[0];i++) { fprintf(fp,"%d\t %.5f\r\n",tiempo[i][puntero[1]],accT[i][puntero[1]]); } break; } } pc.printf("fin escritura \r\n"); fclose(fp); fp = fopen(archivo, "r"); if (fp == NULL) { pc.printf("Unable to open the file \n"); while(1){wait(1);} } DigitalIn enSerial(D8); enSerial.mode(PullUp); if(enSerial.read()==1){ while (1) { // print data por serial char ch = fgetc(fp); // until src EOF read. if (ch == EOF || ch == 0xFF) break; pc.printf("%c",ch); } } green.write(1); red.write(0); blue.write(1); while (1) {} /* //lectura de todos los accelerometros print_cabecera(); while(1){ readAcc(); print_data(); if(sw2_int.read()==0) break; } */ } uint32_t do_list(const char *fsrc) { DIR *d = opendir(fsrc); struct dirent *p; uint32_t counter = 0; while ((p = readdir(d)) != NULL) { counter++; printf("%s\n", p->d_name); } closedir(d); return counter; }