Playing around with accelerometer and magnetometer on mbed KL46Z

Dependencies:   MAG3110 MMA8451Q PinDetect mbed TSI

Committer:
mohammmo
Date:
Thu Feb 06 07:39:34 2014 +0000
Revision:
9:90567e22c5e1
Parent:
8:b87b93a62a6a
Changed printData to use puts, changed baud rate = 115200

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 8:b87b93a62a6a 38 // Receiving Data
oliverfang 8:b87b93a62a6a 39 const int bufferSize = 255;
oliverfang 8:b87b93a62a6a 40 char buffer[bufferSize];
oliverfang 8:b87b93a62a6a 41 int index = 0;
oliverfang 8:b87b93a62a6a 42 bool received = false;
mohammmo 9:90567e22c5e1 43 char tx_buffer[80];
oliverfang 3:552b7c450b2f 44
oliverfang 0:648dde0c4ef8 45 // Declare Accelerometer pins and I2C address
oliverfang 0:648dde0c4ef8 46 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS, 0, 0);
oliverfang 0:648dde0c4ef8 47 // Declare Magnetometer pins
oliverfang 0:648dde0c4ef8 48 MAG3110 mag(PTE25, PTE24);
mohammmo 2:bb31f097af0f 49 // Declare touch sensor pin
mohammmo 2:bb31f097af0f 50 TSISensor touch;
mohammmo 2:bb31f097af0f 51 // Declare light sensor pin
mohammmo 2:bb31f097af0f 52 AnalogIn light(PTE22);
oliverfang 0:648dde0c4ef8 53
oliverfang 0:648dde0c4ef8 54 // Functions
oliverfang 0:648dde0c4ef8 55 void init();
oliverfang 4:0d2eefc2be8e 56 void printData();
oliverfang 8:b87b93a62a6a 57 void receiveHandler();
oliverfang 8:b87b93a62a6a 58 void processCommand();
oliverfang 0:648dde0c4ef8 59 void accTime();
oliverfang 0:648dde0c4ef8 60 void magTime();
mohammmo 2:bb31f097af0f 61 void lightTime();
mohammmo 2:bb31f097af0f 62 void touchTime();
oliverfang 0:648dde0c4ef8 63
oliverfang 0:648dde0c4ef8 64 void init()
oliverfang 0:648dde0c4ef8 65 {
oliverfang 0:648dde0c4ef8 66 // Attach timerAcc
mohammmo 9:90567e22c5e1 67 pc.baud(115200);
oliverfang 3:552b7c450b2f 68 timerAcc.attach(&accTime, accRate);
oliverfang 3:552b7c450b2f 69 timerMag.attach(&magTime, magRate);
oliverfang 3:552b7c450b2f 70 timerLight.attach(&lightTime, lightRate);
oliverfang 3:552b7c450b2f 71 timerTouch.attach(&touchTime, touchRate);
oliverfang 8:b87b93a62a6a 72 pc.attach(&receiveHandler, Serial::RxIrq);
oliverfang 0:648dde0c4ef8 73 ledred = 0;
oliverfang 0:648dde0c4ef8 74 ledgreen = 0;
oliverfang 0:648dde0c4ef8 75 }
oliverfang 0:648dde0c4ef8 76
oliverfang 0:648dde0c4ef8 77 int main()
oliverfang 0:648dde0c4ef8 78 {
oliverfang 0:648dde0c4ef8 79 // Initialize
oliverfang 0:648dde0c4ef8 80 init();
oliverfang 0:648dde0c4ef8 81
oliverfang 0:648dde0c4ef8 82 while(1)
oliverfang 0:648dde0c4ef8 83 {
oliverfang 4:0d2eefc2be8e 84 printData();
oliverfang 8:b87b93a62a6a 85 wait(0.05);
oliverfang 8:b87b93a62a6a 86 if(received){
oliverfang 8:b87b93a62a6a 87 __disable_irq();
oliverfang 8:b87b93a62a6a 88 processCommand();
oliverfang 8:b87b93a62a6a 89 __enable_irq();
oliverfang 8:b87b93a62a6a 90 }
oliverfang 8:b87b93a62a6a 91 //ledgreen = !ledgreen;
oliverfang 0:648dde0c4ef8 92 }
oliverfang 0:648dde0c4ef8 93 }
oliverfang 0:648dde0c4ef8 94
oliverfang 4:0d2eefc2be8e 95 void printData()
oliverfang 4:0d2eefc2be8e 96 {
mohammmo 9:90567e22c5e1 97 sprintf(tx_buffer,"/%f/%f/%f/%d/%d/%d/%f/%f/%f/%f/%f/%f/\r\n", xAcc, yAcc, zAcc, xMag, yMag, zMag, xLight, xTouch, accRate, magRate, lightRate, touchRate);
mohammmo 9:90567e22c5e1 98 pc.puts(tx_buffer);
oliverfang 8:b87b93a62a6a 99 }
oliverfang 8:b87b93a62a6a 100
oliverfang 8:b87b93a62a6a 101 void receiveHandler()
oliverfang 8:b87b93a62a6a 102 {
oliverfang 8:b87b93a62a6a 103 index = 0;
oliverfang 8:b87b93a62a6a 104 while (pc.readable() && index < bufferSize){
oliverfang 8:b87b93a62a6a 105 //ledgreen = !ledgreen;
oliverfang 8:b87b93a62a6a 106 buffer[index] = pc.getc();
oliverfang 8:b87b93a62a6a 107 if (buffer[index] == '#'){
oliverfang 8:b87b93a62a6a 108 index = 0;
oliverfang 8:b87b93a62a6a 109 received = true;
oliverfang 8:b87b93a62a6a 110 //ledred = !ledred;
oliverfang 8:b87b93a62a6a 111 break;
oliverfang 8:b87b93a62a6a 112 }
oliverfang 8:b87b93a62a6a 113 index++;
oliverfang 8:b87b93a62a6a 114 }
oliverfang 8:b87b93a62a6a 115 return;
oliverfang 8:b87b93a62a6a 116 }
oliverfang 8:b87b93a62a6a 117
oliverfang 8:b87b93a62a6a 118 void processCommand()
oliverfang 8:b87b93a62a6a 119 {
oliverfang 8:b87b93a62a6a 120 //pc.printf("%s\r\n", buffer);
oliverfang 8:b87b93a62a6a 121 char* commands;
oliverfang 8:b87b93a62a6a 122 commands = strtok(buffer, "x");
oliverfang 8:b87b93a62a6a 123 //pc.printf("%s\r\n", commands);
oliverfang 8:b87b93a62a6a 124 switch(*commands)
oliverfang 8:b87b93a62a6a 125 {
oliverfang 8:b87b93a62a6a 126 case '0':
oliverfang 8:b87b93a62a6a 127 commands = strtok(NULL, "x");
oliverfang 8:b87b93a62a6a 128 //pc.printf("%s\r\n", commands);
oliverfang 8:b87b93a62a6a 129 accRate = strtod(commands, NULL)/1000;
oliverfang 8:b87b93a62a6a 130 timerAcc.detach();
oliverfang 8:b87b93a62a6a 131 timerAcc.attach(&accTime, accRate);
oliverfang 8:b87b93a62a6a 132 break;
oliverfang 8:b87b93a62a6a 133 case '1':
oliverfang 8:b87b93a62a6a 134 commands = strtok(NULL, "x");
oliverfang 8:b87b93a62a6a 135 //pc.printf("%s\r\n", commands);
oliverfang 8:b87b93a62a6a 136 magRate = strtod(commands, NULL)/1000;
oliverfang 8:b87b93a62a6a 137 timerMag.detach();
oliverfang 8:b87b93a62a6a 138 timerMag.attach(&magTime, magRate);
oliverfang 8:b87b93a62a6a 139 break;
oliverfang 8:b87b93a62a6a 140 case '2':
oliverfang 8:b87b93a62a6a 141 commands = strtok(NULL, "x");
oliverfang 8:b87b93a62a6a 142 //pc.printf("%s\r\n", commands);
oliverfang 8:b87b93a62a6a 143 lightRate = strtod(commands, NULL)/1000;
oliverfang 8:b87b93a62a6a 144 timerLight.detach();
oliverfang 8:b87b93a62a6a 145 timerLight.attach(&lightTime, lightRate);
oliverfang 8:b87b93a62a6a 146 break;
oliverfang 8:b87b93a62a6a 147 case '3':
oliverfang 8:b87b93a62a6a 148 commands = strtok(NULL, "x");
oliverfang 8:b87b93a62a6a 149 //pc.printf("%s\r\n", commands);
oliverfang 8:b87b93a62a6a 150 touchRate = strtod(commands, NULL)/1000;
oliverfang 8:b87b93a62a6a 151 timerTouch.detach();
oliverfang 8:b87b93a62a6a 152 timerTouch.attach(&touchTime, touchRate);
oliverfang 8:b87b93a62a6a 153 break;
oliverfang 8:b87b93a62a6a 154 default:
oliverfang 8:b87b93a62a6a 155 //pc.printf("incorrect input\r\n");
oliverfang 8:b87b93a62a6a 156 break;
oliverfang 8:b87b93a62a6a 157 }
oliverfang 8:b87b93a62a6a 158 received = false;
oliverfang 8:b87b93a62a6a 159 memset(buffer, 0, bufferSize);
oliverfang 8:b87b93a62a6a 160 //pc.printf("%s\r\n", buffer);
oliverfang 8:b87b93a62a6a 161 }
oliverfang 8:b87b93a62a6a 162
oliverfang 0:648dde0c4ef8 163 void accTime()
oliverfang 0:648dde0c4ef8 164 {
oliverfang 0:648dde0c4ef8 165 xAcc = abs(acc.getAccX());
oliverfang 0:648dde0c4ef8 166 yAcc = abs(acc.getAccY());
oliverfang 0:648dde0c4ef8 167 zAcc = abs(acc.getAccZ());
oliverfang 8:b87b93a62a6a 168 //ledred = !ledred;
oliverfang 0:648dde0c4ef8 169 }
oliverfang 0:648dde0c4ef8 170
oliverfang 0:648dde0c4ef8 171 void magTime()
oliverfang 0:648dde0c4ef8 172 {
oliverfang 0:648dde0c4ef8 173 xMag = mag.getXVal();
oliverfang 0:648dde0c4ef8 174 yMag = mag.getYVal();
oliverfang 0:648dde0c4ef8 175 zMag = mag.getZVal();
oliverfang 8:b87b93a62a6a 176 //ledred = !ledred;
mohammmo 2:bb31f097af0f 177 }
mohammmo 2:bb31f097af0f 178
mohammmo 2:bb31f097af0f 179 void lightTime()
mohammmo 2:bb31f097af0f 180 {
mohammmo 2:bb31f097af0f 181 xLight = 1 - light.read();
mohammmo 2:bb31f097af0f 182 }
mohammmo 2:bb31f097af0f 183
mohammmo 2:bb31f097af0f 184 void touchTime()
mohammmo 2:bb31f097af0f 185 {
mohammmo 2:bb31f097af0f 186 xTouch = 1 - touch.readPercentage();
oliverfang 8:b87b93a62a6a 187 }