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);
}
}
1 Answer 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.
Explore related questions
See similar questions with these tags.