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