Program for FRDM-64k for read five accelerometers
Dependencies: FXOS8700CQ LSM303D MMA8451Q MPU6050 mbed
Fork of fxos8700cq_example by
main.cpp@1:a7e3df03721c, 2016-12-01 (annotated)
- Committer:
- vinajarr
- Date:
- Thu Dec 01 08:28:52 2016 +0000
- Revision:
- 1:a7e3df03721c
- Parent:
- 0:6c6060a8a2f6
- Child:
- 2:237bd73c27e9
program form measure by FRDM 64K five accelerometers
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
trm | 0:6c6060a8a2f6 | 1 | #include "mbed.h" |
vinajarr | 1:a7e3df03721c | 2 | |
trm | 0:6c6060a8a2f6 | 3 | #include "FXOS8700CQ.h" |
vinajarr | 1:a7e3df03721c | 4 | #include "MMA8451Q.h" |
vinajarr | 1:a7e3df03721c | 5 | #include "LSM303D.h" |
vinajarr | 1:a7e3df03721c | 6 | #include "MPU6050.h" |
vinajarr | 1:a7e3df03721c | 7 | #include "ADXL335.h" |
vinajarr | 1:a7e3df03721c | 8 | |
vinajarr | 1:a7e3df03721c | 9 | #define SDA PTE25 |
vinajarr | 1:a7e3df03721c | 10 | #define SCL PTE24 |
vinajarr | 1:a7e3df03721c | 11 | |
vinajarr | 1:a7e3df03721c | 12 | #define MMA8451_I2C_ADDRESS (0x1c<<1) |
vinajarr | 1:a7e3df03721c | 13 | |
trm | 0:6c6060a8a2f6 | 14 | |
trm | 0:6c6060a8a2f6 | 15 | #define DATA_RECORD_TIME_MS 1000 |
trm | 0:6c6060a8a2f6 | 16 | |
trm | 0:6c6060a8a2f6 | 17 | Serial pc(USBTX, USBRX); // Primary output to demonstrate library |
trm | 0:6c6060a8a2f6 | 18 | |
vinajarr | 1:a7e3df03721c | 19 | |
vinajarr | 1:a7e3df03721c | 20 | //objetos de los acelerometros |
vinajarr | 1:a7e3df03721c | 21 | FXOS8700CQ fxos(SDA, SCL, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1) |
vinajarr | 1:a7e3df03721c | 22 | MMA8451Q mma(SDA, SCL, MMA8451_I2C_ADDRESS); |
vinajarr | 1:a7e3df03721c | 23 | LSM303D lsm(SDA, SCL); |
vinajarr | 1:a7e3df03721c | 24 | ADXL335 adx(PTB2,PTB3,PTB10); |
vinajarr | 1:a7e3df03721c | 25 | MPU6050 mpu(SDA, SCL); |
vinajarr | 1:a7e3df03721c | 26 | |
trm | 0:6c6060a8a2f6 | 27 | |
trm | 0:6c6060a8a2f6 | 28 | DigitalOut green(LED_GREEN); // waiting light |
trm | 0:6c6060a8a2f6 | 29 | DigitalOut blue(LED_BLUE); // collection-in-progress light |
trm | 0:6c6060a8a2f6 | 30 | DigitalOut red(LED_RED); // completed/error ligt |
trm | 0:6c6060a8a2f6 | 31 | |
trm | 0:6c6060a8a2f6 | 32 | Timer t; // Microsecond timer, 32 bit int, maximum count of ~30 minutes |
vinajarr | 1:a7e3df03721c | 33 | InterruptIn int_sw2(PTC6); // unused, common with SW2 on FRDM-K64F |
trm | 0:6c6060a8a2f6 | 34 | InterruptIn fxos_int2(PTC13); // should just be the Data-Ready interrupt |
vinajarr | 1:a7e3df03721c | 35 | InterruptIn int_sw3(PTA4); // switch SW3 |
trm | 0:6c6060a8a2f6 | 36 | |
trm | 0:6c6060a8a2f6 | 37 | // Interrupt status flags and data |
vinajarr | 1:a7e3df03721c | 38 | |
trm | 0:6c6060a8a2f6 | 39 | bool fxos_int2_triggered = false; |
vinajarr | 1:a7e3df03721c | 40 | uint32_t us_ellapsed = 0, beforePrint = 0; |
vinajarr | 1:a7e3df03721c | 41 | bool sw2_push = false; |
vinajarr | 1:a7e3df03721c | 42 | bool sw3_push = false; |
trm | 0:6c6060a8a2f6 | 43 | |
trm | 0:6c6060a8a2f6 | 44 | // Storage for the data from the sensor |
vinajarr | 1:a7e3df03721c | 45 | SRAWDATA acc[5]; |
trm | 0:6c6060a8a2f6 | 46 | |
vinajarr | 1:a7e3df03721c | 47 | |
trm | 0:6c6060a8a2f6 | 48 | |
trm | 0:6c6060a8a2f6 | 49 | void trigger_fxos_int2(void) |
trm | 0:6c6060a8a2f6 | 50 | { |
trm | 0:6c6060a8a2f6 | 51 | fxos_int2_triggered = true; |
trm | 0:6c6060a8a2f6 | 52 | us_ellapsed = t.read_us(); |
trm | 0:6c6060a8a2f6 | 53 | } |
trm | 0:6c6060a8a2f6 | 54 | |
vinajarr | 1:a7e3df03721c | 55 | void interruptSW3(void) |
trm | 0:6c6060a8a2f6 | 56 | { |
vinajarr | 1:a7e3df03721c | 57 | sw3_push=true; |
vinajarr | 1:a7e3df03721c | 58 | |
trm | 0:6c6060a8a2f6 | 59 | } |
trm | 0:6c6060a8a2f6 | 60 | |
vinajarr | 1:a7e3df03721c | 61 | void print_cabecera(){ |
vinajarr | 1:a7e3df03721c | 62 | pc.printf("T\t"); |
vinajarr | 1:a7e3df03721c | 63 | for(int i=0;i<5;i++){ |
vinajarr | 1:a7e3df03721c | 64 | pc.printf("X%d\tY%d\tZ%d\t",i,i,i); |
vinajarr | 1:a7e3df03721c | 65 | } |
vinajarr | 1:a7e3df03721c | 66 | pc.printf("\r\n"); |
vinajarr | 1:a7e3df03721c | 67 | } |
vinajarr | 1:a7e3df03721c | 68 | |
vinajarr | 1:a7e3df03721c | 69 | void print_data(){ |
vinajarr | 1:a7e3df03721c | 70 | |
vinajarr | 1:a7e3df03721c | 71 | us_ellapsed= t.read_us()-beforePrint; |
vinajarr | 1:a7e3df03721c | 72 | pc.printf("%d\t",us_ellapsed); |
vinajarr | 1:a7e3df03721c | 73 | for(int i=0;i<5;i++){ |
vinajarr | 1:a7e3df03721c | 74 | pc.printf("%+.4f\t%+.4f\t%+.4f\t", acc[i].x, acc[i].y, acc[i].z); |
vinajarr | 1:a7e3df03721c | 75 | } |
vinajarr | 1:a7e3df03721c | 76 | pc.printf("\r\n"); |
vinajarr | 1:a7e3df03721c | 77 | beforePrint=t.read_us(); |
vinajarr | 1:a7e3df03721c | 78 | |
vinajarr | 1:a7e3df03721c | 79 | } |
vinajarr | 1:a7e3df03721c | 80 | |
trm | 0:6c6060a8a2f6 | 81 | void print_reading() |
trm | 0:6c6060a8a2f6 | 82 | { |
vinajarr | 1:a7e3df03721c | 83 | us_ellapsed= t.read_us()-beforePrint; |
vinajarr | 1:a7e3df03721c | 84 | pc.printf("%d ",us_ellapsed); |
vinajarr | 1:a7e3df03721c | 85 | for(int i=0;i<5;i++){ |
vinajarr | 1:a7e3df03721c | 86 | |
vinajarr | 1:a7e3df03721c | 87 | pc.printf("A[%d] X:%+.4f,Y:%+.4f,Z:%+.4f\t", |
vinajarr | 1:a7e3df03721c | 88 | i, |
vinajarr | 1:a7e3df03721c | 89 | acc[i].x, acc[i].y, acc[i].z |
vinajarr | 1:a7e3df03721c | 90 | ); |
vinajarr | 1:a7e3df03721c | 91 | } |
vinajarr | 1:a7e3df03721c | 92 | pc.printf("\r\n"); |
vinajarr | 1:a7e3df03721c | 93 | beforePrint=t.read_us(); |
vinajarr | 1:a7e3df03721c | 94 | } |
vinajarr | 1:a7e3df03721c | 95 | |
vinajarr | 1:a7e3df03721c | 96 | void readAcc() |
vinajarr | 1:a7e3df03721c | 97 | { |
vinajarr | 1:a7e3df03721c | 98 | |
vinajarr | 1:a7e3df03721c | 99 | //acelerometro 0 |
vinajarr | 1:a7e3df03721c | 100 | while(!fxos_int2_triggered && fxos_int2.read()==1){} |
vinajarr | 1:a7e3df03721c | 101 | fxos_int2_triggered = false; // un-trigger |
vinajarr | 1:a7e3df03721c | 102 | fxos.get_dataAcc(&acc[0]); // clear interrupt from device |
vinajarr | 1:a7e3df03721c | 103 | |
vinajarr | 1:a7e3df03721c | 104 | //acelerometro 1 |
vinajarr | 1:a7e3df03721c | 105 | acc[1].x=mma.getAccX(); |
vinajarr | 1:a7e3df03721c | 106 | acc[1].y=mma.getAccY(); |
vinajarr | 1:a7e3df03721c | 107 | acc[1].z=mma.getAccZ(); |
vinajarr | 1:a7e3df03721c | 108 | |
vinajarr | 1:a7e3df03721c | 109 | //acelerometro 2 |
vinajarr | 1:a7e3df03721c | 110 | float xyz[3]; |
vinajarr | 1:a7e3df03721c | 111 | mpu.getAccelero( xyz ); |
vinajarr | 1:a7e3df03721c | 112 | acc[2].x = xyz[0]; |
vinajarr | 1:a7e3df03721c | 113 | acc[2].y = xyz[1]; |
vinajarr | 1:a7e3df03721c | 114 | acc[2].z = xyz[2]; |
vinajarr | 1:a7e3df03721c | 115 | |
vinajarr | 1:a7e3df03721c | 116 | //acelerometro 3 |
vinajarr | 1:a7e3df03721c | 117 | lsm.readA(&acc[3].x,&acc[3].y,&acc[3].z); |
vinajarr | 1:a7e3df03721c | 118 | |
vinajarr | 1:a7e3df03721c | 119 | //acclerometro 4 |
vinajarr | 1:a7e3df03721c | 120 | adx.getAcc(acc[4]); |
vinajarr | 1:a7e3df03721c | 121 | |
vinajarr | 1:a7e3df03721c | 122 | } |
vinajarr | 1:a7e3df03721c | 123 | |
vinajarr | 1:a7e3df03721c | 124 | void initFxox(){ |
vinajarr | 1:a7e3df03721c | 125 | SRAWDATA accel_data; |
vinajarr | 1:a7e3df03721c | 126 | // Diagnostic printing of the FXOS WHOAMI register value |
vinajarr | 1:a7e3df03721c | 127 | pc.printf("\r\n\nFXOS8700Q Who Am I= %X\r\n", fxos.get_whoami()); |
vinajarr | 1:a7e3df03721c | 128 | fxos.enable(); |
vinajarr | 1:a7e3df03721c | 129 | fxos.get_dataAcc(&accel_data); |
vinajarr | 1:a7e3df03721c | 130 | while(!fxos_int2_triggered && fxos_int2.read()==1){} |
vinajarr | 1:a7e3df03721c | 131 | fxos_int2_triggered = false; // un-trigger |
vinajarr | 1:a7e3df03721c | 132 | fxos.get_dataAcc(&accel_data); // clear interrupt from device |
vinajarr | 1:a7e3df03721c | 133 | pc.printf(" A[0] X:%+.4f,Y:%+.4f,Z:%+.4f\n\r", |
vinajarr | 1:a7e3df03721c | 134 | accel_data.x, accel_data.y, accel_data.z |
vinajarr | 1:a7e3df03721c | 135 | ); |
vinajarr | 1:a7e3df03721c | 136 | } |
vinajarr | 1:a7e3df03721c | 137 | |
vinajarr | 1:a7e3df03721c | 138 | void initMma(){ |
vinajarr | 1:a7e3df03721c | 139 | printf("MMA8451 ID: %d\n", mma.getWhoAmI()); |
vinajarr | 1:a7e3df03721c | 140 | pc.printf(" A[1] X:%+.4f,Y:%+.4f,Z:%+.4f\n\r", |
vinajarr | 1:a7e3df03721c | 141 | mma.getAccX(), mma.getAccX(), mma.getAccX() |
vinajarr | 1:a7e3df03721c | 142 | ); |
vinajarr | 1:a7e3df03721c | 143 | } |
vinajarr | 1:a7e3df03721c | 144 | |
vinajarr | 1:a7e3df03721c | 145 | void initMpu(){ |
vinajarr | 1:a7e3df03721c | 146 | mpu.setAcceleroRange(MPU6050_ACCELERO_RANGE_2G); |
vinajarr | 1:a7e3df03721c | 147 | pc.printf("MPU6050 testConnection \n\r"); |
vinajarr | 1:a7e3df03721c | 148 | |
vinajarr | 1:a7e3df03721c | 149 | bool mpu6050TestResult = mpu.testConnection(); |
vinajarr | 1:a7e3df03721c | 150 | if(mpu6050TestResult) { |
vinajarr | 1:a7e3df03721c | 151 | pc.printf("\r\nMPU6050 test passed\r\n"); |
vinajarr | 1:a7e3df03721c | 152 | } else { |
vinajarr | 1:a7e3df03721c | 153 | pc.printf("\r\nMPU6050 test failed \n\r"); |
vinajarr | 1:a7e3df03721c | 154 | } |
vinajarr | 1:a7e3df03721c | 155 | float acc[3]; |
vinajarr | 1:a7e3df03721c | 156 | |
vinajarr | 1:a7e3df03721c | 157 | pc.printf(" A[2] temp:%+.4f", |
vinajarr | 1:a7e3df03721c | 158 | mpu.getTemp() |
vinajarr | 1:a7e3df03721c | 159 | ); |
vinajarr | 1:a7e3df03721c | 160 | mpu.getAccelero( acc ); |
vinajarr | 1:a7e3df03721c | 161 | pc.printf(" X:%+.4f,Y:%+.4f,Z:%+.4f\r\n", |
vinajarr | 1:a7e3df03721c | 162 | acc[2], acc[1],acc[2] |
vinajarr | 1:a7e3df03721c | 163 | ); |
vinajarr | 1:a7e3df03721c | 164 | } |
vinajarr | 1:a7e3df03721c | 165 | |
vinajarr | 1:a7e3df03721c | 166 | void initLsm(){ |
vinajarr | 1:a7e3df03721c | 167 | double acc[3]; |
vinajarr | 1:a7e3df03721c | 168 | if (lsm.readA(&acc[0],&acc[1],&acc[2])){ |
vinajarr | 1:a7e3df03721c | 169 | pc.printf(" A[3] X:%+.4f,Y:%+.4f,Z:%+.4f\r\n", |
vinajarr | 1:a7e3df03721c | 170 | acc[2], acc[1],acc[2] |
vinajarr | 1:a7e3df03721c | 171 | ); |
vinajarr | 1:a7e3df03721c | 172 | } |
vinajarr | 1:a7e3df03721c | 173 | else{ |
vinajarr | 1:a7e3df03721c | 174 | pc.printf(" LSM303D don't work "); |
vinajarr | 1:a7e3df03721c | 175 | } |
trm | 0:6c6060a8a2f6 | 176 | } |
trm | 0:6c6060a8a2f6 | 177 | |
trm | 0:6c6060a8a2f6 | 178 | int main(void) |
trm | 0:6c6060a8a2f6 | 179 | { |
vinajarr | 1:a7e3df03721c | 180 | |
vinajarr | 1:a7e3df03721c | 181 | //inicializacion basico |
trm | 0:6c6060a8a2f6 | 182 | t.reset(); |
vinajarr | 1:a7e3df03721c | 183 | pc.baud(115200); //probar con 460800 // Print quickly! 200Hz x line of output data! |
vinajarr | 1:a7e3df03721c | 184 | fxos_int2.fall(&trigger_fxos_int2); |
vinajarr | 1:a7e3df03721c | 185 | |
vinajarr | 1:a7e3df03721c | 186 | int_sw3.mode(PullUp); |
vinajarr | 1:a7e3df03721c | 187 | int_sw3.fall(&interruptSW3); |
vinajarr | 1:a7e3df03721c | 188 | |
vinajarr | 1:a7e3df03721c | 189 | |
trm | 0:6c6060a8a2f6 | 190 | // Lights off (FRDM-K64F has active-low LEDs) |
trm | 0:6c6060a8a2f6 | 191 | green.write(1); |
trm | 0:6c6060a8a2f6 | 192 | red.write(1); |
trm | 0:6c6060a8a2f6 | 193 | blue.write(1); |
vinajarr | 1:a7e3df03721c | 194 | |
vinajarr | 1:a7e3df03721c | 195 | //inicializacion Acelerometros |
vinajarr | 1:a7e3df03721c | 196 | initFxox(); |
vinajarr | 1:a7e3df03721c | 197 | initMma(); |
vinajarr | 1:a7e3df03721c | 198 | initMpu(); |
vinajarr | 1:a7e3df03721c | 199 | initLsm(); |
vinajarr | 1:a7e3df03721c | 200 | |
vinajarr | 1:a7e3df03721c | 201 | readAcc(); |
trm | 0:6c6060a8a2f6 | 202 | print_reading(); |
vinajarr | 1:a7e3df03721c | 203 | |
vinajarr | 1:a7e3df03721c | 204 | //esperar a pulsador |
vinajarr | 1:a7e3df03721c | 205 | while(!sw3_push){ |
vinajarr | 1:a7e3df03721c | 206 | wait_ms(50); |
trm | 0:6c6060a8a2f6 | 207 | } |
vinajarr | 1:a7e3df03721c | 208 | |
vinajarr | 1:a7e3df03721c | 209 | pc.printf("Iniciando lectura de acelerometros\r\n"); |
vinajarr | 1:a7e3df03721c | 210 | |
vinajarr | 1:a7e3df03721c | 211 | //lectura de todos los accelerometros |
vinajarr | 1:a7e3df03721c | 212 | t.start(); |
vinajarr | 1:a7e3df03721c | 213 | print_cabecera(); |
vinajarr | 1:a7e3df03721c | 214 | while(1){ |
vinajarr | 1:a7e3df03721c | 215 | readAcc(); |
vinajarr | 1:a7e3df03721c | 216 | print_data(); |
trm | 0:6c6060a8a2f6 | 217 | } |
vinajarr | 1:a7e3df03721c | 218 | } |
trm | 0:6c6060a8a2f6 | 219 | |
trm | 0:6c6060a8a2f6 | 220 | |
trm | 0:6c6060a8a2f6 | 221 |