![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Submitted by Angela Hsueh, Maya Mardini, Yi Tong Slingshot controller using a force sensor and accelerometer for an Angry Birds clone game.
Dependencies: LSM303DLHC MMA8451Q PinDetect USBDevice mbed
Fork of hw3_controller by
main.cpp@7:689f891d62cd, 2015-09-21 (annotated)
- Committer:
- ahsueh
- Date:
- Mon Sep 21 12:14:01 2015 +0000
- Revision:
- 7:689f891d62cd
- Parent:
- 6:753418e86c95
Final
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bjo3rn | 0:c9bb3c9d5ce8 | 1 | #include "mbed.h" |
ahsueh | 2:31cf09b1ad9c | 2 | #include "USBMouseKeyboard.h" |
ahsueh | 1:01b4684bc210 | 3 | #include "LSM303DLHC.h" |
ahsueh | 2:31cf09b1ad9c | 4 | #include "PinDetect.h" |
ahsueh | 2:31cf09b1ad9c | 5 | #include "math.h" |
bjo3rn | 0:c9bb3c9d5ce8 | 6 | |
bjo3rn | 0:c9bb3c9d5ce8 | 7 | // define I2C Pins and address for KL25Z. Taken from default sample code. |
ahsueh | 1:01b4684bc210 | 8 | PinName const SDA = D14; |
ahsueh | 1:01b4684bc210 | 9 | PinName const SCL = D15; |
ahsueh | 7:689f891d62cd | 10 | DigitalIn p1(D3); |
ahsueh | 7:689f891d62cd | 11 | DigitalIn p2(D4); |
ahsueh | 7:689f891d62cd | 12 | DigitalIn p3(D5); |
ahsueh | 7:689f891d62cd | 13 | //PinDetect p1(D3); |
ahsueh | 7:689f891d62cd | 14 | //PinDetect p2(D4); |
ahsueh | 7:689f891d62cd | 15 | //PinDetect p3(D5); |
ahsueh | 3:f3520156ca98 | 16 | AnalogIn fsr(A5); |
bjo3rn | 0:c9bb3c9d5ce8 | 17 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
bjo3rn | 0:c9bb3c9d5ce8 | 18 | |
bjo3rn | 0:c9bb3c9d5ce8 | 19 | //serial connection to PC via USB |
bjo3rn | 0:c9bb3c9d5ce8 | 20 | Serial pc(USBTX, USBRX); |
ahsueh | 1:01b4684bc210 | 21 | LSM303DLHC lsm(SDA, SCL); |
ahsueh | 6:753418e86c95 | 22 | USBMouseKeyboard mouseKey; |
ahsueh | 2:31cf09b1ad9c | 23 | |
bjo3rn | 0:c9bb3c9d5ce8 | 24 | |
ahsueh | 6:753418e86c95 | 25 | float fsrVal; |
ahsueh | 6:753418e86c95 | 26 | float fsrValPrev; |
ahsueh | 6:753418e86c95 | 27 | int count; |
ahsueh | 6:753418e86c95 | 28 | // acc and mag values |
ahsueh | 6:753418e86c95 | 29 | float ax, ay, az, mx, my, mz; |
ahsueh | 6:753418e86c95 | 30 | float theta; |
ahsueh | 7:689f891d62cd | 31 | int mousePress; |
ahsueh | 7:689f891d62cd | 32 | float flt_force_prev; |
ahsueh | 6:753418e86c95 | 33 | int oldx, oldy; |
ahsueh | 6:753418e86c95 | 34 | |
ahsueh | 6:753418e86c95 | 35 | int mouseTravelX = 0; |
ahsueh | 6:753418e86c95 | 36 | int mouseTravelY = 0; |
ahsueh | 6:753418e86c95 | 37 | |
ahsueh | 6:753418e86c95 | 38 | float angles[8] = {0}; |
ahsueh | 6:753418e86c95 | 39 | float forces[8] = {0}; |
bjo3rn | 0:c9bb3c9d5ce8 | 40 | |
ahsueh | 6:753418e86c95 | 41 | void mouseMem(int x_, int y_) { |
ahsueh | 6:753418e86c95 | 42 | mouseTravelX += x_; |
ahsueh | 6:753418e86c95 | 43 | mouseTravelY += y_; |
ahsueh | 6:753418e86c95 | 44 | } |
ahsueh | 2:31cf09b1ad9c | 45 | |
ahsueh | 6:753418e86c95 | 46 | float filter(float* array, int len, float value) { |
ahsueh | 6:753418e86c95 | 47 | float mean = 0.0; |
ahsueh | 6:753418e86c95 | 48 | for(int i = 0; i<len - 1; i++) { |
ahsueh | 6:753418e86c95 | 49 | mean += array[i + 1]; |
ahsueh | 6:753418e86c95 | 50 | array[i] = array[i + 1]; |
ahsueh | 6:753418e86c95 | 51 | } |
ahsueh | 6:753418e86c95 | 52 | mean += value; |
ahsueh | 6:753418e86c95 | 53 | array[len - 1] = value; |
ahsueh | 6:753418e86c95 | 54 | return mean / (float)len; |
ahsueh | 6:753418e86c95 | 55 | } |
ahsueh | 2:31cf09b1ad9c | 56 | |
ahsueh | 7:689f891d62cd | 57 | |
ahsueh | 7:689f891d62cd | 58 | |
ahsueh | 7:689f891d62cd | 59 | |
ahsueh | 6:753418e86c95 | 60 | int main(void){ |
ahsueh | 4:fea2289b42cd | 61 | int x = 0; |
ahsueh | 4:fea2289b42cd | 62 | int y = 0; |
ahsueh | 7:689f891d62cd | 63 | int mouseClickDown = 0; |
ahsueh | 7:689f891d62cd | 64 | bool aim = false; |
ahsueh | 6:753418e86c95 | 65 | while(1){ |
ahsueh | 4:fea2289b42cd | 66 | fsrVal = fsr.read(); |
ahsueh | 6:753418e86c95 | 67 | lsm.read(&ax, &ay, &az, &mx, &my, &mz); |
ahsueh | 6:753418e86c95 | 68 | |
ahsueh | 6:753418e86c95 | 69 | float cur_angle = atan(ax / az); |
ahsueh | 7:689f891d62cd | 70 | float cur_force = fsrVal*1000; |
ahsueh | 6:753418e86c95 | 71 | |
ahsueh | 6:753418e86c95 | 72 | float flt_force = filter(forces, 8, cur_force); |
ahsueh | 6:753418e86c95 | 73 | float flt_angle = filter(angles, 8, cur_angle); |
ahsueh | 6:753418e86c95 | 74 | |
ahsueh | 7:689f891d62cd | 75 | //mouseKey.printf("ax: %1.2f az: %1.2f fsrVal: %1.2f \n", ax, az, fsrVal); |
ahsueh | 6:753418e86c95 | 76 | |
ahsueh | 7:689f891d62cd | 77 | //mouseKey.printf("fsrVal: %1.2f fsrValPrev: %1.2f flt_force: %1.2f\n", |
ahsueh | 7:689f891d62cd | 78 | // fsrVal, fsrValPrev, flt_force); |
ahsueh | 7:689f891d62cd | 79 | if(p1 == 0){ |
ahsueh | 7:689f891d62cd | 80 | mouseKey.keyCode('a'); |
ahsueh | 7:689f891d62cd | 81 | |
ahsueh | 7:689f891d62cd | 82 | } |
ahsueh | 7:689f891d62cd | 83 | if (p2 == 0) { |
ahsueh | 7:689f891d62cd | 84 | mouseKey.click(MOUSE_LEFT); |
ahsueh | 7:689f891d62cd | 85 | wait(0.05); |
ahsueh | 7:689f891d62cd | 86 | } |
ahsueh | 6:753418e86c95 | 87 | |
ahsueh | 7:689f891d62cd | 88 | |
ahsueh | 7:689f891d62cd | 89 | //if ((flt_force > 0.2)) { |
ahsueh | 7:689f891d62cd | 90 | |
ahsueh | 7:689f891d62cd | 91 | //mouseKey.printf("fsrVal %1.2f fsrValPrev %1.2f flt_force %1.2f \n", fsrVal, fsrValPrev,flt_force); |
ahsueh | 7:689f891d62cd | 92 | if(p3 == 0){ |
ahsueh | 7:689f891d62cd | 93 | if (mouseClickDown == 0) { |
ahsueh | 7:689f891d62cd | 94 | mouseKey.press(MOUSE_LEFT); |
ahsueh | 7:689f891d62cd | 95 | mouseClickDown = 1; |
ahsueh | 7:689f891d62cd | 96 | } |
ahsueh | 7:689f891d62cd | 97 | //wait(0.02); |
ahsueh | 7:689f891d62cd | 98 | } |
ahsueh | 7:689f891d62cd | 99 | else { |
ahsueh | 7:689f891d62cd | 100 | if (mouseClickDown == 1) { |
ahsueh | 7:689f891d62cd | 101 | mouseKey.release(MOUSE_LEFT); |
ahsueh | 7:689f891d62cd | 102 | mouseClickDown = 0; |
ahsueh | 7:689f891d62cd | 103 | } |
ahsueh | 7:689f891d62cd | 104 | } |
ahsueh | 7:689f891d62cd | 105 | if ((((flt_force_prev - flt_force) > 7) || flt_force == 0) && aim) { |
ahsueh | 7:689f891d62cd | 106 | //mouseKey.keyCode('c'); |
ahsueh | 7:689f891d62cd | 107 | aim = false; |
ahsueh | 7:689f891d62cd | 108 | } else if ((flt_force >20)&&(!aim)) { |
ahsueh | 7:689f891d62cd | 109 | //mouseKey.keyCode('b'); |
ahsueh | 7:689f891d62cd | 110 | aim = true; |
ahsueh | 7:689f891d62cd | 111 | //mouseKey.press(MOUSE_LEFT); |
ahsueh | 7:689f891d62cd | 112 | } |
ahsueh | 7:689f891d62cd | 113 | |
ahsueh | 6:753418e86c95 | 114 | if (ax > 0 && az > 0) { |
ahsueh | 6:753418e86c95 | 115 | x = (int) (0.0 - cos(flt_angle) * flt_force); |
ahsueh | 6:753418e86c95 | 116 | y = (int) (sin(flt_angle) * flt_force); |
ahsueh | 6:753418e86c95 | 117 | } else if (ax < 0 && az > 0) { |
ahsueh | 6:753418e86c95 | 118 | x = (int) (0.0 - cos(flt_angle) * flt_force); |
ahsueh | 6:753418e86c95 | 119 | y = (int) (sin(flt_angle) * flt_force); |
ahsueh | 6:753418e86c95 | 120 | } |
ahsueh | 4:fea2289b42cd | 121 | |
ahsueh | 6:753418e86c95 | 122 | //mouseKey.printf("Angle: %1.2f Force: %1.2f Move: x: %0d y: %0d x_: %0d y_ = %0d\n", |
ahsueh | 6:753418e86c95 | 123 | // flt_angle, flt_force, x, y, mouseTravelX, mouseTravelY); |
ahsueh | 6:753418e86c95 | 124 | |
ahsueh | 6:753418e86c95 | 125 | mouseKey.move((x-oldx), (y-oldy)); |
ahsueh | 6:753418e86c95 | 126 | mouseMem((x-oldx),(y-oldy)); |
ahsueh | 6:753418e86c95 | 127 | oldx = x; |
ahsueh | 6:753418e86c95 | 128 | oldy = y; |
ahsueh | 7:689f891d62cd | 129 | fsrValPrev = fsrVal; |
ahsueh | 7:689f891d62cd | 130 | flt_force_prev = flt_force; |
ahsueh | 7:689f891d62cd | 131 | wait(0.01); |
ahsueh | 3:f3520156ca98 | 132 | } |
bjo3rn | 0:c9bb3c9d5ce8 | 133 | } |
ahsueh | 2:31cf09b1ad9c | 134 |