Make use of PMW3360's Angle_Tune register
Sensor can rotate its output up to +/-30 degrees.
This commit is contained in:
parent
9ed7d913fc
commit
f4ad846e82
|
@ -32,7 +32,7 @@ static const int DEBOUNCE = 10; // ms
|
||||||
static const int SCROLL_DEBOUNCE = 100; // ms
|
static const int SCROLL_DEBOUNCE = 100; // ms
|
||||||
static const int SCROLL_BUTT_DEBOUNCE = 100; // ms
|
static const int SCROLL_BUTT_DEBOUNCE = 100; // ms
|
||||||
|
|
||||||
static const float ROTATIONAL_TRANSFORM_ANGLE = 20;
|
static const int8_t ROTATIONAL_TRANSFORM_ANGLE = 20;
|
||||||
|
|
||||||
static const int MOUSE_LEFT_PIN = 4;
|
static const int MOUSE_LEFT_PIN = 4;
|
||||||
static const int MOUSE_RIGHT_PIN = 7;
|
static const int MOUSE_RIGHT_PIN = 7;
|
||||||
|
@ -53,6 +53,7 @@ static const byte DELTA_Y_L = 0x05;
|
||||||
static const byte DELTA_Y_H = 0x06;
|
static const byte DELTA_Y_H = 0x06;
|
||||||
static const byte CONFIG1 = 0x0F;
|
static const byte CONFIG1 = 0x0F;
|
||||||
static const byte CONFIG2 = 0x10;
|
static const byte CONFIG2 = 0x10;
|
||||||
|
static const byte ANGLE_TUNE = 0x11;
|
||||||
static const byte SROM_ENABLE = 0x13;
|
static const byte SROM_ENABLE = 0x13;
|
||||||
static const byte SROM_ID = 0x2A;
|
static const byte SROM_ID = 0x2A;
|
||||||
static const byte POWER_UP_RESET = 0x3A;
|
static const byte POWER_UP_RESET = 0x3A;
|
||||||
|
@ -63,9 +64,6 @@ static const byte SROM_LOAD_BURST = 0x62;
|
||||||
boolean debugMode = false;
|
boolean debugMode = false;
|
||||||
boolean wdtMode = false;
|
boolean wdtMode = false;
|
||||||
|
|
||||||
float cosTransform;
|
|
||||||
float sinTransform;
|
|
||||||
|
|
||||||
int buttonPin[5] = { MOUSE_LEFT_PIN, MOUSE_RIGHT_PIN, MOUSE_MIDDLE_PIN, MOUSE_BACK_PIN, MOUSE_FORWARD_PIN };
|
int buttonPin[5] = { MOUSE_LEFT_PIN, MOUSE_RIGHT_PIN, MOUSE_MIDDLE_PIN, MOUSE_BACK_PIN, MOUSE_FORWARD_PIN };
|
||||||
bool buttonState[5] = { false, false, false, false, false };
|
bool buttonState[5] = { false, false, false, false, false };
|
||||||
uint8_t buttonBuffer[5] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
uint8_t buttonBuffer[5] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||||
|
@ -116,9 +114,6 @@ void setup() {
|
||||||
|
|
||||||
initialisePMW3360();
|
initialisePMW3360();
|
||||||
|
|
||||||
cosTransform = cos(ROTATIONAL_TRANSFORM_ANGLE * PI / 180);
|
|
||||||
sinTransform = sin(ROTATIONAL_TRANSFORM_ANGLE * PI / 180);
|
|
||||||
|
|
||||||
dx = 0;
|
dx = 0;
|
||||||
dy = 0;
|
dy = 0;
|
||||||
|
|
||||||
|
@ -321,6 +316,10 @@ void initialisePMW3360(void) {
|
||||||
// (If this were a wireless design, it'd be 0x20.)
|
// (If this were a wireless design, it'd be 0x20.)
|
||||||
adnsWriteReg(CONFIG2, 0x00);
|
adnsWriteReg(CONFIG2, 0x00);
|
||||||
|
|
||||||
|
// Rotate the x and y results, since the sensor isn't quite squared up in
|
||||||
|
// the enclosure.
|
||||||
|
adnsWriteReg(ANGLE_TUNE, ROTATIONAL_TRANSFORM_ANGLE);
|
||||||
|
|
||||||
adnsComEnd();
|
adnsComEnd();
|
||||||
|
|
||||||
if (debugMode) {
|
if (debugMode) {
|
||||||
|
@ -447,14 +446,8 @@ void loop() {
|
||||||
int x = xh << 8 | xl;
|
int x = xh << 8 | xl;
|
||||||
int y = yh << 8 | yl;
|
int y = yh << 8 | yl;
|
||||||
|
|
||||||
// Rotate the x and y results, since the sensor isn't quite squared up in
|
dx -= x;
|
||||||
// the enclosure.
|
dy += y;
|
||||||
// See here: // See here: https://en.wikipedia.org/wiki/Rotation_matrix
|
|
||||||
int xPrime = round(((float) x * cosTransform) - ((float) y * sinTransform));
|
|
||||||
int yPrime = round(((float) x * sinTransform) + ((float) y * cosTransform));
|
|
||||||
|
|
||||||
dx -= xPrime;
|
|
||||||
dy += yPrime;
|
|
||||||
|
|
||||||
adnsComEnd();
|
adnsComEnd();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue