The library comments state that it was untested with the Leonardo. So far it appears to work fine with Arduino 1.0.4 provided you do not define ENCODER_OPTIMIZE_INTERRUPTS. If you do, as with the code below, the following compile time errors are generated. Since this is the same chip as the Teensy 2.0, would it be difficult to get the same optimizations working? I'm having difficulty tracing what is happening with the library code. My Arduino micro is available for any code you need tested.
In file included from StepPlatform.ino:32:
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h: In function 'void __vector_1()':
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:184: error: 'static void Encoder::update(Encoder_internal_state_t*)' is private
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:914: error: within this context
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h: In function 'void __vector_2()':
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:184: error: 'static void Encoder::update(Encoder_internal_state_t*)' is private
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:917: error: within this context
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h: In function 'void __vector_3()':
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:184: error: 'static void Encoder::update(Encoder_internal_state_t*)' is private
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:920: error: within this context
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h: In function 'void __vector_4()':
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:184: error: 'static void Encoder::update(Encoder_internal_state_t*)' is private
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:923: error: within this context
In file included from StepPlatform.ino:32:
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h: In function 'void __vector_1()':
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:184: error: 'static void Encoder::update(Encoder_internal_state_t*)' is private
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:914: error: within this context
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h: In function 'void __vector_2()':
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:184: error: 'static void Encoder::update(Encoder_internal_state_t*)' is private
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:917: error: within this context
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h: In function 'void __vector_3()':
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:184: error: 'static void Encoder::update(Encoder_internal_state_t*)' is private
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:920: error: within this context
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h: In function 'void __vector_4()':
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:184: error: 'static void Encoder::update(Encoder_internal_state_t*)' is private
C:\Users\slo\Documents\Arduino\libraries\Encoder/Encoder.h:923: error: within this context
Code:
#include <Wire.h>
// This optional setting causes Encoder to use more optimized code,
// It must be defined before Encoder.h is included.
#define ENCODER_OPTIMIZE_INTERRUPTS
#include <Encoder.h>
//INPUT
static const uint8_t BUTTON_PIN = 7;
static const uint8_t SPEED_POT_PIN = A0;
static const uint8_t JOY_X_PIN = A1;
static const uint8_t JOY_Y_PIN = A2;
static const uint8_t ROTATE_POT_PIN = A3;
Encoder knobX(0, A4);
Encoder knobY(1, A5);
int32_t positionX = -999;
int32_t positionY = -999;
//OUTPUT
static const uint8_t DUINO_LED_PIN = 13;
void setup()
{
Serial.begin(9600);//USB
// Serial1.begin(9600);// TTL serial pins are used for encoder interrupts. Software serial ties up interrupts so it is not a good workaround.
Wire.begin(); //I2C pins are the only remaining interrupt pins. It is a tough choice to loose either TTL serial or i2c for the sake of fast encoder performance.
// ramp up LED brightness then blink once to signal end of setup and give time to launch IDE serial monitor
pinMode(DUINO_LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(DUINO_LED_PIN, LOW);
for ( int i = 0; i < 255; i++ )
{
analogWrite(DUINO_LED_PIN, i);
delay(30);
}
digitalWrite(DUINO_LED_PIN, LOW);
delay(750);
digitalWrite(DUINO_LED_PIN, HIGH);
}
void loop()
{
long newX, newY;
newX = knobX.read();
newY = knobY.read();
if (newX != positionX || newY != positionY) {
Serial.print("X = ");
Serial.print(newX);
Serial.print(", Y = ");
Serial.print(newY);
Serial.println();
positionX = newX;
positionY = newY;
}
// if a character is sent from the serial monitor,
// reset both back to zero.
if (Serial.available()) {
Serial.read();
Serial.println("Reset both knobs to zero");
knobX.write(0);
knobY.write(0);
}
}