Part 2

Dependencies:   MMA8451Q

Committer:
duncangparker
Date:
Tue Feb 19 17:29:20 2019 +0000
Revision:
4:efbc5085138a
Parent:
3:d5c746840139
Child:
5:75cd0f7649ca
Accelerometer:; Code tidied and working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WilliamMarshQMUL 0:a1caba5c4e48 1 #include "mbed.h"
WilliamMarshQMUL 0:a1caba5c4e48 2 #include "MMA8451Q.h"
WilliamMarshQMUL 0:a1caba5c4e48 3
duncangparker 4:efbc5085138a 4 // rgb (active low)
duncangparker 4:efbc5085138a 5 #define Red (0b0011)
duncangparker 4:efbc5085138a 6 #define Green (0b0101)
duncangparker 4:efbc5085138a 7 #define Blue (0b0110)
duncangparker 4:efbc5085138a 8 #define Yellow (0b0001)
duncangparker 4:efbc5085138a 9 #define Cyan (0b0100)
duncangparker 4:efbc5085138a 10 #define Magenta (0b0010)
duncangparker 4:efbc5085138a 11 #define White (0b0000)
duncangparker 4:efbc5085138a 12 #define Black (0b0111)
duncangparker 4:efbc5085138a 13
duncangparker 4:efbc5085138a 14 #define Xp Red
duncangparker 4:efbc5085138a 15 #define Xn Yellow
duncangparker 4:efbc5085138a 16 #define Yp Green
duncangparker 4:efbc5085138a 17 #define Yn Cyan
duncangparker 4:efbc5085138a 18 #define Zp Blue
duncangparker 4:efbc5085138a 19 #define Zn Magenta
duncangparker 4:efbc5085138a 20 #define IN Black
duncangparker 4:efbc5085138a 21
duncangparker 4:efbc5085138a 22 // to convert back to string
duncangparker 4:efbc5085138a 23 char colours[8][8] = {
duncangparker 4:efbc5085138a 24 /*0*/"White",
duncangparker 4:efbc5085138a 25 /*1*/"Yellow",
duncangparker 4:efbc5085138a 26 /*2*/"Magenta",
duncangparker 4:efbc5085138a 27 /*3*/"Red",
duncangparker 4:efbc5085138a 28 /*4*/"Cyan",
duncangparker 4:efbc5085138a 29 /*5*/"Green",
duncangparker 4:efbc5085138a 30 /*6*/"Blue",
duncangparker 4:efbc5085138a 31 /*7*/"Black"
duncangparker 4:efbc5085138a 32 };
duncangparker 4:efbc5085138a 33
duncangparker 4:efbc5085138a 34 /*
duncangparker 4:efbc5085138a 35 assuming (x^2 + y^2 + z^2)^0.5 = 1
duncangparker 4:efbc5085138a 36 G-> shared between 2 axes = 0.707 value
duncangparker 4:efbc5085138a 37 G-> shared between 3 axes = 0.577 value
duncangparker 4:efbc5085138a 38 Could make threshold for orientation to be 0.9 giving reasonable margin
duncangparker 4:efbc5085138a 39 */
duncangparker 4:efbc5085138a 40 #define TH 0.9 //Threshold for deciding orientation
duncangparker 4:efbc5085138a 41
duncangparker 4:efbc5085138a 42 // IO declarations
duncangparker 4:efbc5085138a 43 #define MMA8451_I2C_ADDRESS (0x1d<<1)
duncangparker 4:efbc5085138a 44
duncangparker 4:efbc5085138a 45 PinName const SDA = PTE25;
duncangparker 4:efbc5085138a 46 PinName const SCL = PTE24;
WilliamMarshQMUL 0:a1caba5c4e48 47
duncangparker 4:efbc5085138a 48 DigitalOut rled(LED1);
duncangparker 4:efbc5085138a 49 DigitalOut gled(LED2);
duncangparker 4:efbc5085138a 50 DigitalOut bled(LED3);
duncangparker 4:efbc5085138a 51
duncangparker 4:efbc5085138a 52 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
duncangparker 4:efbc5085138a 53 Serial pc(USBTX, USBRX); // tx, rx
duncangparker 4:efbc5085138a 54
duncangparker 4:efbc5085138a 55 void led_decode(int ip){ // drives LEDs
duncangparker 4:efbc5085138a 56 rled = (ip & 0b0100);
duncangparker 4:efbc5085138a 57 gled = (ip & 0b0010);
duncangparker 4:efbc5085138a 58 bled = (ip & 0b0001);
duncangparker 4:efbc5085138a 59 }
duncangparker 4:efbc5085138a 60
duncangparker 4:efbc5085138a 61 void state_report(int ip){//reports on state
duncangparker 4:efbc5085138a 62 static int old_state;
duncangparker 4:efbc5085138a 63 if(ip != old_state){
duncangparker 4:efbc5085138a 64 pc.printf("Orientation state now: %s \n\r", colours[ip]);
duncangparker 4:efbc5085138a 65 old_state = ip;
duncangparker 4:efbc5085138a 66 }//end if
duncangparker 4:efbc5085138a 67 }//end func
duncangparker 4:efbc5085138a 68
duncangparker 4:efbc5085138a 69 int orientation_find(float x, float y, float z){
duncangparker 4:efbc5085138a 70 if (abs(x) > TH){
duncangparker 4:efbc5085138a 71 if (x > 0){
duncangparker 4:efbc5085138a 72 return(Xp);
duncangparker 4:efbc5085138a 73 }
duncangparker 4:efbc5085138a 74 else{
duncangparker 4:efbc5085138a 75 return(Xn);
duncangparker 4:efbc5085138a 76 }
duncangparker 4:efbc5085138a 77 }
duncangparker 4:efbc5085138a 78 else if (abs(y) > TH){
duncangparker 4:efbc5085138a 79 if (y > 0){
duncangparker 4:efbc5085138a 80 return(Yp);
duncangparker 4:efbc5085138a 81 }
duncangparker 4:efbc5085138a 82 else{
duncangparker 4:efbc5085138a 83 return(Yn);
duncangparker 4:efbc5085138a 84 }
duncangparker 4:efbc5085138a 85 }
duncangparker 4:efbc5085138a 86 else if (abs(z) > TH){
duncangparker 4:efbc5085138a 87 if (z > 0){
duncangparker 4:efbc5085138a 88 return(Zp);
duncangparker 4:efbc5085138a 89 }
duncangparker 4:efbc5085138a 90 else{
duncangparker 4:efbc5085138a 91 return(Zn);
duncangparker 4:efbc5085138a 92 }
duncangparker 4:efbc5085138a 93 }
duncangparker 4:efbc5085138a 94 else {
duncangparker 4:efbc5085138a 95 return(IN);
duncangparker 4:efbc5085138a 96 }//end case
duncangparker 4:efbc5085138a 97 }//end func
WilliamMarshQMUL 0:a1caba5c4e48 98
WilliamMarshQMUL 0:a1caba5c4e48 99 int main(void)
WilliamMarshQMUL 0:a1caba5c4e48 100 {
duncangparker 4:efbc5085138a 101 int state = IN;
duncangparker 4:efbc5085138a 102 //MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
duncangparker 4:efbc5085138a 103 //Serial pc(USBTX, USBRX); // tx, rx
WilliamMarshQMUL 0:a1caba5c4e48 104
duncangparker 4:efbc5085138a 105 pc.printf("MMA8451 ID: %d\n\r", acc.getWhoAmI()); //added carriage return
duncangparker 4:efbc5085138a 106
WilliamMarshQMUL 0:a1caba5c4e48 107 while (true) {
WilliamMarshQMUL 0:a1caba5c4e48 108 float x, y, z;
WilliamMarshQMUL 0:a1caba5c4e48 109 x = acc.getAccX();
WilliamMarshQMUL 0:a1caba5c4e48 110 y = acc.getAccY();
WilliamMarshQMUL 0:a1caba5c4e48 111 z = acc.getAccZ();
duncangparker 4:efbc5085138a 112
duncangparker 4:efbc5085138a 113 state = orientation_find(x,y,z);
duncangparker 4:efbc5085138a 114
duncangparker 4:efbc5085138a 115 led_decode(state);
duncangparker 4:efbc5085138a 116
duncangparker 4:efbc5085138a 117 int orientation = 1;
duncangparker 4:efbc5085138a 118 int count;
duncangparker 4:efbc5085138a 119
duncangparker 4:efbc5085138a 120 switch(orientation){
duncangparker 4:efbc5085138a 121 case 1: //no orientation state
duncangparker 4:efbc5085138a 122 if(state != IN){ // if state is not IN:
duncangparker 4:efbc5085138a 123 state_report(state);
duncangparker 4:efbc5085138a 124 orientation = 2;
duncangparker 4:efbc5085138a 125 count = 3;
duncangparker 4:efbc5085138a 126 }
duncangparker 4:efbc5085138a 127 break;
duncangparker 4:efbc5085138a 128
duncangparker 4:efbc5085138a 129 case 2: //orientation state
duncangparker 4:efbc5085138a 130 state_report(state); //always report
duncangparker 4:efbc5085138a 131 if(state == IN && count > 0){ //trying to transition back
duncangparker 4:efbc5085138a 132 count--;
duncangparker 4:efbc5085138a 133 }
duncangparker 4:efbc5085138a 134 else if(state == IN && count == 0){ //transition back to no orientation
duncangparker 4:efbc5085138a 135 orientation = 1;
duncangparker 4:efbc5085138a 136 }
duncangparker 4:efbc5085138a 137 else if(state != IN){ //reset as there is an orientation
duncangparker 4:efbc5085138a 138 count = 3;
duncangparker 4:efbc5085138a 139 }
duncangparker 4:efbc5085138a 140 }// end switch
duncangparker 4:efbc5085138a 141
WilliamMarshQMUL 3:d5c746840139 142 wait(0.3);
duncangparker 4:efbc5085138a 143 }//end while
duncangparker 4:efbc5085138a 144 }//end main