Mid_term1

Dependencies:   MMA8451Q SLCD mbed

Fork of ACC_LCD_341_MID by Stanley Cohen

Committer:
sphasim
Date:
Mon Oct 06 07:16:01 2014 +0000
Revision:
3:0e7f46de6d17
Parent:
2:6003ed409def
Child:
4:f17af9f983dc
Here is Part 1 of the midterm

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sphasim 3:0e7f46de6d17 1 /*
sphasim 3:0e7f46de6d17 2 Test of the accelerometer, digital I/O, on-board LCD screen.
sphasim 3:0e7f46de6d17 3 RED: When absolute horizontal
sphasim 3:0e7f46de6d17 4 GREEN : When absolute vertical
sphasim 3:0e7f46de6d17 5 BLINKY: When in intermediate state
sphasim 3:0e7f46de6d17 6
sphasim 3:0e7f46de6d17 7 Author: Siphamandla Simelane
sphasim 3:0e7f46de6d17 8 Date: 10/6/2014
sphasim 3:0e7f46de6d17 9 */
sphasim 3:0e7f46de6d17 10
sphasim 3:0e7f46de6d17 11 #include "mbed.h"
sphasim 3:0e7f46de6d17 12 #include "MMA8451Q.h"/*
sphasim 3:0e7f46de6d17 13 Test of the accelerometer, digital I/O, on-board LCD screen.
sphasim 3:0e7f46de6d17 14 MISSION
sphasim 3:0e7f46de6d17 15 LED RED: absolute horizontal
sphasim 3:0e7f46de6d17 16 LED GREEN : absolute vertical
sphasim 3:0e7f46de6d17 17 Should Blink: in intermediate state
sphasim 3:0e7f46de6d17 18
sphasim 3:0e7f46de6d17 19 Author: Siphamandla P. Simelane
sphasim 3:0e7f46de6d17 20 Date: 10/7/2014
sphasim 3:0e7f46de6d17 21 */
sphasim 3:0e7f46de6d17 22
scohennm 0:203b4129a213 23 #include "mbed.h"
scohennm 0:203b4129a213 24 #include "MMA8451Q.h"
scohennm 0:203b4129a213 25 #include "SLCD.h"
sphasim 3:0e7f46de6d17 26 #include "math.h"
scohennm 0:203b4129a213 27
sphasim 3:0e7f46de6d17 28 // Configuring Accelerometer/Magnetometer:
scohennm 0:203b4129a213 29 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
scohennm 2:6003ed409def 30 PinName const SDA = PTE25; // Data pins for the accelerometer/magnetometer.
scohennm 2:6003ed409def 31 PinName const SCL = PTE24; // DO NOT CHANGE
scohennm 0:203b4129a213 32 #elif defined (TARGET_KL05Z)
scohennm 0:203b4129a213 33 PinName const SDA = PTB4;
scohennm 0:203b4129a213 34 PinName const SCL = PTB3;
scohennm 0:203b4129a213 35 #else
scohennm 0:203b4129a213 36 #error TARGET NOT DEFINED
scohennm 0:203b4129a213 37 #endif
scohennm 0:203b4129a213 38
scohennm 0:203b4129a213 39 #define MMA8451_I2C_ADDRESS (0x1d<<1)
scohennm 0:203b4129a213 40
sphasim 3:0e7f46de6d17 41 #define PI 3.14159265
sphasim 3:0e7f46de6d17 42 #define DATATIME 0.150
sphasim 3:0e7f46de6d17 43 #define PROGNAME "ACCLCD341VB\r/n"
sphasim 3:0e7f46de6d17 44 #define PRINTDBUG
sphasim 3:0e7f46de6d17 45 #define LEDON false
sphasim 3:0e7f46de6d17 46 #define LEDOFF true
sphasim 3:0e7f46de6d17 47 #define LCDLEN 10
sphasim 3:0e7f46de6d17 48 #define LOW_POINT 0.0
sphasim 3:0e7f46de6d17 49 #define LOW_LIMIT 0.1
sphasim 3:0e7f46de6d17 50 #define HIGH_LIMIT 1.05
sphasim 3:0e7f46de6d17 51 #define BLINKTIME 0.5// milliseconds
sphasim 3:0e7f46de6d17 52
sphasim 3:0e7f46de6d17 53
sphasim 3:0e7f46de6d17 54 enum orientStates {INTERMEDIATE, LANDSCAPE, PORTRAIT}; // define the states
sphasim 3:0e7f46de6d17 55 PwmOut greenLed(LED_GREEN);
sphasim 3:0e7f46de6d17 56 PwmOut redLed(LED_RED);
scohennm 0:203b4129a213 57 SLCD slcd; //define LCD display
scohennm 0:203b4129a213 58
scohennm 0:203b4129a213 59 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
scohennm 0:203b4129a213 60 Serial pc(USBTX, USBRX);
scohennm 0:203b4129a213 61
sphasim 3:0e7f46de6d17 62 float sqrt_newt(float arg) {
sphasim 3:0e7f46de6d17 63 int i = 0;
sphasim 3:0e7f46de6d17 64 float X1 = 0.0;
sphasim 3:0e7f46de6d17 65 int intMax = 30;
sphasim 3:0e7f46de6d17 66 int epsilon = 1e-7;
sphasim 3:0e7f46de6d17 67 float my_x = float(arg/2.0);
sphasim 3:0e7f46de6d17 68 int delta = 1;
sphasim 3:0e7f46de6d17 69 for(i=0; i<intMax; i++){
sphasim 3:0e7f46de6d17 70 X1 = 0.5*(my_x + (arg/my_x));
sphasim 3:0e7f46de6d17 71 delta = abs(X1-my_x);
sphasim 3:0e7f46de6d17 72 if (delta < epsilon)
sphasim 3:0e7f46de6d17 73 break;
sphasim 3:0e7f46de6d17 74 else
sphasim 3:0e7f46de6d17 75 my_x = X1;
sphasim 3:0e7f46de6d17 76 }
sphasim 3:0e7f46de6d17 77 return my_x;
sphasim 3:0e7f46de6d17 78
scohennm 2:6003ed409def 79 }
scohennm 0:203b4129a213 80
sphasim 3:0e7f46de6d17 81 // Print using LCD screen
scohennm 0:203b4129a213 82 void LCDMess(char *lMess, float dWait){
sphasim 3:0e7f46de6d17 83 slcd.Home();
sphasim 3:0e7f46de6d17 84 slcd.clear();
sphasim 3:0e7f46de6d17 85 slcd.printf(lMess);
sphasim 3:0e7f46de6d17 86 wait(dWait);
scohennm 0:203b4129a213 87 }
scohennm 0:203b4129a213 88
scohennm 0:203b4129a213 89
scohennm 0:203b4129a213 90 int main() {
scohennm 0:203b4129a213 91 float xAcc;
scohennm 0:203b4129a213 92 float yAcc;
sphasim 3:0e7f46de6d17 93 float vector;
sphasim 3:0e7f46de6d17 94 float angle;
sphasim 3:0e7f46de6d17 95 char lcdData[LCDLEN]; //buffer needs places dor decimal pt and colon
sphasim 3:0e7f46de6d17 96 orientStates PGMState = INTERMEDIATE;
sphasim 3:0e7f46de6d17 97 Timer LEDTimer; // time till next PWM values is to change.
sphasim 3:0e7f46de6d17 98 int ledState = LEDON;
sphasim 3:0e7f46de6d17 99 int timeToChangeDF = BLINKTIME;
sphasim 3:0e7f46de6d17 100 // set up timer for next step of Duty Factor timing
sphasim 3:0e7f46de6d17 101 LEDTimer.start();
sphasim 3:0e7f46de6d17 102 LEDTimer.reset();
sphasim 3:0e7f46de6d17 103
sphasim 3:0e7f46de6d17 104 #ifdef PRINTDBUG
scohennm 0:203b4129a213 105 pc.printf(PROGNAME);
sphasim 3:0e7f46de6d17 106 #endif
scohennm 0:203b4129a213 107
sphasim 3:0e7f46de6d17 108 // main loop forever
sphasim 3:0e7f46de6d17 109 while(true) {
sphasim 3:0e7f46de6d17 110 switch (PGMState){
sphasim 3:0e7f46de6d17 111 case INTERMEDIATE:
sphasim 3:0e7f46de6d17 112 //Get accelerometer data - tilt angles minus offset for zero mark.
sphasim 3:0e7f46de6d17 113 xAcc = abs(acc.getAccX());
sphasim 3:0e7f46de6d17 114 yAcc = abs(acc.getAccY());
sphasim 3:0e7f46de6d17 115
sphasim 3:0e7f46de6d17 116 // Calulate vector sum and angle of x and y reading.
sphasim 3:0e7f46de6d17 117 vector = sqrt_newt(pow(xAcc,2) + pow(yAcc,2));
sphasim 3:0e7f46de6d17 118 angle = atan(yAcc / xAcc)* 180 / PI;
sphasim 3:0e7f46de6d17 119
sphasim 3:0e7f46de6d17 120
sphasim 3:0e7f46de6d17 121 #ifdef PRINTDBUG
sphasim 3:0e7f46de6d17 122 pc.printf("xAcc = %f\r\n", xAcc);
sphasim 3:0e7f46de6d17 123 pc.printf("yAcc = %f\r\n", yAcc);
sphasim 3:0e7f46de6d17 124 pc.printf("vector = %f\r\n", vector);
sphasim 3:0e7f46de6d17 125 pc.printf("Angle = %f\r\n", angle);
sphasim 3:0e7f46de6d17 126 #endif
sphasim 3:0e7f46de6d17 127 sprintf (lcdData,"%4.3f", yAcc);
sphasim 3:0e7f46de6d17 128 LCDMess(lcdData, DATATIME);
sphasim 3:0e7f46de6d17 129
sphasim 3:0e7f46de6d17 130
sphasim 3:0e7f46de6d17 131 // Define the landscape and portrait position using x and y readings
sphasim 3:0e7f46de6d17 132 if(yAcc < LOW_LIMIT && xAcc > LOW_POINT && xAcc < HIGH_LIMIT){
sphasim 3:0e7f46de6d17 133 PGMState = PORTRAIT;
sphasim 3:0e7f46de6d17 134 } else if (xAcc < LOW_LIMIT && yAcc > LOW_POINT && yAcc < HIGH_LIMIT){
sphasim 3:0e7f46de6d17 135 PGMState = LANDSCAPE;
sphasim 3:0e7f46de6d17 136 } else {
sphasim 3:0e7f46de6d17 137 // Blink the LED if in this state
sphasim 3:0e7f46de6d17 138 ledState = ! ledState;
sphasim 3:0e7f46de6d17 139 if (LEDTimer.read_ms() > timeToChangeDF){ // check for timer time out transtion
sphasim 3:0e7f46de6d17 140 redLed.write(ledState);
sphasim 3:0e7f46de6d17 141 greenLed.write(ledState);
sphasim 3:0e7f46de6d17 142 LEDTimer.reset();
sphasim 3:0e7f46de6d17 143 PGMState = INTERMEDIATE;
sphasim 3:0e7f46de6d17 144 }
sphasim 3:0e7f46de6d17 145 }
sphasim 3:0e7f46de6d17 146 break;
sphasim 3:0e7f46de6d17 147
sphasim 3:0e7f46de6d17 148 case PORTRAIT:
sphasim 3:0e7f46de6d17 149 // Green led ON and red OFF
sphasim 3:0e7f46de6d17 150 redLed.write(LEDON);
sphasim 3:0e7f46de6d17 151 greenLed.write(LEDOFF);
sphasim 3:0e7f46de6d17 152 PGMState = INTERMEDIATE; // go idle state
sphasim 3:0e7f46de6d17 153 break;
sphasim 3:0e7f46de6d17 154
sphasim 3:0e7f46de6d17 155 case LANDSCAPE:
sphasim 3:0e7f46de6d17 156 // Green led OFF and red ON
sphasim 3:0e7f46de6d17 157 redLed.write(LEDOFF);
sphasim 3:0e7f46de6d17 158 greenLed.write(LEDON);
sphasim 3:0e7f46de6d17 159 PGMState = INTERMEDIATE; // go idle state
sphasim 3:0e7f46de6d17 160 break;
sphasim 3:0e7f46de6d17 161
sphasim 3:0e7f46de6d17 162 default:
sphasim 3:0e7f46de6d17 163 PGMState = INTERMEDIATE; // go idle state
sphasim 3:0e7f46de6d17 164 break;
sphasim 3:0e7f46de6d17 165
sphasim 3:0e7f46de6d17 166 } // end state machine
sphasim 3:0e7f46de6d17 167 }
sphasim 3:0e7f46de6d17 168 }
sphasim 3:0e7f46de6d17 169 #include "SLCD.h"
sphasim 3:0e7f46de6d17 170 #include "math.h"
sphasim 3:0e7f46de6d17 171
sphasim 3:0e7f46de6d17 172 // Configure Accelerometer/Magnetometer:
sphasim 3:0e7f46de6d17 173 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
sphasim 3:0e7f46de6d17 174 PinName const SDA = PTE25; // Data pins for the accelerometer/magnetometer.
sphasim 3:0e7f46de6d17 175 PinName const SCL = PTE24; // DO NOT CHANGE
sphasim 3:0e7f46de6d17 176 #elif defined (TARGET_KL05Z)
sphasim 3:0e7f46de6d17 177 PinName const SDA = PTB4;
sphasim 3:0e7f46de6d17 178 PinName const SCL = PTB3;
sphasim 3:0e7f46de6d17 179 #else
sphasim 3:0e7f46de6d17 180 #error TARGET NOT DEFINED
scohennm 0:203b4129a213 181 #endif
scohennm 0:203b4129a213 182
sphasim 3:0e7f46de6d17 183 #define MMA8451_I2C_ADDRESS (0x1d<<1)
sphasim 3:0e7f46de6d17 184
sphasim 3:0e7f46de6d17 185 #define PI 3.14159265
sphasim 3:0e7f46de6d17 186 #define DATATIME 0.150
sphasim 3:0e7f46de6d17 187 #define PROGNAME "ACCLCD341VB\r/n"
sphasim 3:0e7f46de6d17 188 #define PRINTDBUG
sphasim 3:0e7f46de6d17 189 #define LEDON false
sphasim 3:0e7f46de6d17 190 #define LEDOFF true
sphasim 3:0e7f46de6d17 191 #define LCDLEN 10
sphasim 3:0e7f46de6d17 192 #define LOW_POINT 0.0
sphasim 3:0e7f46de6d17 193 #define LOW_LIMIT 0.125
sphasim 3:0e7f46de6d17 194 #define HIGH_LIMIT 1.1
sphasim 3:0e7f46de6d17 195 #define ONTIME 1.0
sphasim 3:0e7f46de6d17 196 #define BLINKTIME 0.1// milliseconds
sphasim 3:0e7f46de6d17 197
sphasim 3:0e7f46de6d17 198
sphasim 3:0e7f46de6d17 199 enum orientStates {INTERMEDIATE, LANDSCAPE, PORTRAIT}; // define the states
sphasim 3:0e7f46de6d17 200 PwmOut greenLed(LED_GREEN);
sphasim 3:0e7f46de6d17 201 PwmOut redLed(LED_RED);
sphasim 3:0e7f46de6d17 202 SLCD slcd; //define LCD display
sphasim 3:0e7f46de6d17 203
sphasim 3:0e7f46de6d17 204 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
sphasim 3:0e7f46de6d17 205 Serial pc(USBTX, USBRX);
sphasim 3:0e7f46de6d17 206
sphasim 3:0e7f46de6d17 207 float sqrt_newt(float arg) {
sphasim 3:0e7f46de6d17 208 int i = 0;
sphasim 3:0e7f46de6d17 209 float X1 = 0.0;
sphasim 3:0e7f46de6d17 210 int intMax = 20;
sphasim 3:0e7f46de6d17 211 int epsilon = 1e-7;
sphasim 3:0e7f46de6d17 212 float my_x = float(arg/2.0);
sphasim 3:0e7f46de6d17 213 int delta = 1;
sphasim 3:0e7f46de6d17 214 for(i=0; i<intMax; i++){
sphasim 3:0e7f46de6d17 215 X1 = 0.5*(my_x + (arg/my_x));
sphasim 3:0e7f46de6d17 216 delta = abs(X1-my_x);
sphasim 3:0e7f46de6d17 217 if (delta < epsilon)
sphasim 3:0e7f46de6d17 218 break;
sphasim 3:0e7f46de6d17 219 else
sphasim 3:0e7f46de6d17 220 my_x = X1;
sphasim 3:0e7f46de6d17 221 }
sphasim 3:0e7f46de6d17 222 return my_x;
sphasim 3:0e7f46de6d17 223
sphasim 3:0e7f46de6d17 224 // return (sqrt(arg));
sphasim 3:0e7f46de6d17 225 }
sphasim 3:0e7f46de6d17 226
sphasim 3:0e7f46de6d17 227 // Print using LCD screen
sphasim 3:0e7f46de6d17 228 void LCDMess(char *lMess, float dWait){
sphasim 3:0e7f46de6d17 229 slcd.Home();
sphasim 3:0e7f46de6d17 230 slcd.clear();
sphasim 3:0e7f46de6d17 231 slcd.printf(lMess);
sphasim 3:0e7f46de6d17 232 wait(dWait);
sphasim 3:0e7f46de6d17 233 }
sphasim 3:0e7f46de6d17 234
sphasim 3:0e7f46de6d17 235
sphasim 3:0e7f46de6d17 236 int main() {
sphasim 3:0e7f46de6d17 237 float xAcc;
sphasim 3:0e7f46de6d17 238 float yAcc;
sphasim 3:0e7f46de6d17 239 float vector;
sphasim 3:0e7f46de6d17 240 float angle;
sphasim 3:0e7f46de6d17 241 char lcdData[LCDLEN]; //buffer needs places dor decimal pt and colon
sphasim 3:0e7f46de6d17 242 orientStates PGMState = INTERMEDIATE;
sphasim 3:0e7f46de6d17 243 Timer LEDTimer; // time till next PWM values is to change.
sphasim 3:0e7f46de6d17 244 int ledState = LEDON;
sphasim 3:0e7f46de6d17 245 int timeToChangeDF = BLINKTIME;
sphasim 3:0e7f46de6d17 246 // set up timer for next step of Duty Factor timing
sphasim 3:0e7f46de6d17 247 LEDTimer.start();
sphasim 3:0e7f46de6d17 248 LEDTimer.reset();
sphasim 3:0e7f46de6d17 249
sphasim 3:0e7f46de6d17 250 #ifdef PRINTDBUG
sphasim 3:0e7f46de6d17 251 pc.printf(PROGNAME);
sphasim 3:0e7f46de6d17 252 #endif
sphasim 3:0e7f46de6d17 253
sphasim 3:0e7f46de6d17 254 // main loop forever
sphasim 3:0e7f46de6d17 255 while(true) {
sphasim 3:0e7f46de6d17 256 switch (PGMState){
sphasim 3:0e7f46de6d17 257 case INTERMEDIATE:
sphasim 3:0e7f46de6d17 258 //Get accelerometer data - tilt angles minus offset for zero mark.
sphasim 3:0e7f46de6d17 259 xAcc = abs(acc.getAccX());
sphasim 3:0e7f46de6d17 260 yAcc = abs(acc.getAccY());
sphasim 3:0e7f46de6d17 261
sphasim 3:0e7f46de6d17 262 // Calulate vector sum and angle of x and y reading.
sphasim 3:0e7f46de6d17 263 vector = sqrt_newt(pow(xAcc,2) + pow(yAcc,2));
sphasim 3:0e7f46de6d17 264 angle = atan(yAcc / xAcc)* 180 / PI;
sphasim 3:0e7f46de6d17 265
sphasim 3:0e7f46de6d17 266
sphasim 3:0e7f46de6d17 267 #ifdef PRINTDBUG
sphasim 3:0e7f46de6d17 268 pc.printf("xAcc = %f\r\n", xAcc);
sphasim 3:0e7f46de6d17 269 pc.printf("yAcc = %f\r\n", yAcc);
sphasim 3:0e7f46de6d17 270 pc.printf("vector = %f\r\n", vector);
sphasim 3:0e7f46de6d17 271 pc.printf("Angle = %f\r\n", angle);
sphasim 3:0e7f46de6d17 272 #endif
sphasim 3:0e7f46de6d17 273 sprintf (lcdData,"%4.3f", yAcc);
sphasim 3:0e7f46de6d17 274 LCDMess(lcdData, DATATIME);
sphasim 3:0e7f46de6d17 275
sphasim 3:0e7f46de6d17 276
sphasim 3:0e7f46de6d17 277 // Define the landscape and portrait position using x and y readings
sphasim 3:0e7f46de6d17 278 if(yAcc < LOW_LIMIT && xAcc > LOW_POINT && xAcc < HIGH_LIMIT){
sphasim 3:0e7f46de6d17 279 PGMState = PORTRAIT;
sphasim 3:0e7f46de6d17 280 } else if (xAcc < LOW_LIMIT && yAcc > LOW_POINT && yAcc < HIGH_LIMIT){
sphasim 3:0e7f46de6d17 281 PGMState = LANDSCAPE;
sphasim 3:0e7f46de6d17 282 } else {
sphasim 3:0e7f46de6d17 283 // Blink the LED if in this state
sphasim 3:0e7f46de6d17 284 ledState = ! ledState;
sphasim 3:0e7f46de6d17 285 if (LEDTimer.read_ms() > timeToChangeDF){ // check for timer time out transtion
sphasim 3:0e7f46de6d17 286 redLed.write(ledState);
sphasim 3:0e7f46de6d17 287 greenLed.write(ledState);
sphasim 3:0e7f46de6d17 288 LEDTimer.reset();
sphasim 3:0e7f46de6d17 289 PGMState = INTERMEDIATE;
sphasim 3:0e7f46de6d17 290 }
sphasim 3:0e7f46de6d17 291 }
sphasim 3:0e7f46de6d17 292 break;
sphasim 3:0e7f46de6d17 293
sphasim 3:0e7f46de6d17 294 case PORTRAIT:
sphasim 3:0e7f46de6d17 295 // Green led ON and red OFF
sphasim 3:0e7f46de6d17 296 redLed.write(LEDON);
sphasim 3:0e7f46de6d17 297 greenLed.write(LEDOFF);
sphasim 3:0e7f46de6d17 298 PGMState = INTERMEDIATE; // go idle state
sphasim 3:0e7f46de6d17 299 break;
sphasim 3:0e7f46de6d17 300
sphasim 3:0e7f46de6d17 301 case LANDSCAPE:
sphasim 3:0e7f46de6d17 302 // Green led OFF and red ON
sphasim 3:0e7f46de6d17 303 redLed.write(LEDOFF);
sphasim 3:0e7f46de6d17 304 greenLed.write(LEDON);
sphasim 3:0e7f46de6d17 305 PGMState = INTERMEDIATE; // go idle state
sphasim 3:0e7f46de6d17 306 break;
sphasim 3:0e7f46de6d17 307
sphasim 3:0e7f46de6d17 308 default:
sphasim 3:0e7f46de6d17 309 PGMState = INTERMEDIATE; // go idle state
sphasim 3:0e7f46de6d17 310 break;
sphasim 3:0e7f46de6d17 311
sphasim 3:0e7f46de6d17 312 } // end state machine
scohennm 0:203b4129a213 313 }
scohennm 0:203b4129a213 314 }