Playing around with accelerometer and magnetometer on mbed KL46Z

Dependencies:   MAG3110 MMA8451Q PinDetect mbed TSI

Committer:
oliverfang
Date:
Fri Feb 07 09:46:25 2014 +0000
Revision:
12:d9d577c25961
Parent:
11:7af59a3d9ac5
Child:
13:921cb2856808
Child:
15:90d4b8ddc586
added enable and disable functionality; small bug fixes

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