Use Accelerometer and Joystick to mimic a mouse. This is for a class project. It is done for educational purpose. It is not practical to real world use.

Dependencies:   C12832_lcd MMA7660 USBDevice mbed

Files at this revision

API Documentation at this revision

Comitter:
thlu
Date:
Fri Mar 28 06:08:33 2014 +0000
Parent:
1:03d0f8a4a2d7
Commit message:
Fixed filter_noise comparison logic.

Changed in this revision

accelestick.cpp Show annotated file Show diff for this revision Revisions of this file
accelestick.h Show annotated file Show diff for this revision Revisions of this file
--- a/accelestick.cpp	Thu Mar 27 23:55:18 2014 +0000
+++ b/accelestick.cpp	Fri Mar 28 06:08:33 2014 +0000
@@ -17,7 +17,7 @@
 //     3. push and hold left joystick for 1 second to initiate left mouse button
 //        press and hold feature. LED1 will lit up. Push left joystick again to
 //        release
-//     4. press joystick center position down twice to initiate accelestick 
+//     4. press joystick center position down twice to initiate accelestick
 //          calibration. This will reduce cursor movement at rest position. LED3
 //          will flash rapidly and then remain lit when done
 //     5. push right joystick twice to enable debug mode printing. Debug messages
@@ -225,10 +225,9 @@
     if (calib_on) {
         calib_mma(current);
     }
-    mouse_info.x = current.x - offset.x;
-    mouse_info.y = current.y - offset.y;
-    mouse_info.z = current.z - offset.z;
-    detect_mma_rest();
+    mouse_info.x = filter_noise(current.x - offset.x);
+    mouse_info.y = filter_noise(current.y - offset.y);
+    mouse_info.z = filter_noise(current.z - offset.z);
 }
 
 void update_mouse()
@@ -329,14 +328,15 @@
     }
 }
 
-// use calibrated mouse x,y,z values to detect rest
-void detect_mma_rest ()
+//
+int16_t filter_noise (int16_t const num)
 {
-    if ((abs(mouse_info.z) <= 0.06*SCALE_Z) &&
-            (abs(mouse_info.x) <= 0.10*SCALE_X) &&
-            (abs(mouse_info.y) <= 0.10*SCALE_Y)) {
-        mouse_info.x = 0;
-        mouse_info.y = 0;
+    if (abs(num) < NOISE_FLOOR) {
+        return 0;
+    } else if (num < 0) {
+        return num + NOISE_FLOOR;
+    } else {
+        return num - NOISE_FLOOR;
     }
 }
 
--- a/accelestick.h	Thu Mar 27 23:55:18 2014 +0000
+++ b/accelestick.h	Fri Mar 28 06:08:33 2014 +0000
@@ -14,9 +14,10 @@
 #ifndef ACCELESTICK_H
   #define ACCELESTICK_H
  
-#define SCALE_X 50       // float to int conversion: g value has noise about 0.02
+#define SCALE_X 50      // float to int conversion factor
 #define SCALE_Y SCALE_X 
 #define SCALE_Z SCALE_X
+#define NOISE_FLOOR 0.10*SCALE_X // zero out any integer g value less than NOISE_FLOOR
 
 #define ACCEL_MIN -1.5
 #define ACCEL_MAX 1.5
@@ -70,8 +71,8 @@
   // print debug messages to USB serial
   void print_debug_msg();
   
-  // detect if accelestick is at rest
-  void detect_mma_rest();
+  // filter out accelestick noise
+  int16_t filter_noise(int16_t const);
   
   // flash specified LED. Needed 2 copies because Ticker cannot attach functions with parameters
   void flash_led2();