I want to read a Omron E6B2-CWZ6C Incremental Rotary Encoder w/Index (360P/R). A couple questions, I found out that an Uno can only handle 2 interrupt pins and I think I need 3 for the Index. What do I need to do to the following code to get it to run on a Mega which I believe can handle 3 interrupt pins?
Also I am getting a 'outAChange' was not declared in this scope. What am I missing here.
I will be using the data from the encoder value to run a NeoPixel 60 for a directional mast/antenna.
Here is the code I am trying to use:
// Wiring connections for my encoder:
// Brown : VCC = 5 to 24VDC
// Blue: 0V(Common) = GND
// Shield: GND
// Black: outA = Digital pin 2
// White: outB = Digital pin 3
// Orange: outZ = Digital pin 4 (Index)
// With these outA/outB/outZ connections and the interrupt code below
// clockwise rotation gives positive encoder counts
const int outA = 2;
const int outB = 3;
const int outZ = 4;
volatile long encoder = 0; // declare volatile since modified by interrupt routines
float encoder_save = 0;
void setup(){ // set encoder pins
pinMode(outA, INPUT_PULLUP);
pinMode(outB, INPUT_PULLUP);
pinMode(outZ, INPUT_PULLUP); //Index
// attach interrupts to pins
attachInterrupt(digitalPinToInterrupt(outA), outAChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(outB), outBChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(outZ), outZChange, CHANGE);
// initialize serial
Serial.begin(57600);
}
void loop(){
if (encoder_save != encoder) // only print if new value
encoder_save = encoder;
// If Index(Z) reads low reset encoder to 0
if (digitalRead(outZ) == LOW)
{
encoder = 0;
}
}
{
Serial.println((encoder * 360)/360);
}
}
// interrupt routines
void outAChange(){
// when outA changes, outA==outB means negative direction
encoder += digitalRead(outA) == digitalRead(outB) ? -1 : 1;
if (encoder < 0)
{
encoder = (encoder + 360);
}
}
void outBChange(){
// when outB changes, outA==outB means positive direction
encoder += digitalRead(outA) == digitalRead(outB) ? 1 : -1;
if (encoder >= 360)
{
encoder = (encoder - 360);
}
}