0

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);
}
}
asked Sep 22, 2018 at 17:56

1 Answer 1

1

Your brackets are all messed up. If you pass your code through an autoformatter (such as the one included in the IDE) you end up with this:

// 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;
 }
}
{ << WHAT
 Serial.println((encoder * 360) / 360); << IS
} << THIS
} << CODE?
// 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);
 }
}

As you can see, after the end of your loop() function, you have an extraneous block of code with a bunch of random brackets.

You need to decide where in your program that should actually be and move it there, deleting those extra brackets.

answered Sep 22, 2018 at 18:02
2
  • I could use a little more help than that. I am really new at coding. thanks. Commented Sep 22, 2018 at 21:24
  • I cannot help you. Only you know where you want that bit of code. Commented Sep 22, 2018 at 21:32

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.