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 HW3 Controller Team!

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?

UserRevisionLine numberNew 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