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 08:21:05 2015 +0000
Revision:
6:753418e86c95
Parent:
4:fea2289b42cd
Child:
7:689f891d62cd
Working Revision;

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);
ahsueh 3:f3520156ca98 14 AnalogIn fsr(A5);
bjo3rn 0:c9bb3c9d5ce8 15 #define MMA8451_I2C_ADDRESS (0x1d<<1)
bjo3rn 0:c9bb3c9d5ce8 16
bjo3rn 0:c9bb3c9d5ce8 17 //serial connection to PC via USB
bjo3rn 0:c9bb3c9d5ce8 18 Serial pc(USBTX, USBRX);
ahsueh 1:01b4684bc210 19 LSM303DLHC lsm(SDA, SCL);
ahsueh 6:753418e86c95 20 USBMouseKeyboard mouseKey;
ahsueh 2:31cf09b1ad9c 21
bjo3rn 0:c9bb3c9d5ce8 22
ahsueh 6:753418e86c95 23 float fsrVal;
ahsueh 6:753418e86c95 24 float fsrValPrev;
ahsueh 6:753418e86c95 25 int count;
ahsueh 6:753418e86c95 26 // acc and mag values
ahsueh 6:753418e86c95 27 float ax, ay, az, mx, my, mz;
ahsueh 6:753418e86c95 28 float theta;
ahsueh 6:753418e86c95 29
ahsueh 6:753418e86c95 30 int oldx, oldy;
ahsueh 6:753418e86c95 31
ahsueh 6:753418e86c95 32 int mouseTravelX = 0;
ahsueh 6:753418e86c95 33 int mouseTravelY = 0;
ahsueh 6:753418e86c95 34
ahsueh 6:753418e86c95 35 float angles[8] = {0};
ahsueh 6:753418e86c95 36 float forces[8] = {0};
bjo3rn 0:c9bb3c9d5ce8 37
ahsueh 6:753418e86c95 38 void mouseMem(int x_, int y_) {
ahsueh 6:753418e86c95 39 mouseTravelX += x_;
ahsueh 6:753418e86c95 40 mouseTravelY += y_;
ahsueh 6:753418e86c95 41 }
ahsueh 2:31cf09b1ad9c 42
ahsueh 6:753418e86c95 43 float filter(float* array, int len, float value) {
ahsueh 6:753418e86c95 44 float mean = 0.0;
ahsueh 6:753418e86c95 45 for(int i = 0; i<len - 1; i++) {
ahsueh 6:753418e86c95 46 mean += array[i + 1];
ahsueh 6:753418e86c95 47 array[i] = array[i + 1];
ahsueh 6:753418e86c95 48 }
ahsueh 6:753418e86c95 49 mean += value;
ahsueh 6:753418e86c95 50 array[len - 1] = value;
ahsueh 6:753418e86c95 51 return mean / (float)len;
ahsueh 6:753418e86c95 52 }
ahsueh 2:31cf09b1ad9c 53
ahsueh 6:753418e86c95 54 int main(void){
ahsueh 4:fea2289b42cd 55 int x = 0;
ahsueh 4:fea2289b42cd 56 int y = 0;
ahsueh 6:753418e86c95 57 while(1){
ahsueh 4:fea2289b42cd 58 fsrVal = fsr.read();
ahsueh 6:753418e86c95 59 lsm.read(&ax, &ay, &az, &mx, &my, &mz);
ahsueh 6:753418e86c95 60
ahsueh 6:753418e86c95 61 float cur_angle = atan(ax / az);
ahsueh 6:753418e86c95 62 float cur_force = fsrVal*500;
ahsueh 6:753418e86c95 63
ahsueh 6:753418e86c95 64 float flt_force = filter(forces, 8, cur_force);
ahsueh 6:753418e86c95 65 float flt_angle = filter(angles, 8, cur_angle);
ahsueh 6:753418e86c95 66
ahsueh 3:f3520156ca98 67
ahsueh 6:753418e86c95 68
ahsueh 6:753418e86c95 69 //mouseKey.printf("ax: %1.2f az: %1.2f fsrVal: %1.2f \n", ax, az, fsrVal);
ahsueh 6:753418e86c95 70
ahsueh 6:753418e86c95 71 //if((FsrVal > FsrValPrev && FsrVal > 0 && FsrValPrev > 0 && count <100) || (FsrVal > 0.8 && count <70)){
ahsueh 6:753418e86c95 72
ahsueh 6:753418e86c95 73
ahsueh 6:753418e86c95 74 if (ax > 0 && az > 0) {
ahsueh 6:753418e86c95 75 x = (int) (0.0 - cos(flt_angle) * flt_force);
ahsueh 6:753418e86c95 76 y = (int) (sin(flt_angle) * flt_force);
ahsueh 6:753418e86c95 77 } else if (ax < 0 && az > 0) {
ahsueh 6:753418e86c95 78 x = (int) (0.0 - cos(flt_angle) * flt_force);
ahsueh 6:753418e86c95 79 y = (int) (sin(flt_angle) * flt_force);
ahsueh 6:753418e86c95 80 }
ahsueh 4:fea2289b42cd 81
ahsueh 6:753418e86c95 82 //mouseKey.printf("Angle: %1.2f Force: %1.2f Move: x: %0d y: %0d x_: %0d y_ = %0d\n",
ahsueh 6:753418e86c95 83 // flt_angle, flt_force, x, y, mouseTravelX, mouseTravelY);
ahsueh 6:753418e86c95 84
ahsueh 6:753418e86c95 85 mouseKey.move((x-oldx), (y-oldy));
ahsueh 6:753418e86c95 86 mouseMem((x-oldx),(y-oldy));
ahsueh 6:753418e86c95 87 oldx = x;
ahsueh 6:753418e86c95 88 oldy = y;
ahsueh 6:753418e86c95 89
ahsueh 6:753418e86c95 90
ahsueh 6:753418e86c95 91 wait(0.02);
ahsueh 3:f3520156ca98 92 }
bjo3rn 0:c9bb3c9d5ce8 93 }
ahsueh 2:31cf09b1ad9c 94