 Hi all

Simply ,I had Rover 5 with 2 DC motors and 2 quadrature encoders , I just want to use encoders to measure the distance of traveling for each wheel , In the start, I just want to determine the total counts per revolution. I read the article about quadratic encoder from http://letsmakerobots.com/node/24031

In Rover 5 , each encoder has four wires: red (5V or 3.3V), black(Ground), yellow (Signal 1) and white (Signal 2). I connected each wire in its right place on Arduino Uno board ,

The circuit: -rotary encoder ChannelA attached to pin 2 -rotary encoder ChannelB attached to pin 3 -rotary encoder 5V attached to 5V -rotary encoder ground attached to ground

For one encoder, I test these two codes below to determine the total counts or ticks per revolution , the first code by using loop and second by using an interrupt . But unfortunately while I run each code separately with rotating the wheel by hand 360 degree , the outputs of these two codes was just "gibberish" and I don't know where is the problem . Could anyone help?

Arduino codes posted below.

First code

``````// Constants
const int  ChanAPin = 2;    // pin for encoder ChannelA
const int  ChanBPin = 3;    // pin for encoder ChannelB

// Variables
int encoderCounter = -1;   // counter for the number of state changes
int ChanAState = 0;         // current state of ChanA
int ChanBState = 0;        // current state of ChanB
int lastChanAState = 0;     // previous state of ChanA
int lastChanBState = 0;    // previous state of ChanB
void setup() {
// initialize the encoder pins as inputs:
pinMode(ChanAPin, INPUT);
pinMode(ChanBPin, INPUT);
// Set the pullup resistors
digitalWrite(ChanAPin, HIGH);
digitalWrite(ChanBPin, HIGH);

// initialize serial communication:
Serial.begin(19200);
Serial.println("Rotary Encoder Counter");
}
void loop() {
// read the encoder input pins:
// compare the both channel states to previous states
if (ChanAState != lastChanAState || ChanBState != lastChanBState) {
// if the state has changed, increment the counter
encoderCounter++;
Serial.print("Channel A State = ");
Serial.println(ChanAState);
Serial.print("Channel B State = ");
Serial.println(ChanBState);
Serial.print("State Changes = ");
Serial.println(encoderCounter, DEC);
// save the current state as the last state,
//for next time through the loop
lastChanAState = ChanAState;
lastChanBState = ChanBState;
}
}
``````

The second code (with interrupt)

``````static long s1_counter=0;
static long s2_counter=0;

void setup()
{
Serial.begin(115200);

attachInterrupt(0, write_s1, CHANGE); /* attach interrupt to pin 2*/
attachInterrupt(1, write_s2, CHANGE); /* attach interrupt to pin 3*/
Serial.println("Begin test");

}

void loop()
{
}

void write_s1()
{
s1_counter++;
Serial.print("S1 change:");
Serial.println(s1_counter);
}
void write_s2()
{
s2_counter++;
Serial.print("S2 change:");
Serial.println(s2_counter);
}
``````

I don't know about the first code, but, in the second you need to move the serial.print()s out of the ISR. Interrupts are disabled in the ISR and serial print depends n interrupts.

the outputs of these two codes was just “gibberish” and I don’t know where is the problem .

What does this mean? Could you read the text, but the values made no sense? Or, could you not read the text at all?

Why do the two codes use different baud rates? What is the baud rate of the receiving program?