Make use of PMW3360's Angle_Tune register

Sensor can rotate its output up to +/-30 degrees.
This commit is contained in:
Daniel Kao 2019-11-16 03:50:01 -08:00 committed by PloopyCo
parent 7f561019d7
commit 41e1508354
1 changed files with 8 additions and 15 deletions

View File

@ -32,7 +32,7 @@ static const int DEBOUNCE = 10; // ms
static const int SCROLL_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_RIGHT_PIN = 7;
@ -53,6 +53,7 @@ static const byte DELTA_Y_L = 0x05;
static const byte DELTA_Y_H = 0x06;
static const byte CONFIG1 = 0x0F;
static const byte CONFIG2 = 0x10;
static const byte ANGLE_TUNE = 0x11;
static const byte SROM_ENABLE = 0x13;
static const byte SROM_ID = 0x2A;
static const byte POWER_UP_RESET = 0x3A;
@ -63,9 +64,6 @@ static const byte SROM_LOAD_BURST = 0x62;
boolean debugMode = 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 };
bool buttonState[5] = { false, false, false, false, false };
uint8_t buttonBuffer[5] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
@ -116,9 +114,6 @@ void setup() {
initialisePMW3360();
cosTransform = cos(ROTATIONAL_TRANSFORM_ANGLE * PI / 180);
sinTransform = sin(ROTATIONAL_TRANSFORM_ANGLE * PI / 180);
dx = 0;
dy = 0;
@ -321,6 +316,10 @@ void initialisePMW3360(void) {
// (If this were a wireless design, it'd be 0x20.)
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();
if (debugMode) {
@ -447,14 +446,8 @@ void loop() {
int x = xh << 8 | xl;
int y = yh << 8 | yl;
// Rotate the x and y results, since the sensor isn't quite squared up in
// the enclosure.
// 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;
dx -= x;
dy += y;
adnsComEnd();