Serial output for sensors on FRDM-KL46Z
Dependencies: MAG3110 MMA8451Q TSI mbed
main.cpp@1:f3f39343f606, 2014-02-07 (annotated)
- Committer:
- aaronice
- Date:
- Fri Feb 07 00:35:25 2014 +0000
- Revision:
- 1:f3f39343f606
- Parent:
- 0:6a47f35289ea
Serial output of sensor data on FRDM-KL46Z
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aaronice | 0:6a47f35289ea | 1 | #include "mbed.h" |
aaronice | 0:6a47f35289ea | 2 | #include "MAG3110.h" |
aaronice | 0:6a47f35289ea | 3 | #include "MMA8451Q.h" |
aaronice | 0:6a47f35289ea | 4 | #include "TSISensor.h" |
aaronice | 0:6a47f35289ea | 5 | //#include "TEMT5200.h" |
aaronice | 0:6a47f35289ea | 6 | |
aaronice | 0:6a47f35289ea | 7 | Serial pc(USBTX, USBRX); // tx, rx |
aaronice | 0:6a47f35289ea | 8 | // Magnetometer |
aaronice | 0:6a47f35289ea | 9 | #define MAG3110_I2C_ADDRESS (0x0e<<1) |
aaronice | 0:6a47f35289ea | 10 | // MAG3110 mag(PTE25, PTE24, MAG3110_I2C_ADDRESS); |
aaronice | 0:6a47f35289ea | 11 | MAG3110 mag(PTE25, PTE24, &pc); |
aaronice | 0:6a47f35289ea | 12 | // Accelerometer |
aaronice | 0:6a47f35289ea | 13 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
aaronice | 0:6a47f35289ea | 14 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); |
aaronice | 0:6a47f35289ea | 15 | |
aaronice | 0:6a47f35289ea | 16 | // Slide sensor acts as a button |
aaronice | 0:6a47f35289ea | 17 | TSISensor tsi; |
aaronice | 0:6a47f35289ea | 18 | |
aaronice | 0:6a47f35289ea | 19 | // Ambient light sensor |
aaronice | 0:6a47f35289ea | 20 | // TEMPT5200 alux(PTE22); |
aaronice | 0:6a47f35289ea | 21 | |
aaronice | 0:6a47f35289ea | 22 | |
aaronice | 0:6a47f35289ea | 23 | DigitalOut GreenLED(LED1); |
aaronice | 0:6a47f35289ea | 24 | DigitalOut RedLED(LED2); |
aaronice | 0:6a47f35289ea | 25 | |
aaronice | 0:6a47f35289ea | 26 | void callback() { |
aaronice | 0:6a47f35289ea | 27 | // Note: you need to actually read from the serial to clear the RX interrupt |
aaronice | 0:6a47f35289ea | 28 | printf("%c\n", pc.getc()); |
aaronice | 0:6a47f35289ea | 29 | GreenLED = (!GreenLED)|(GreenLED); |
aaronice | 0:6a47f35289ea | 30 | wait(10); |
aaronice | 0:6a47f35289ea | 31 | GreenLED = !GreenLED; |
aaronice | 0:6a47f35289ea | 32 | } |
aaronice | 0:6a47f35289ea | 33 | |
aaronice | 0:6a47f35289ea | 34 | |
aaronice | 0:6a47f35289ea | 35 | void calXY() //magnetometer calibration: finding max and min of X, Y axis |
aaronice | 0:6a47f35289ea | 36 | { |
aaronice | 0:6a47f35289ea | 37 | int tempXmax, tempXmin, tempYmax, tempYmin, newX, newY; |
aaronice | 0:6a47f35289ea | 38 | |
aaronice | 0:6a47f35289ea | 39 | RedLED = 1; |
aaronice | 0:6a47f35289ea | 40 | |
aaronice | 0:6a47f35289ea | 41 | printf("Waiting for initial press\n"); |
aaronice | 0:6a47f35289ea | 42 | // Wait for slider to be pressed |
aaronice | 0:6a47f35289ea | 43 | while( tsi.readDistance() == 0 ) { |
aaronice | 0:6a47f35289ea | 44 | RedLED = 1; |
aaronice | 0:6a47f35289ea | 45 | wait(0.2); |
aaronice | 0:6a47f35289ea | 46 | RedLED =0; |
aaronice | 0:6a47f35289ea | 47 | wait(0.2); |
aaronice | 0:6a47f35289ea | 48 | } |
aaronice | 0:6a47f35289ea | 49 | |
aaronice | 0:6a47f35289ea | 50 | printf("Waiting for release\n"); |
aaronice | 0:6a47f35289ea | 51 | |
aaronice | 0:6a47f35289ea | 52 | // Wait for release |
aaronice | 0:6a47f35289ea | 53 | while( tsi.readDistance() != 0 ) { |
aaronice | 0:6a47f35289ea | 54 | RedLED =0; |
aaronice | 0:6a47f35289ea | 55 | wait(0.2); |
aaronice | 0:6a47f35289ea | 56 | RedLED = 1; |
aaronice | 0:6a47f35289ea | 57 | wait(0.2); |
aaronice | 0:6a47f35289ea | 58 | } |
aaronice | 0:6a47f35289ea | 59 | RedLED =0; |
aaronice | 0:6a47f35289ea | 60 | wait(0.5); |
aaronice | 0:6a47f35289ea | 61 | |
aaronice | 0:6a47f35289ea | 62 | printf("Rotate\n"); |
aaronice | 0:6a47f35289ea | 63 | |
aaronice | 0:6a47f35289ea | 64 | tempXmax = tempXmin = mag.readVal(MAG_OUT_X_MSB); |
aaronice | 0:6a47f35289ea | 65 | tempYmax = tempYmin = mag.readVal(MAG_OUT_Y_MSB); |
aaronice | 0:6a47f35289ea | 66 | |
aaronice | 0:6a47f35289ea | 67 | while(tsi.readDistance() == 0) { |
aaronice | 0:6a47f35289ea | 68 | GreenLED = 1; |
aaronice | 0:6a47f35289ea | 69 | wait(0.1); |
aaronice | 0:6a47f35289ea | 70 | GreenLED =0; |
aaronice | 0:6a47f35289ea | 71 | wait(0.1); |
aaronice | 0:6a47f35289ea | 72 | newX = mag.readVal(MAG_OUT_X_MSB); |
aaronice | 0:6a47f35289ea | 73 | newY = mag.readVal(MAG_OUT_Y_MSB); |
aaronice | 0:6a47f35289ea | 74 | if (newX > tempXmax) tempXmax = newX; |
aaronice | 0:6a47f35289ea | 75 | if (newX < tempXmin) tempXmin = newX; |
aaronice | 0:6a47f35289ea | 76 | if (newY > tempYmax) tempYmax = newY; |
aaronice | 0:6a47f35289ea | 77 | if (newY < tempYmin) tempYmin = newY; |
aaronice | 0:6a47f35289ea | 78 | } |
aaronice | 0:6a47f35289ea | 79 | |
aaronice | 0:6a47f35289ea | 80 | mag.setCalibration( tempXmin, tempXmax, tempYmin, tempYmax ); |
aaronice | 0:6a47f35289ea | 81 | |
aaronice | 0:6a47f35289ea | 82 | // Wait for release |
aaronice | 0:6a47f35289ea | 83 | while( tsi.readDistance() != 0 ) { |
aaronice | 0:6a47f35289ea | 84 | GreenLED =0; |
aaronice | 0:6a47f35289ea | 85 | wait(0.2); |
aaronice | 0:6a47f35289ea | 86 | GreenLED = 1; |
aaronice | 0:6a47f35289ea | 87 | wait(0.2); |
aaronice | 0:6a47f35289ea | 88 | } |
aaronice | 0:6a47f35289ea | 89 | GreenLED =0; |
aaronice | 0:6a47f35289ea | 90 | wait(1.0); |
aaronice | 0:6a47f35289ea | 91 | |
aaronice | 0:6a47f35289ea | 92 | } |
aaronice | 0:6a47f35289ea | 93 | |
aaronice | 0:6a47f35289ea | 94 | |
aaronice | 0:6a47f35289ea | 95 | int main(void){ |
aaronice | 0:6a47f35289ea | 96 | |
aaronice | 0:6a47f35289ea | 97 | pc.attach(&callback); |
aaronice | 0:6a47f35289ea | 98 | |
aaronice | 0:6a47f35289ea | 99 | // MAG3110 Calibration |
aaronice | 0:6a47f35289ea | 100 | printf("MAG3110 Test\n"); |
aaronice | 0:6a47f35289ea | 101 | |
aaronice | 0:6a47f35289ea | 102 | RedLED =0; |
aaronice | 0:6a47f35289ea | 103 | GreenLED = 1; |
aaronice | 0:6a47f35289ea | 104 | |
aaronice | 0:6a47f35289ea | 105 | // Get some values |
aaronice | 0:6a47f35289ea | 106 | printf("DR_STATUS %X\n", mag.readReg( MAG_DR_STATUS )); |
aaronice | 0:6a47f35289ea | 107 | printf("WHO_AM_I %X\n", mag.readReg( MAG_WHO_AM_I )); |
aaronice | 0:6a47f35289ea | 108 | printf("SYSMOD %X\n", mag.readReg( MAG_SYSMOD )); |
aaronice | 0:6a47f35289ea | 109 | printf("DIE_TEMP %d\n", mag.readReg( MAG_DIE_TEMP )); |
aaronice | 0:6a47f35289ea | 110 | |
aaronice | 0:6a47f35289ea | 111 | printf("OFF_X %d\n", mag.readVal( MAG_OFF_X_MSB )); |
aaronice | 0:6a47f35289ea | 112 | printf("OFF_Y %d\n", mag.readVal( MAG_OFF_Y_MSB )); |
aaronice | 0:6a47f35289ea | 113 | printf("OFF_Z %d\n", mag.readVal( MAG_OFF_Z_MSB )); |
aaronice | 0:6a47f35289ea | 114 | |
aaronice | 0:6a47f35289ea | 115 | printf("CTRL_REG1 %X\n", mag.readReg( MAG_CTRL_REG1 )); |
aaronice | 0:6a47f35289ea | 116 | printf("CTRL_REG2 %X\n", mag.readReg( MAG_CTRL_REG2 )); |
aaronice | 0:6a47f35289ea | 117 | |
aaronice | 0:6a47f35289ea | 118 | printf("calibrate\n"); |
aaronice | 0:6a47f35289ea | 119 | calXY(); |
aaronice | 0:6a47f35289ea | 120 | printf("....Finished\n"); |
aaronice | 0:6a47f35289ea | 121 | |
aaronice | 0:6a47f35289ea | 122 | RedLED = 0; |
aaronice | 0:6a47f35289ea | 123 | GreenLED = 0; |
aaronice | 0:6a47f35289ea | 124 | |
aaronice | 0:6a47f35289ea | 125 | |
aaronice | 0:6a47f35289ea | 126 | |
aaronice | 0:6a47f35289ea | 127 | |
aaronice | 0:6a47f35289ea | 128 | |
aaronice | 0:6a47f35289ea | 129 | while(1){ |
aaronice | 0:6a47f35289ea | 130 | |
aaronice | 0:6a47f35289ea | 131 | wait(0.5); |
aaronice | 0:6a47f35289ea | 132 | int xVal = mag.readVal(MAG_OUT_X_MSB); |
aaronice | 0:6a47f35289ea | 133 | int yVal = mag.readVal(MAG_OUT_Y_MSB); |
aaronice | 0:6a47f35289ea | 134 | int zVal = mag.readVal(MAG_OUT_Z_MSB); |
aaronice | 0:6a47f35289ea | 135 | float heading = mag.getHeading(); |
aaronice | 0:6a47f35289ea | 136 | |
aaronice | 0:6a47f35289ea | 137 | // Do something with heading - display direction and turn on blue LED if heading approx north |
aaronice | 0:6a47f35289ea | 138 | if (abs(heading) <= 22.5) { |
aaronice | 0:6a47f35289ea | 139 | printf("N\n"); |
aaronice | 0:6a47f35289ea | 140 | RedLED = 0; |
aaronice | 0:6a47f35289ea | 141 | } else RedLED = 1; |
aaronice | 0:6a47f35289ea | 142 | |
aaronice | 0:6a47f35289ea | 143 | if (abs(heading) >= 157.5) pc.printf("S\n"); |
aaronice | 0:6a47f35289ea | 144 | if (heading >= 67.5 && heading <= 112.5) pc.printf("E \n"); |
aaronice | 0:6a47f35289ea | 145 | if (heading <= -67.5 && heading >= -112.5) pc.printf("W \n"); |
aaronice | 0:6a47f35289ea | 146 | if (heading > 22.5 && heading < 67.5) pc.printf("NE\n"); |
aaronice | 0:6a47f35289ea | 147 | if (heading < -22.5 && heading > -67.5) pc.printf("NW\n"); |
aaronice | 0:6a47f35289ea | 148 | if (heading > 112.5 && heading < 157.5) pc.printf("SE\n"); |
aaronice | 0:6a47f35289ea | 149 | if (heading < -112.5 && heading > -157.5) pc.printf("SW\n"); |
aaronice | 0:6a47f35289ea | 150 | //if (heading < 0) heading += 360.0; |
aaronice | 0:6a47f35289ea | 151 | |
aaronice | 0:6a47f35289ea | 152 | pc.printf("magX = %d, magY = %d, magZ = %d, Heading = %f ;\t", xVal, yVal, zVal, heading); |
aaronice | 0:6a47f35289ea | 153 | |
aaronice | 0:6a47f35289ea | 154 | pc.printf("accX = %f, accY = %f, accZ = %f;\t", abs(acc.getAccX()),abs(acc.getAccY()),abs(acc.getAccZ())); |
aaronice | 0:6a47f35289ea | 155 | |
aaronice | 0:6a47f35289ea | 156 | pc.printf("Touch Sensor Input: %f\n", tsi.readPercentage()); |
aaronice | 0:6a47f35289ea | 157 | |
aaronice | 0:6a47f35289ea | 158 | //pc.printf("Ambient Light: %f", alux); |
aaronice | 0:6a47f35289ea | 159 | wait(1); |
aaronice | 0:6a47f35289ea | 160 | } |
aaronice | 0:6a47f35289ea | 161 | |
aaronice | 0:6a47f35289ea | 162 | |
aaronice | 0:6a47f35289ea | 163 | } |