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@2:31cf09b1ad9c, 2015-09-19 (annotated)
- Committer:
- ahsueh
- Date:
- Sat Sep 19 23:48:14 2015 +0000
- Revision:
- 2:31cf09b1ad9c
- Parent:
- 1:01b4684bc210
- Child:
- 3:f3520156ca98
update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bjo3rn | 0:c9bb3c9d5ce8 | 1 | #include "mbed.h" |
ahsueh | 1:01b4684bc210 | 2 | //#include "MMA8451Q.h" |
ahsueh | 1:01b4684bc210 | 3 | //#include "USBMouse.h" |
ahsueh | 2:31cf09b1ad9c | 4 | //#include "USBKeyboard.h" |
ahsueh | 2:31cf09b1ad9c | 5 | #include "USBMouseKeyboard.h" |
ahsueh | 1:01b4684bc210 | 6 | #include "LSM303DLHC.h" |
ahsueh | 2:31cf09b1ad9c | 7 | #include "PinDetect.h" |
ahsueh | 2:31cf09b1ad9c | 8 | #include "math.h" |
bjo3rn | 0:c9bb3c9d5ce8 | 9 | |
bjo3rn | 0:c9bb3c9d5ce8 | 10 | // define I2C Pins and address for KL25Z. Taken from default sample code. |
ahsueh | 1:01b4684bc210 | 11 | PinName const SDA = D14; |
ahsueh | 1:01b4684bc210 | 12 | PinName const SCL = D15; |
ahsueh | 2:31cf09b1ad9c | 13 | PinDetect button(D2); |
bjo3rn | 0:c9bb3c9d5ce8 | 14 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
bjo3rn | 0:c9bb3c9d5ce8 | 15 | |
bjo3rn | 0:c9bb3c9d5ce8 | 16 | //serial connection to PC via USB |
bjo3rn | 0:c9bb3c9d5ce8 | 17 | Serial pc(USBTX, USBRX); |
ahsueh | 1:01b4684bc210 | 18 | LSM303DLHC lsm(SDA, SCL); |
ahsueh | 2:31cf09b1ad9c | 19 | USBMouseKeyboard mouseKey; |
ahsueh | 1:01b4684bc210 | 20 | |
ahsueh | 1:01b4684bc210 | 21 | // acc and mag values |
ahsueh | 1:01b4684bc210 | 22 | float ax, ay, az; |
ahsueh | 1:01b4684bc210 | 23 | float mx, my, mz; |
ahsueh | 1:01b4684bc210 | 24 | |
ahsueh | 2:31cf09b1ad9c | 25 | float mx0, my0, mz0; // Original Position |
ahsueh | 2:31cf09b1ad9c | 26 | float mx1, my1, mz1; |
ahsueh | 2:31cf09b1ad9c | 27 | float mx2, my2, mz2; |
ahsueh | 2:31cf09b1ad9c | 28 | |
ahsueh | 2:31cf09b1ad9c | 29 | int trackMouse = 0; |
ahsueh | 2:31cf09b1ad9c | 30 | |
ahsueh | 2:31cf09b1ad9c | 31 | // Subtract original point from input point |
ahsueh | 2:31cf09b1ad9c | 32 | float calcDistance(float mxin, float myin, float mzin) { |
ahsueh | 2:31cf09b1ad9c | 33 | float deltax, deltay, deltaz; |
ahsueh | 2:31cf09b1ad9c | 34 | float final; |
ahsueh | 2:31cf09b1ad9c | 35 | deltax = mxin - mx0; |
ahsueh | 2:31cf09b1ad9c | 36 | deltay = myin - my0; |
ahsueh | 2:31cf09b1ad9c | 37 | deltaz = mzin - mz0; |
ahsueh | 2:31cf09b1ad9c | 38 | |
ahsueh | 2:31cf09b1ad9c | 39 | final = sqrt(pow(deltax,2) + pow(deltay,2) + pow(deltaz,2)); |
ahsueh | 2:31cf09b1ad9c | 40 | |
ahsueh | 2:31cf09b1ad9c | 41 | mouseKey.printf("CalcDistance o(%1.2f %1.2f %1.2f) d(%1.2f %1.2f %1.2f) Final: %1.2f\n", |
ahsueh | 2:31cf09b1ad9c | 42 | mx0, my0, mz0, mxin, myin, mzin, final); |
ahsueh | 2:31cf09b1ad9c | 43 | |
ahsueh | 2:31cf09b1ad9c | 44 | |
ahsueh | 2:31cf09b1ad9c | 45 | return final; |
ahsueh | 2:31cf09b1ad9c | 46 | } |
ahsueh | 2:31cf09b1ad9c | 47 | |
ahsueh | 2:31cf09b1ad9c | 48 | // Magically convert magnetic coordinates to mouse coordinates |
ahsueh | 2:31cf09b1ad9c | 49 | int convMagToMouse() { |
ahsueh | 2:31cf09b1ad9c | 50 | return 0; |
ahsueh | 2:31cf09b1ad9c | 51 | } |
ahsueh | 2:31cf09b1ad9c | 52 | |
ahsueh | 2:31cf09b1ad9c | 53 | |
ahsueh | 2:31cf09b1ad9c | 54 | void buttonPress(void) { |
ahsueh | 2:31cf09b1ad9c | 55 | //Grab position |
ahsueh | 2:31cf09b1ad9c | 56 | lsm.read(&ax, &ay, &az, &mx0, &my0, &mz0); //get acceleration |
ahsueh | 2:31cf09b1ad9c | 57 | mouseKey.printf("PRESS HELD mag1 %1.2f %1.2f %1.2f\n", mx0, my0, mz0); //print ascii-encoded float to serial port |
ahsueh | 2:31cf09b1ad9c | 58 | |
ahsueh | 2:31cf09b1ad9c | 59 | trackMouse = 1; |
ahsueh | 2:31cf09b1ad9c | 60 | |
ahsueh | 2:31cf09b1ad9c | 61 | } |
ahsueh | 2:31cf09b1ad9c | 62 | |
ahsueh | 2:31cf09b1ad9c | 63 | void buttonPressHeld(void) { |
ahsueh | 2:31cf09b1ad9c | 64 | |
ahsueh | 2:31cf09b1ad9c | 65 | } |
ahsueh | 2:31cf09b1ad9c | 66 | |
ahsueh | 2:31cf09b1ad9c | 67 | |
ahsueh | 2:31cf09b1ad9c | 68 | void buttonDeassert(void) { |
ahsueh | 2:31cf09b1ad9c | 69 | // Grab position |
ahsueh | 2:31cf09b1ad9c | 70 | lsm.read(&ax, &ay, &az, &mx2, &my2, &mz2); //get acceleration |
ahsueh | 2:31cf09b1ad9c | 71 | mouseKey.printf("PRESS RELEASE %1.2f %1.2f %1.2f\n", mx2, my2, mz2); //print ascii-encoded float to serial port |
ahsueh | 2:31cf09b1ad9c | 72 | |
ahsueh | 2:31cf09b1ad9c | 73 | trackMouse = 0; |
ahsueh | 2:31cf09b1ad9c | 74 | |
ahsueh | 2:31cf09b1ad9c | 75 | float distance = calcDistance(mx2, my2, mz2); |
ahsueh | 2:31cf09b1ad9c | 76 | |
ahsueh | 2:31cf09b1ad9c | 77 | // TODO figure out how to scale mouse movement |
ahsueh | 2:31cf09b1ad9c | 78 | //if(distance > 0){ |
ahsueh | 2:31cf09b1ad9c | 79 | // mouseKey.move(distance,0); |
ahsueh | 2:31cf09b1ad9c | 80 | //} |
ahsueh | 2:31cf09b1ad9c | 81 | } |
ahsueh | 2:31cf09b1ad9c | 82 | |
ahsueh | 2:31cf09b1ad9c | 83 | |
bjo3rn | 0:c9bb3c9d5ce8 | 84 | |
bjo3rn | 0:c9bb3c9d5ce8 | 85 | int main(void) |
bjo3rn | 0:c9bb3c9d5ce8 | 86 | { |
ahsueh | 1:01b4684bc210 | 87 | pc.printf("Hello\n"); |
bjo3rn | 0:c9bb3c9d5ce8 | 88 | |
ahsueh | 1:01b4684bc210 | 89 | //configure on-board I2C accelerometer on KL25Z |
ahsueh | 1:01b4684bc210 | 90 | //MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); |
bjo3rn | 0:c9bb3c9d5ce8 | 91 | |
ahsueh | 2:31cf09b1ad9c | 92 | button.mode(PullUp); |
ahsueh | 2:31cf09b1ad9c | 93 | button.setSampleFrequency(); |
ahsueh | 2:31cf09b1ad9c | 94 | button.attach_asserted(&buttonPress); |
ahsueh | 2:31cf09b1ad9c | 95 | button.attach_asserted_held(&buttonPressHeld); |
ahsueh | 2:31cf09b1ad9c | 96 | button.attach_deasserted(&buttonDeassert); |
ahsueh | 2:31cf09b1ad9c | 97 | button.setAssertValue(0); |
ahsueh | 2:31cf09b1ad9c | 98 | |
ahsueh | 2:31cf09b1ad9c | 99 | mx1 = 0; mx2 = 0; |
ahsueh | 2:31cf09b1ad9c | 100 | my1 = 0; my2 = 0; |
ahsueh | 2:31cf09b1ad9c | 101 | mz1 = 0; mz2 = 0; |
ahsueh | 2:31cf09b1ad9c | 102 | |
ahsueh | 1:01b4684bc210 | 103 | while (true) { |
ahsueh | 2:31cf09b1ad9c | 104 | //lsm.read(&ax, &ay, &az, &mx, &my, &mz); //get acceleration |
ahsueh | 2:31cf09b1ad9c | 105 | |
ahsueh | 2:31cf09b1ad9c | 106 | // While button is pressed, keep polling position for mouse pointer. |
ahsueh | 2:31cf09b1ad9c | 107 | if (trackMouse == 1) { |
ahsueh | 2:31cf09b1ad9c | 108 | lsm.read(&ax, &ay, &az, &mx1, &my1, &mz1); //get acceleration |
ahsueh | 2:31cf09b1ad9c | 109 | |
ahsueh | 2:31cf09b1ad9c | 110 | } |
ahsueh | 2:31cf09b1ad9c | 111 | |
ahsueh | 2:31cf09b1ad9c | 112 | //pc.printf("acc %1.2f %1.2f %1.2f\n", ax, ay, az); //print ascii-encoded float to serial port |
ahsueh | 2:31cf09b1ad9c | 113 | //keyboard.printf("mag %1.2f %1.2f %1.2f\n", mx, my, mz); //print ascii-encoded float to serial port |
ahsueh | 1:01b4684bc210 | 114 | wait(0.05f); // wait 50ms (20Hz update rate) |
ahsueh | 1:01b4684bc210 | 115 | } |
bjo3rn | 0:c9bb3c9d5ce8 | 116 | } |
ahsueh | 2:31cf09b1ad9c | 117 |