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:
Mon Sep 21 12:14:01 2015 +0000
Revision:
7:689f891d62cd
Parent:
6:753418e86c95
Final

Who changed what in which revision?

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