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