Notifications
Clear all

Enhancements for the "Using Rotary Encoders With Arduino"

4 Posts
3 Users
1 Reactions
106 Views
(@david-eastvaun)
Member
Joined: 5 years ago
Posts: 2
Topic starter  

Hi Folks,

I am not sure if this is the correct place to post my info (apologies if not).  Firstly - many thanks for the great site and content.  The effort is really appreciated and all the info you present is massively helpful.

Just a thought on the "Using Rotary Encoders With Arduino" content.   I've tweaked the code to account for those pesky cheaper rotary encoders that can be a little twitchy/jerky in operation.  Also I wanted to limit the decrement/increment count over the range 0 - 255, and so we could possibly account for the limits of 8-bit architecture/integer limitations further down the line.

Anyway - here is the code (verified on the Uno).  I hope this is useful.

 

#define inputCLK 4

#define inputDT 5




#define ledCW 8

#define ledCCW 9




int encoderPos = 0;

int lastEncoded = 0;




String encdir = "";

int direction = 0;              // 1 = CW, -1 = CCW, 0 = unknown

int damperCounter = 0;

const int damperThreshold = 2;




const int encoderMin = 0;

const int encoderMax = 255;




void setup() {

  pinMode(inputCLK, INPUT);

  pinMode(inputDT, INPUT);




  pinMode(ledCW, OUTPUT);

  pinMode(ledCCW, OUTPUT);




  Serial.begin(9600);




  int clk = digitalRead(inputCLK);

  int dt = digitalRead(inputDT);

  lastEncoded = (clk << 1) | dt;




  digitalWrite(ledCW, LOW);

  digitalWrite(ledCCW, LOW);

}




void loop() {

  int clk = digitalRead(inputCLK);

  int dt = digitalRead(inputDT);

  int encoded = (clk << 1) | dt;

  int sum = (lastEncoded << 2) | encoded;




  // CW movement

  if (sum == 0b0001 || sum == 0b0111 || sum == 0b1110 || sum == 0b1000) {

    if (direction == -1) {

      damperCounter++;

      if (damperCounter >= damperThreshold) {

        direction = 1;

        incrementEncoder();

        damperCounter = 0;

      }

    } else {

      direction = 1;

      incrementEncoder();

      damperCounter = 0;

    }

  }




  // CCW movement

  else if (sum == 0b0010 || sum == 0b0100 || sum == 0b1101 || sum == 0b1011) {

    if (direction == 1) {

      damperCounter++;

      if (damperCounter >= damperThreshold) {

        direction = -1;

        decrementEncoder();

        damperCounter = 0;

      }

    } else {

      direction = -1;

      decrementEncoder();

      damperCounter = 0;

    }

  }




  lastEncoded = encoded;

  delay(1);

}




void incrementEncoder() {

  if (encoderPos < encoderMax) {

    encoderPos++;

    showDirection("CW");

  }

}




void decrementEncoder() {

  if (encoderPos > encoderMin) {

    encoderPos--;

    showDirection("CCW");

  }

}




void showDirection(String d) {

  encdir = d;

  if (d == "CW") {

    digitalWrite(ledCW, HIGH);

    digitalWrite(ledCCW, LOW);

  } else {

    digitalWrite(ledCW, LOW);

    digitalWrite(ledCCW, HIGH);

  }




  Serial.print("Direction: ");

  Serial.print(encdir);

  Serial.print(" -- Value: ");

  Serial.println(encoderPos);

}

Feel free to use/change/tweak etc.

All the best and have fun 🙂

Dave E.

This topic was modified 2 weeks ago by DroneBot Workshop

   
Lee G reacted
Quote
(@aliarifat)
Member
Joined: 11 months ago
Posts: 99
 

Thanks for posting this.


   
ReplyQuote
robotBuilder
(@robotbuilder)
Member
Joined: 6 years ago
Posts: 2343
 

@david-eastvaun

👍

In my snippets code folder for possible use later.

 


   
ReplyQuote
(@david-eastvaun)
Member
Joined: 5 years ago
Posts: 2
Topic starter  

@robotbuilder No problem - happy to share 😉


   
ReplyQuote