
Part 2
main.cpp@4:efbc5085138a, 2019-02-19 (annotated)
- 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?
User | Revision | Line number | New 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 |