Playing around with accelerometer and magnetometer on mbed KL46Z

Dependencies:   MAG3110 MMA8451Q PinDetect mbed TSI

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?

UserRevisionLine numberNew 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 }