Hello,
I have EAW - Absolute Contacting Encoder (ACE™) from Bourns and it doesn't return accurate position. There is lot of jumping between values and lot of 255s. That should be problem with wiring but I am pretty sure that wiring is correct, but I might be wrong. Pins 2,3,4,5,6,7,8,9 on Arduino are connected to pins 1,2,3,4,5,6,7,8 on Encoder and C pin on encoder is connected to GND.
Values look like this:
pin 56 raw 4 pos 0 upos 0 mpos 0
pin 184 raw 5 pos 0 upos 0 mpos 0
pin 184 raw 5 pos 0 upos 0 mpos 0
pin 152 raw 6 pos 0 upos 0 mpos 0
pin 24 raw 7 pos 0 upos 0 mpos 0
pin 72 raw 9 pos 0 upos 0 mpos 0
pin 72 raw 9 pos 0 upos 0 mpos 0
pin 73 raw 10 pos 0 upos 0 mpos 0
pin 73 raw 10 pos 0 upos 0 mpos 0
pin 75 raw 255 pos 0 upos 0 mpos 0
pin 43 raw 255 pos 0 upos 0 mpos 0
pin 171 raw 255 pos 0 upos 0 mpos 0
pin 155 raw 255 pos 0 upos 0 mpos 0
pin 25 raw 255 pos 0 upos 0 mpos 0
pin 24 raw 7 pos 0 upos 0 mpos 0
pin 88 raw 255 pos 0 upos 0 mpos 0
pin 8 raw 8 pos 0 upos 0 mpos 0
pin 0 raw 255 pos 0 upos 0 mpos 0
pin 32 raw 104 pos 0 upos 0 mpos 0
pin 162 raw 255 pos 0 upos 0 mpos 0
pin 131 raw 68 pos 0 upos 0 mpos 0
pin 203 raw 46 pos 0 upos 0 mpos 0
pin 138 raw 255 pos 0 upos 0 mpos 0
pin 34 raw 255 pos 0 upos 0 mpos 0
pin 18 raw 41 pos 0 upos 0 mpos 0
pin 83 raw 43 pos 0 upos 0 mpos 0
pin 195 raw 45 pos 0 upos 0 mpos 0
pin 235 raw 47 pos 0 upos 0 mpos 0
pin 227 raw 66 pos 0 upos 0 mpos 0
pin 67 raw 255 pos 0 upos 0 mpos 0
pin 19 raw 54 pos 0 upos 0 mpos 0
pin 3 raw 56 pos 1 upos 1 mpos 1
pin 9 raw 57 pos 0 upos 0 mpos 0
pin 169 raw 59 pos 0 upos 0 mpos 0
pin 225 raw 61 pos 0 upos 0 mpos 0
pin 243 raw 65 pos 0 upos 0 mpos 0
pin 163 raw 67 pos 0 upos 0 mpos 0
pin 129 raw 71 pos 0 upos 0 mpos 0
pin 128 raw 72 pos 0 upos 0 mpos 0
pin 240 raw 77 pos 0 upos 0 mpos 0
Code looks like this:
// Include the encoder library and maps
#include <ACE128.h> // Absolute Contact Encoder
#include <ACE128map12345678.h> // mapping for pin order 12345678
//#include <ACE128map12348765.h> // mapping for pin order 87654321
//#include <ACE128map18762345.h> // mapping for pin order 87654321
//#include <ACE128map54326781.h> // mapping for pin order 87654321
//#include <ACE128map56784321.h> // mapping for pin order 87654321
//#include <ACE128map87651234.h> // mapping for pin order 87654321
//#include <ACE128map87654321.h> // mapping for pin order 87654321
#include <Wire.h> // I2C bus communication library - required to support ACE128
// Create an ACE128 instance called myACE
ACE128 myACE(2,3,4,5,6,7,8,9, (uint8_t*)encoderMap_12345678);
//ACE128 myACE(38,40,42,44,46,48,50,52, (uint8_t*)encoderMap_12348765);
//ACE128 myACE(38,40,42,44,46,48,50,52, (uint8_t*)encoderMap_18762345);
//ACE128 myACE(38,40,42,44,46,48,50,52, (uint8_t*)encoderMap_54326781);
//ACE128 myACE(38,40,42,44,46,48,50,52, (uint8_t*)encoderMap_56784321);
//ACE128 myACE(38,40,42,44,46,48,50,52, (uint8_t*)encoderMap_87651234);
//ACE128 myACE(38,40,42,44,46,48,50,52, (uint8_t*)encoderMap_87654321);
// set-zero button on pin 13
// - button to ground e.g. MakerShield button
const int ZERO = 13;
uint8_t pinPos = 0; // pin values
uint8_t rawPos = 0;
uint8_t upos = 0;
uint8_t oldPos = 255;
int8_t pos;
int16_t mpos;
uint8_t seen = 0;
void setup() {
int error = 1;
myACE.begin(); // this is required for each instance, initializes the pins
// myACE.reverse(true); // uncomment this for counter-clockwise operation
pinMode(ZERO, INPUT_PULLUP); // configure set-zero button
pinPos = myACE.acePins(); // get IO expander pins
oldPos = pinPos; // remember where we are
Serial.begin(9600);
Serial.println(myACE.acePins());
}
void loop() {
if (digitalRead(ZERO) == 0) { // check set-zero button
// myACE.setMpos(6723); // set current position to 6723
myACE.setMpos(0); // set logical multiturn zero to current position
// myACE.setZero(); // set logical zero to current position
// myACE.reverse(true); // set reverse
oldPos = 255; // force display update
}
pinPos = myACE.acePins(); // get IO expander pins
rawPos = myACE.rawPos(); // get raw mechanical position
pos = myACE.pos(); // get logical position - signed
upos = myACE.upos(); // get logical position - unsigned
mpos = myACE.mpos(); // get multiturn position - signed
if (pinPos != oldPos) { // did we move?
seen |= pinPos ^ oldPos; // what changed?
oldPos = pinPos; // remember where we are
if (seen < 255) {
Serial.println("looking for pins");
for (uint8_t i = 0; i <= 7; i++) {
if (! (seen & 1 << i)) {
Serial.print(i, DEC);
}
}
Serial.println("");
} else {
Serial.print("pin ");
Serial.print(pinPos);
Serial.print(" raw ");
Serial.print(rawPos);
Serial.print(" pos ");
Serial.print(pos, DEC);
Serial.print(" upos ");
Serial.print(upos, DEC);
Serial.print(" mpos ");
Serial.println(mpos, DEC);
}
}
}
I tried different maps, different wirings but it is still jumping.
Thanks for advices.