Playing around with accelerometer and magnetometer on mbed KL46Z

Dependencies:   MAG3110 MMA8451Q PinDetect mbed TSI

Committer:
mohammmo
Date:
Mon Feb 10 22:52:28 2014 +0000
Revision:
14:1608275a874f
Parent:
13:921cb2856808
add analog input (add also to printf)

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;
mohammmo 13:921cb2856808 21 Ticker timerAin;
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;
mohammmo 13:921cb2856808 32 float xAin;
oliverfang 0:648dde0c4ef8 33
oliverfang 3:552b7c450b2f 34 // Sampling rates
mohammmo 13:921cb2856808 35 float accRate = 0.1;
mohammmo 13:921cb2856808 36 float magRate = 0.1;
oliverfang 3:552b7c450b2f 37 float lightRate = 0.1;
oliverfang 3:552b7c450b2f 38 float touchRate = 0.1;
mohammmo 13:921cb2856808 39 float AinRate = 0.1;
oliverfang 3:552b7c450b2f 40
oliverfang 12:d9d577c25961 41 // Enables
mohammmo 13:921cb2856808 42 int accEn = 1;
mohammmo 13:921cb2856808 43 int magEn = 1;
oliverfang 12:d9d577c25961 44 int lightEn = 1;
oliverfang 12:d9d577c25961 45 int touchEn = 1;
mohammmo 13:921cb2856808 46 int AinEn = 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);
mohammmo 13:921cb2856808 64 // Declare Analog input pin
mohammmo 13:921cb2856808 65 AnalogIn Ain(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();
mohammmo 13:921cb2856808 76 void AinTime();
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);
mohammmo 13:921cb2856808 86 timerAin.attach(&AinTime, AinRate);
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 {
mohammmo 14:1608275a874f 114 pc.printf("/%f/%f/%f/%d/%d/%d/%f/%f/%.3f/%.3f/%.3f/%.3f/%d/%d/%d/%d/%f/\r\n",
oliverfang 10:f9a1e1dd5de1 115 xAcc, yAcc, zAcc, xMag, yMag, zMag, xLight, xTouch,
oliverfang 12:d9d577c25961 116 accRate, magRate, lightRate, touchRate,
mohammmo 14:1608275a874f 117 accEn, magEn, lightEn, touchEn,
mohammmo 14:1608275a874f 118 xAin);
oliverfang 10:f9a1e1dd5de1 119
oliverfang 8:b87b93a62a6a 120 }
oliverfang 8:b87b93a62a6a 121
oliverfang 8:b87b93a62a6a 122 void receiveHandler()
oliverfang 8:b87b93a62a6a 123 {
oliverfang 10:f9a1e1dd5de1 124 while (pc.readable()){
oliverfang 10:f9a1e1dd5de1 125 temp = pc.getc();
oliverfang 10:f9a1e1dd5de1 126 //begin reading if char is @
oliverfang 10:f9a1e1dd5de1 127 if (temp == '@')
oliverfang 10:f9a1e1dd5de1 128 {
oliverfang 10:f9a1e1dd5de1 129 readEn = 1;
oliverfang 10:f9a1e1dd5de1 130 }
oliverfang 10:f9a1e1dd5de1 131 //stop reading if char is #
oliverfang 10:f9a1e1dd5de1 132 else if (temp == '#' && readEn == 1)
oliverfang 10:f9a1e1dd5de1 133 {
oliverfang 10:f9a1e1dd5de1 134 readEn = 0;
oliverfang 10:f9a1e1dd5de1 135 received = 1;
oliverfang 10:f9a1e1dd5de1 136 //ledred = 1;
oliverfang 8:b87b93a62a6a 137 index = 0;
oliverfang 10:f9a1e1dd5de1 138 return;
oliverfang 8:b87b93a62a6a 139 }
oliverfang 10:f9a1e1dd5de1 140 // if read enable is on, then read in data
oliverfang 10:f9a1e1dd5de1 141 else if (readEn == 1)
oliverfang 10:f9a1e1dd5de1 142 {
oliverfang 10:f9a1e1dd5de1 143 buffer[index] = temp;
oliverfang 10:f9a1e1dd5de1 144 index++;
oliverfang 10:f9a1e1dd5de1 145 }
oliverfang 8:b87b93a62a6a 146 }
oliverfang 8:b87b93a62a6a 147 return;
oliverfang 8:b87b93a62a6a 148 }
oliverfang 8:b87b93a62a6a 149
oliverfang 8:b87b93a62a6a 150 void processCommand()
oliverfang 8:b87b93a62a6a 151 {
oliverfang 8:b87b93a62a6a 152 //pc.printf("%s\r\n", buffer);
oliverfang 11:7af59a3d9ac5 153 char* cmd_index;
oliverfang 11:7af59a3d9ac5 154 char* cmd_val;
oliverfang 12:d9d577c25961 155 char* disStr = "ddd";
oliverfang 12:d9d577c25961 156 char* enStr = "eee";
oliverfang 11:7af59a3d9ac5 157 // read in first value (0, 1, 2, or 3)
oliverfang 11:7af59a3d9ac5 158 cmd_index = strtok(buffer, "x");
oliverfang 11:7af59a3d9ac5 159 //pc.printf("%s\r\n", cmd_index);
oliverfang 11:7af59a3d9ac5 160 //read in second value (integer larger than 050)
oliverfang 11:7af59a3d9ac5 161 cmd_val = strtok(NULL, "x");
oliverfang 11:7af59a3d9ac5 162 //pc.printf("%s\r\n", cmd_val);
oliverfang 12:d9d577c25961 163 // ddd means disable
oliverfang 12:d9d577c25961 164 if (strcmp(cmd_val, disStr) == 0)
oliverfang 12:d9d577c25961 165 {
oliverfang 12:d9d577c25961 166 ledgreen = 1;
oliverfang 12:d9d577c25961 167 switch(*cmd_index)
oliverfang 12:d9d577c25961 168 {
oliverfang 12:d9d577c25961 169 case '1':
oliverfang 12:d9d577c25961 170 timerAcc.detach();
oliverfang 12:d9d577c25961 171 accEn = 0;
oliverfang 12:d9d577c25961 172 break;
oliverfang 12:d9d577c25961 173 case '2':
oliverfang 12:d9d577c25961 174 timerMag.detach();
oliverfang 12:d9d577c25961 175 magEn = 0;
oliverfang 12:d9d577c25961 176 break;
oliverfang 12:d9d577c25961 177 case '3':
oliverfang 12:d9d577c25961 178 timerLight.detach();
oliverfang 12:d9d577c25961 179 lightEn = 0;
oliverfang 12:d9d577c25961 180 break;
oliverfang 12:d9d577c25961 181 case '4':
oliverfang 12:d9d577c25961 182 timerTouch.detach();
oliverfang 12:d9d577c25961 183 touchEn = 0;
oliverfang 12:d9d577c25961 184 break;
mohammmo 13:921cb2856808 185 case '5':
mohammmo 13:921cb2856808 186 timerAin.detach();
mohammmo 13:921cb2856808 187 AinEn = 0;
mohammmo 13:921cb2856808 188 break;
oliverfang 12:d9d577c25961 189 default:
oliverfang 12:d9d577c25961 190 //pc.printf("incorrect input\r\n");
oliverfang 12:d9d577c25961 191 break;
oliverfang 12:d9d577c25961 192 }
oliverfang 12:d9d577c25961 193 }
oliverfang 12:d9d577c25961 194 // eee means enable
oliverfang 12:d9d577c25961 195 else if (strcmp(cmd_val, enStr) == 0)
oliverfang 12:d9d577c25961 196 {
oliverfang 12:d9d577c25961 197 switch(*cmd_index)
oliverfang 12:d9d577c25961 198 {
oliverfang 12:d9d577c25961 199 case '1':
oliverfang 12:d9d577c25961 200 timerAcc.attach(&accTime, accRate);
oliverfang 12:d9d577c25961 201 accEn = 1;
oliverfang 12:d9d577c25961 202 break;
oliverfang 12:d9d577c25961 203 case '2':
oliverfang 12:d9d577c25961 204 timerMag.attach(&magTime, magRate);
oliverfang 12:d9d577c25961 205 magEn = 1;
oliverfang 12:d9d577c25961 206 break;
oliverfang 12:d9d577c25961 207 case '3':
oliverfang 12:d9d577c25961 208 timerLight.attach(&lightTime, lightRate);
oliverfang 12:d9d577c25961 209 lightEn = 1;
oliverfang 12:d9d577c25961 210 break;
oliverfang 12:d9d577c25961 211 case '4':
oliverfang 12:d9d577c25961 212 timerTouch.attach(&touchTime, touchRate);
oliverfang 12:d9d577c25961 213 touchEn = 1;
oliverfang 12:d9d577c25961 214 break;
mohammmo 13:921cb2856808 215 case '5':
mohammmo 13:921cb2856808 216 timerAin.attach(&AinTime, AinRate);
mohammmo 13:921cb2856808 217 AinEn = 1;
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;
mohammmo 13:921cb2856808 248 case '5':
mohammmo 13:921cb2856808 249 AinRate = temp;
mohammmo 13:921cb2856808 250 timerAin.detach();
mohammmo 13:921cb2856808 251 timerAin.attach(&AinTime, AinRate);
mohammmo 13:921cb2856808 252 break;
oliverfang 11:7af59a3d9ac5 253 default:
oliverfang 11:7af59a3d9ac5 254 //pc.printf("incorrect input\r\n");
oliverfang 11:7af59a3d9ac5 255 break;
oliverfang 11:7af59a3d9ac5 256 }
oliverfang 8:b87b93a62a6a 257 }
oliverfang 11:7af59a3d9ac5 258
oliverfang 10:f9a1e1dd5de1 259 received = 0;
oliverfang 8:b87b93a62a6a 260 memset(buffer, 0, bufferSize);
oliverfang 8:b87b93a62a6a 261 //pc.printf("%s\r\n", buffer);
oliverfang 8:b87b93a62a6a 262 }
oliverfang 8:b87b93a62a6a 263
oliverfang 0:648dde0c4ef8 264 void accTime()
oliverfang 0:648dde0c4ef8 265 {
oliverfang 0:648dde0c4ef8 266 xAcc = abs(acc.getAccX());
oliverfang 0:648dde0c4ef8 267 yAcc = abs(acc.getAccY());
oliverfang 0:648dde0c4ef8 268 zAcc = abs(acc.getAccZ());
oliverfang 10:f9a1e1dd5de1 269 ledred = !ledred;
oliverfang 0:648dde0c4ef8 270 }
oliverfang 0:648dde0c4ef8 271
oliverfang 0:648dde0c4ef8 272 void magTime()
oliverfang 0:648dde0c4ef8 273 {
oliverfang 0:648dde0c4ef8 274 xMag = mag.getXVal();
oliverfang 0:648dde0c4ef8 275 yMag = mag.getYVal();
oliverfang 0:648dde0c4ef8 276 zMag = mag.getZVal();
oliverfang 8:b87b93a62a6a 277 //ledred = !ledred;
mohammmo 2:bb31f097af0f 278 }
mohammmo 2:bb31f097af0f 279
mohammmo 2:bb31f097af0f 280 void lightTime()
mohammmo 2:bb31f097af0f 281 {
mohammmo 2:bb31f097af0f 282 xLight = 1 - light.read();
mohammmo 2:bb31f097af0f 283 }
mohammmo 2:bb31f097af0f 284
mohammmo 2:bb31f097af0f 285 void touchTime()
mohammmo 2:bb31f097af0f 286 {
mohammmo 2:bb31f097af0f 287 xTouch = 1 - touch.readPercentage();
oliverfang 8:b87b93a62a6a 288 }
mohammmo 13:921cb2856808 289
mohammmo 13:921cb2856808 290 void AinTime()
mohammmo 13:921cb2856808 291 {
mohammmo 13:921cb2856808 292 xAin = Ain.read();
mohammmo 13:921cb2856808 293 }