Playing around with accelerometer and magnetometer on mbed KL46Z
Dependencies: MAG3110 MMA8451Q PinDetect mbed TSI
main.cpp@15:90d4b8ddc586, 2014-02-10 (annotated)
- Committer:
- oliverfang
- Date:
- Mon Feb 10 23:05:04 2014 +0000
- Revision:
- 15:90d4b8ddc586
- Parent:
- 12:d9d577c25961
- Child:
- 16:8755d6de3b01
updated with ADC code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
oliverfang | 0:648dde0c4ef8 | 1 | #include "mbed.h" |
oliverfang | 0:648dde0c4ef8 | 2 | #include "PinDetect.h" |
oliverfang | 0:648dde0c4ef8 | 3 | #include "MMA8451Q.h" |
oliverfang | 0:648dde0c4ef8 | 4 | #include "MAG3110.h" |
mohammmo | 2:bb31f097af0f | 5 | #include "TSISensor.h" |
oliverfang | 0:648dde0c4ef8 | 6 | |
oliverfang | 0:648dde0c4ef8 | 7 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
oliverfang | 0:648dde0c4ef8 | 8 | |
oliverfang | 0:648dde0c4ef8 | 9 | // Declare output LEDs |
oliverfang | 0:648dde0c4ef8 | 10 | DigitalOut ledgreen(PTD5); |
oliverfang | 0:648dde0c4ef8 | 11 | DigitalOut ledred(PTE29); |
oliverfang | 0:648dde0c4ef8 | 12 | |
oliverfang | 0:648dde0c4ef8 | 13 | // Declare USB serial connection |
oliverfang | 0:648dde0c4ef8 | 14 | Serial pc(USBTX,USBRX); |
oliverfang | 0:648dde0c4ef8 | 15 | |
oliverfang | 0:648dde0c4ef8 | 16 | // Declare timer interrupt |
oliverfang | 0:648dde0c4ef8 | 17 | Ticker timerAcc; |
oliverfang | 0:648dde0c4ef8 | 18 | Ticker timerMag; |
mohammmo | 2:bb31f097af0f | 19 | Ticker timerLight; |
mohammmo | 2:bb31f097af0f | 20 | Ticker timerTouch; |
oliverfang | 15:90d4b8ddc586 | 21 | Ticker timerADC; |
oliverfang | 0:648dde0c4ef8 | 22 | |
oliverfang | 0:648dde0c4ef8 | 23 | // Declare pointer variables |
oliverfang | 0:648dde0c4ef8 | 24 | float xAcc; |
oliverfang | 0:648dde0c4ef8 | 25 | float yAcc; |
oliverfang | 0:648dde0c4ef8 | 26 | float zAcc; |
oliverfang | 0:648dde0c4ef8 | 27 | int xMag; |
oliverfang | 0:648dde0c4ef8 | 28 | int yMag; |
oliverfang | 0:648dde0c4ef8 | 29 | int zMag; |
mohammmo | 2:bb31f097af0f | 30 | float xLight; |
mohammmo | 2:bb31f097af0f | 31 | float xTouch; |
oliverfang | 15:90d4b8ddc586 | 32 | float xADC; |
oliverfang | 0:648dde0c4ef8 | 33 | |
oliverfang | 3:552b7c450b2f | 34 | // Sampling rates |
oliverfang | 4:0d2eefc2be8e | 35 | float accRate = 0.1; |
oliverfang | 4:0d2eefc2be8e | 36 | float magRate = 0.1; |
oliverfang | 3:552b7c450b2f | 37 | float lightRate = 0.1; |
oliverfang | 3:552b7c450b2f | 38 | float touchRate = 0.1; |
oliverfang | 15:90d4b8ddc586 | 39 | float adcRate = 0.1; |
oliverfang | 3:552b7c450b2f | 40 | |
oliverfang | 12:d9d577c25961 | 41 | // Enables |
oliverfang | 12:d9d577c25961 | 42 | int accEn = 1; |
oliverfang | 12:d9d577c25961 | 43 | int magEn = 1; |
oliverfang | 12:d9d577c25961 | 44 | int lightEn = 1; |
oliverfang | 12:d9d577c25961 | 45 | int touchEn = 1; |
oliverfang | 15:90d4b8ddc586 | 46 | int adcEn = 1; |
oliverfang | 12:d9d577c25961 | 47 | |
oliverfang | 8:b87b93a62a6a | 48 | // Receiving Data |
oliverfang | 8:b87b93a62a6a | 49 | const int bufferSize = 255; |
oliverfang | 8:b87b93a62a6a | 50 | char buffer[bufferSize]; |
oliverfang | 8:b87b93a62a6a | 51 | int index = 0; |
oliverfang | 10:f9a1e1dd5de1 | 52 | int received = 0; |
oliverfang | 10:f9a1e1dd5de1 | 53 | int readEn = 0; |
oliverfang | 10:f9a1e1dd5de1 | 54 | float temp; |
oliverfang | 3:552b7c450b2f | 55 | |
oliverfang | 0:648dde0c4ef8 | 56 | // Declare Accelerometer pins and I2C address |
oliverfang | 0:648dde0c4ef8 | 57 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS, 0, 0); |
oliverfang | 0:648dde0c4ef8 | 58 | // Declare Magnetometer pins |
oliverfang | 0:648dde0c4ef8 | 59 | MAG3110 mag(PTE25, PTE24); |
mohammmo | 2:bb31f097af0f | 60 | // Declare touch sensor pin |
mohammmo | 2:bb31f097af0f | 61 | TSISensor touch; |
mohammmo | 2:bb31f097af0f | 62 | // Declare light sensor pin |
mohammmo | 2:bb31f097af0f | 63 | AnalogIn light(PTE22); |
oliverfang | 15:90d4b8ddc586 | 64 | // Declare analog input pin |
oliverfang | 15:90d4b8ddc586 | 65 | AnalogIn adc(PTB0); |
oliverfang | 0:648dde0c4ef8 | 66 | |
oliverfang | 0:648dde0c4ef8 | 67 | // Functions |
oliverfang | 0:648dde0c4ef8 | 68 | void init(); |
oliverfang | 4:0d2eefc2be8e | 69 | void printData(); |
oliverfang | 8:b87b93a62a6a | 70 | void receiveHandler(); |
oliverfang | 8:b87b93a62a6a | 71 | void processCommand(); |
oliverfang | 0:648dde0c4ef8 | 72 | void accTime(); |
oliverfang | 0:648dde0c4ef8 | 73 | void magTime(); |
mohammmo | 2:bb31f097af0f | 74 | void lightTime(); |
mohammmo | 2:bb31f097af0f | 75 | void touchTime(); |
oliverfang | 15:90d4b8ddc586 | 76 | void adcTime(); |
oliverfang | 0:648dde0c4ef8 | 77 | |
oliverfang | 0:648dde0c4ef8 | 78 | void init() |
oliverfang | 0:648dde0c4ef8 | 79 | { |
oliverfang | 0:648dde0c4ef8 | 80 | // Attach timerAcc |
oliverfang | 10:f9a1e1dd5de1 | 81 | pc.baud(9600); |
oliverfang | 3:552b7c450b2f | 82 | timerAcc.attach(&accTime, accRate); |
oliverfang | 3:552b7c450b2f | 83 | timerMag.attach(&magTime, magRate); |
oliverfang | 3:552b7c450b2f | 84 | timerLight.attach(&lightTime, lightRate); |
oliverfang | 3:552b7c450b2f | 85 | timerTouch.attach(&touchTime, touchRate); |
oliverfang | 15:90d4b8ddc586 | 86 | timerADC.attach(&adcTime, adcRate); |
oliverfang | 8:b87b93a62a6a | 87 | pc.attach(&receiveHandler, Serial::RxIrq); |
oliverfang | 0:648dde0c4ef8 | 88 | ledred = 0; |
oliverfang | 0:648dde0c4ef8 | 89 | ledgreen = 0; |
oliverfang | 0:648dde0c4ef8 | 90 | } |
oliverfang | 0:648dde0c4ef8 | 91 | |
oliverfang | 0:648dde0c4ef8 | 92 | int main() |
oliverfang | 0:648dde0c4ef8 | 93 | { |
oliverfang | 0:648dde0c4ef8 | 94 | // Initialize |
oliverfang | 0:648dde0c4ef8 | 95 | init(); |
oliverfang | 0:648dde0c4ef8 | 96 | |
oliverfang | 0:648dde0c4ef8 | 97 | while(1) |
oliverfang | 0:648dde0c4ef8 | 98 | { |
oliverfang | 10:f9a1e1dd5de1 | 99 | __disable_irq(); |
oliverfang | 4:0d2eefc2be8e | 100 | printData(); |
oliverfang | 10:f9a1e1dd5de1 | 101 | __enable_irq(); |
oliverfang | 8:b87b93a62a6a | 102 | wait(0.05); |
oliverfang | 10:f9a1e1dd5de1 | 103 | if(received == 1){ |
oliverfang | 8:b87b93a62a6a | 104 | __disable_irq(); |
oliverfang | 8:b87b93a62a6a | 105 | processCommand(); |
oliverfang | 8:b87b93a62a6a | 106 | __enable_irq(); |
oliverfang | 8:b87b93a62a6a | 107 | } |
oliverfang | 8:b87b93a62a6a | 108 | //ledgreen = !ledgreen; |
oliverfang | 0:648dde0c4ef8 | 109 | } |
oliverfang | 0:648dde0c4ef8 | 110 | } |
oliverfang | 0:648dde0c4ef8 | 111 | |
oliverfang | 4:0d2eefc2be8e | 112 | void printData() |
oliverfang | 4:0d2eefc2be8e | 113 | { |
oliverfang | 15:90d4b8ddc586 | 114 | pc.printf("/%f/%f/%f/%d/%d/%d/%f/%f/%f/%.3f/%.3f/%.3f/%.3f/%.3f/%d/%d/%d/%d/%d/\r\n", |
oliverfang | 15:90d4b8ddc586 | 115 | xAcc, yAcc, zAcc, xMag, yMag, zMag, xLight, xTouch, xADC, |
oliverfang | 15:90d4b8ddc586 | 116 | accRate, magRate, lightRate, touchRate, adcRate, |
oliverfang | 15:90d4b8ddc586 | 117 | accEn, magEn, lightEn, touchEn, adcEn); |
oliverfang | 10:f9a1e1dd5de1 | 118 | |
oliverfang | 8:b87b93a62a6a | 119 | } |
oliverfang | 8:b87b93a62a6a | 120 | |
oliverfang | 8:b87b93a62a6a | 121 | void receiveHandler() |
oliverfang | 8:b87b93a62a6a | 122 | { |
oliverfang | 10:f9a1e1dd5de1 | 123 | while (pc.readable()){ |
oliverfang | 10:f9a1e1dd5de1 | 124 | temp = pc.getc(); |
oliverfang | 10:f9a1e1dd5de1 | 125 | //begin reading if char is @ |
oliverfang | 10:f9a1e1dd5de1 | 126 | if (temp == '@') |
oliverfang | 10:f9a1e1dd5de1 | 127 | { |
oliverfang | 10:f9a1e1dd5de1 | 128 | readEn = 1; |
oliverfang | 10:f9a1e1dd5de1 | 129 | } |
oliverfang | 10:f9a1e1dd5de1 | 130 | //stop reading if char is # |
oliverfang | 10:f9a1e1dd5de1 | 131 | else if (temp == '#' && readEn == 1) |
oliverfang | 10:f9a1e1dd5de1 | 132 | { |
oliverfang | 10:f9a1e1dd5de1 | 133 | readEn = 0; |
oliverfang | 10:f9a1e1dd5de1 | 134 | received = 1; |
oliverfang | 10:f9a1e1dd5de1 | 135 | //ledred = 1; |
oliverfang | 8:b87b93a62a6a | 136 | index = 0; |
oliverfang | 10:f9a1e1dd5de1 | 137 | return; |
oliverfang | 8:b87b93a62a6a | 138 | } |
oliverfang | 10:f9a1e1dd5de1 | 139 | // if read enable is on, then read in data |
oliverfang | 10:f9a1e1dd5de1 | 140 | else if (readEn == 1) |
oliverfang | 10:f9a1e1dd5de1 | 141 | { |
oliverfang | 10:f9a1e1dd5de1 | 142 | buffer[index] = temp; |
oliverfang | 10:f9a1e1dd5de1 | 143 | index++; |
oliverfang | 10:f9a1e1dd5de1 | 144 | } |
oliverfang | 8:b87b93a62a6a | 145 | } |
oliverfang | 8:b87b93a62a6a | 146 | return; |
oliverfang | 8:b87b93a62a6a | 147 | } |
oliverfang | 8:b87b93a62a6a | 148 | |
oliverfang | 8:b87b93a62a6a | 149 | void processCommand() |
oliverfang | 8:b87b93a62a6a | 150 | { |
oliverfang | 8:b87b93a62a6a | 151 | //pc.printf("%s\r\n", buffer); |
oliverfang | 11:7af59a3d9ac5 | 152 | char* cmd_index; |
oliverfang | 11:7af59a3d9ac5 | 153 | char* cmd_val; |
oliverfang | 12:d9d577c25961 | 154 | char* disStr = "ddd"; |
oliverfang | 12:d9d577c25961 | 155 | char* enStr = "eee"; |
oliverfang | 11:7af59a3d9ac5 | 156 | // read in first value (0, 1, 2, or 3) |
oliverfang | 11:7af59a3d9ac5 | 157 | cmd_index = strtok(buffer, "x"); |
oliverfang | 11:7af59a3d9ac5 | 158 | //pc.printf("%s\r\n", cmd_index); |
oliverfang | 11:7af59a3d9ac5 | 159 | //read in second value (integer larger than 050) |
oliverfang | 11:7af59a3d9ac5 | 160 | cmd_val = strtok(NULL, "x"); |
oliverfang | 11:7af59a3d9ac5 | 161 | //pc.printf("%s\r\n", cmd_val); |
oliverfang | 12:d9d577c25961 | 162 | // ddd means disable |
oliverfang | 12:d9d577c25961 | 163 | if (strcmp(cmd_val, disStr) == 0) |
oliverfang | 12:d9d577c25961 | 164 | { |
oliverfang | 12:d9d577c25961 | 165 | ledgreen = 1; |
oliverfang | 12:d9d577c25961 | 166 | switch(*cmd_index) |
oliverfang | 12:d9d577c25961 | 167 | { |
oliverfang | 12:d9d577c25961 | 168 | case '1': |
oliverfang | 12:d9d577c25961 | 169 | timerAcc.detach(); |
oliverfang | 12:d9d577c25961 | 170 | accEn = 0; |
oliverfang | 12:d9d577c25961 | 171 | break; |
oliverfang | 12:d9d577c25961 | 172 | case '2': |
oliverfang | 12:d9d577c25961 | 173 | timerMag.detach(); |
oliverfang | 12:d9d577c25961 | 174 | magEn = 0; |
oliverfang | 12:d9d577c25961 | 175 | break; |
oliverfang | 12:d9d577c25961 | 176 | case '3': |
oliverfang | 12:d9d577c25961 | 177 | timerLight.detach(); |
oliverfang | 12:d9d577c25961 | 178 | lightEn = 0; |
oliverfang | 12:d9d577c25961 | 179 | break; |
oliverfang | 12:d9d577c25961 | 180 | case '4': |
oliverfang | 12:d9d577c25961 | 181 | timerTouch.detach(); |
oliverfang | 12:d9d577c25961 | 182 | touchEn = 0; |
oliverfang | 12:d9d577c25961 | 183 | break; |
oliverfang | 15:90d4b8ddc586 | 184 | case '5': |
oliverfang | 15:90d4b8ddc586 | 185 | timerADC.detach(); |
oliverfang | 15:90d4b8ddc586 | 186 | adcEn = 0; |
oliverfang | 15:90d4b8ddc586 | 187 | break; |
oliverfang | 12:d9d577c25961 | 188 | default: |
oliverfang | 12:d9d577c25961 | 189 | //pc.printf("incorrect input\r\n"); |
oliverfang | 12:d9d577c25961 | 190 | break; |
oliverfang | 12:d9d577c25961 | 191 | } |
oliverfang | 12:d9d577c25961 | 192 | } |
oliverfang | 12:d9d577c25961 | 193 | // eee means enable |
oliverfang | 12:d9d577c25961 | 194 | else if (strcmp(cmd_val, enStr) == 0) |
oliverfang | 12:d9d577c25961 | 195 | { |
oliverfang | 12:d9d577c25961 | 196 | switch(*cmd_index) |
oliverfang | 12:d9d577c25961 | 197 | { |
oliverfang | 12:d9d577c25961 | 198 | case '1': |
oliverfang | 12:d9d577c25961 | 199 | timerAcc.attach(&accTime, accRate); |
oliverfang | 12:d9d577c25961 | 200 | accEn = 1; |
oliverfang | 12:d9d577c25961 | 201 | break; |
oliverfang | 12:d9d577c25961 | 202 | case '2': |
oliverfang | 12:d9d577c25961 | 203 | timerMag.attach(&magTime, magRate); |
oliverfang | 12:d9d577c25961 | 204 | magEn = 1; |
oliverfang | 12:d9d577c25961 | 205 | break; |
oliverfang | 12:d9d577c25961 | 206 | case '3': |
oliverfang | 12:d9d577c25961 | 207 | timerLight.attach(&lightTime, lightRate); |
oliverfang | 12:d9d577c25961 | 208 | lightEn = 1; |
oliverfang | 12:d9d577c25961 | 209 | break; |
oliverfang | 12:d9d577c25961 | 210 | case '4': |
oliverfang | 12:d9d577c25961 | 211 | timerTouch.attach(&touchTime, touchRate); |
oliverfang | 12:d9d577c25961 | 212 | touchEn = 1; |
oliverfang | 12:d9d577c25961 | 213 | break; |
oliverfang | 15:90d4b8ddc586 | 214 | case '5': |
oliverfang | 15:90d4b8ddc586 | 215 | timerADC.attach(&adcTime, adcRate); |
oliverfang | 15:90d4b8ddc586 | 216 | adcEn = 1; |
oliverfang | 15:90d4b8ddc586 | 217 | break; |
oliverfang | 12:d9d577c25961 | 218 | default: |
oliverfang | 12:d9d577c25961 | 219 | //pc.printf("incorrect input\r\n"); |
oliverfang | 12:d9d577c25961 | 220 | break; |
oliverfang | 12:d9d577c25961 | 221 | } |
oliverfang | 12:d9d577c25961 | 222 | } |
oliverfang | 11:7af59a3d9ac5 | 223 | temp = strtod(cmd_val, NULL)/1000; |
oliverfang | 12:d9d577c25961 | 224 | if (temp > 0.06 && strlen(cmd_val) >= 3) |
oliverfang | 8:b87b93a62a6a | 225 | { |
oliverfang | 11:7af59a3d9ac5 | 226 | switch(*cmd_index) |
oliverfang | 11:7af59a3d9ac5 | 227 | { |
oliverfang | 11:7af59a3d9ac5 | 228 | case '1': |
oliverfang | 10:f9a1e1dd5de1 | 229 | accRate = temp; |
oliverfang | 10:f9a1e1dd5de1 | 230 | timerAcc.detach(); |
oliverfang | 11:7af59a3d9ac5 | 231 | timerAcc.attach(&accTime, accRate); |
oliverfang | 11:7af59a3d9ac5 | 232 | break; |
oliverfang | 11:7af59a3d9ac5 | 233 | case '2': |
oliverfang | 10:f9a1e1dd5de1 | 234 | magRate = temp; |
oliverfang | 10:f9a1e1dd5de1 | 235 | timerMag.detach(); |
oliverfang | 10:f9a1e1dd5de1 | 236 | timerMag.attach(&magTime, magRate); |
oliverfang | 11:7af59a3d9ac5 | 237 | break; |
oliverfang | 11:7af59a3d9ac5 | 238 | case '3': |
oliverfang | 10:f9a1e1dd5de1 | 239 | lightRate = temp; |
oliverfang | 10:f9a1e1dd5de1 | 240 | timerLight.detach(); |
oliverfang | 10:f9a1e1dd5de1 | 241 | timerLight.attach(&lightTime, lightRate); |
oliverfang | 11:7af59a3d9ac5 | 242 | break; |
oliverfang | 11:7af59a3d9ac5 | 243 | case '4': |
oliverfang | 10:f9a1e1dd5de1 | 244 | touchRate = temp; |
oliverfang | 10:f9a1e1dd5de1 | 245 | timerTouch.detach(); |
oliverfang | 10:f9a1e1dd5de1 | 246 | timerTouch.attach(&touchTime, touchRate); |
oliverfang | 11:7af59a3d9ac5 | 247 | break; |
oliverfang | 15:90d4b8ddc586 | 248 | case '5': |
oliverfang | 15:90d4b8ddc586 | 249 | adcRate = temp; |
oliverfang | 15:90d4b8ddc586 | 250 | timerADC.detach(); |
oliverfang | 15:90d4b8ddc586 | 251 | timerADC.attach(&adcTime, adcRate); |
oliverfang | 11:7af59a3d9ac5 | 252 | default: |
oliverfang | 11:7af59a3d9ac5 | 253 | //pc.printf("incorrect input\r\n"); |
oliverfang | 11:7af59a3d9ac5 | 254 | break; |
oliverfang | 11:7af59a3d9ac5 | 255 | } |
oliverfang | 8:b87b93a62a6a | 256 | } |
oliverfang | 11:7af59a3d9ac5 | 257 | |
oliverfang | 10:f9a1e1dd5de1 | 258 | received = 0; |
oliverfang | 8:b87b93a62a6a | 259 | memset(buffer, 0, bufferSize); |
oliverfang | 8:b87b93a62a6a | 260 | //pc.printf("%s\r\n", buffer); |
oliverfang | 8:b87b93a62a6a | 261 | } |
oliverfang | 8:b87b93a62a6a | 262 | |
oliverfang | 0:648dde0c4ef8 | 263 | void accTime() |
oliverfang | 0:648dde0c4ef8 | 264 | { |
oliverfang | 0:648dde0c4ef8 | 265 | xAcc = abs(acc.getAccX()); |
oliverfang | 0:648dde0c4ef8 | 266 | yAcc = abs(acc.getAccY()); |
oliverfang | 0:648dde0c4ef8 | 267 | zAcc = abs(acc.getAccZ()); |
oliverfang | 10:f9a1e1dd5de1 | 268 | ledred = !ledred; |
oliverfang | 0:648dde0c4ef8 | 269 | } |
oliverfang | 0:648dde0c4ef8 | 270 | |
oliverfang | 0:648dde0c4ef8 | 271 | void magTime() |
oliverfang | 0:648dde0c4ef8 | 272 | { |
oliverfang | 0:648dde0c4ef8 | 273 | xMag = mag.getXVal(); |
oliverfang | 0:648dde0c4ef8 | 274 | yMag = mag.getYVal(); |
oliverfang | 0:648dde0c4ef8 | 275 | zMag = mag.getZVal(); |
oliverfang | 8:b87b93a62a6a | 276 | //ledred = !ledred; |
mohammmo | 2:bb31f097af0f | 277 | } |
mohammmo | 2:bb31f097af0f | 278 | |
mohammmo | 2:bb31f097af0f | 279 | void lightTime() |
mohammmo | 2:bb31f097af0f | 280 | { |
mohammmo | 2:bb31f097af0f | 281 | xLight = 1 - light.read(); |
mohammmo | 2:bb31f097af0f | 282 | } |
mohammmo | 2:bb31f097af0f | 283 | |
mohammmo | 2:bb31f097af0f | 284 | void touchTime() |
mohammmo | 2:bb31f097af0f | 285 | { |
mohammmo | 2:bb31f097af0f | 286 | xTouch = 1 - touch.readPercentage(); |
oliverfang | 8:b87b93a62a6a | 287 | } |
oliverfang | 15:90d4b8ddc586 | 288 | |
oliverfang | 15:90d4b8ddc586 | 289 | void adcTime() |
oliverfang | 15:90d4b8ddc586 | 290 | { |
oliverfang | 15:90d4b8ddc586 | 291 | xADC = adc.read(); |
oliverfang | 15:90d4b8ddc586 | 292 | } |