Arduino

How Rotary Encoder Works and Interface It with Arduino

Rotary Encoder is an important electromechanical device that has diverse uses in the field of electronics. This article will explain the types and workings of the rotary encoder along with its interfacing with Arduino.

What is a Rotary Encoder

A rotary encoder is a digital input device that senses the angular position of the rotary knob and sends signals to the microcontroller or any other device to which they are connected. They can rotate 360° without stopping. It is also called a shaft encoder. It is used in printers, audio electronics, motors, and controllers.

Types of Rotary Encoders

There are mainly two types of rotary encoders that are decided based on the output signal generated by them. These types are named:

Incremental Rotary Encoder

This type of encoder counts revolutions of the rotary knob in the form of pulses. When the knob is once rotated, a pulse is generated. For every pulse, the counter increments to indicate the angular position of the shaft.

Absolute Rotary Encoder

This type of encoder gives the absolute angular position of the shaft, as it has a separate code for every shaft position, and it measures the angle through that code. It does not need a counter to give an output of angular position. Even if the absolute rotary encoder is de-energized, respective values for angular positions are retained. It is also a low-cost encoder.

Working of Rotary Encoder

The rotary encoder consists of a disc with equally spaced areas connected to a common pin C that is grounded. The two other pins A and B are contact pins that make contact with C when the rotary knob is rotated. When pin A or B gets connected to the ground, then a signal is generated. These signals generated from output pins are 90° out of phase. This is because pin A gets connected to the ground when the knob is turned clockwise, and pin B gets connected to the ground first when the knob is turned counterclockwise. Therefore, the direction of knob rotation is determined through these connections.

If the state of B is not equal to A, then the knob has turned clockwise.


If the state of B is equal to A, the knob has turned counterclockwise.

Pin Configuration of Rotary Encoder

The diagram given below gives a pinout of the rotary encoder that shows output pins A and B, a rotary switch that can be used as a push button, and pins for power supply.

Pin Description of Rotary Encoder

Following is the given description of all rotary encoder pins.

Out B or CLK

This pin gives an output of how many times the knob or rotary encoder has rotated. Each time when the knob is rotated, the CLK completes a cycle of HIGH and LOW. It is counted as one rotation.

Out A or DT

This is the second output pin of the rotary encoder that determines the direction of rotation. It lags 90° behind the CLK signal. Therefore, if its state is not equal to CLK’s state then the direction of rotation is clockwise, otherwise, anti-clockwise.

Switch

The switch pin is used to check if the push button is pressed or not.

VCC

This pin is connected to a 5V supply

GND

This pin is connected to the Ground

Interfacing Rotary Encoder with Arduino

The rotary encoder has five pins. VCC and GND of the rotary encoder are connected to that of Arduino. The remaining pins CLK, DT, and SW are connected to the digital input pins of Arduino.

Arduino Code for Rotary Encoder

 

// Rotary Encoder Inputs
#define CLK_PIN 2
#define DT_PIN 3
#define SW_PIN 4
int counter = 0;
int currentCLKState;
int lastCLKState;
String current direction ="";
unsigned long lastButtonPressTime = 0;
void setup() {
    // Set encoder pins as inputs
    pinMode(CLK_PIN, INPUT);
    pinMode(DT_PIN, INPUT);
    pinMode(SW_PIN, INPUT_PULLUP);
    // Setup Serial Monitor
    Serial.begin(9600);
    // Read the initial state of CLK
    lastCLKState = digitalRead(CLK_PIN);
}
void loop() {
    // Read the current state of CLK
    currentCLKState = digitalRead(CLK_PIN);
    // If the last and current state of CLK is different, then a pulse occurred
    // React to only 1 state change to avoid double count
    if (currentCLKState != lastCLKState && currentCLKState == 1) {
        // If the DT state is different than the CLK state, then
        //The encoder is rotating counter-clockwise, so the decrement
        if (digitalRead(DT_PIN) != currentCLKState) {
            counter--;
            currentDirection = "CCW";
        } else {
            // Encoder is rotating clockwise, so increment
            counter++;
            currentDirection = "CW";
        }
        Serial.print("Rotation Direction: ");
        Serial.print(currentDirection);
        Serial.print(" | Counter Value: ");
        Serial.println(counter);
    }
    // Remember the last CLK state
    lastCLKState = currentCLKState;
    // Read the button state
    int buttonState = digitalRead(SW_PIN);
    // If we detect a LOW signal, the button is pressed
    if (buttonState == LOW) {
        // If 50ms have passed since the last LOW pulse, it means that the
        // button has been pressed, released, and pressed again
        if (millis() - lastButtonPressTime > 50) {
            Serial.println("Button Pressed!");
        }
        // Remember the last button press event time
        lastButtonPressTime = millis();
    }
    // Put in a slight delay to help debounce the reading
    delay(1);
}

 
In the above-given code, the state of the CLK pin is checked in the loop() function. If it is not equal to its previous state, it shows that the rotary knob has rotated. Now, to check the direction of knob rotation, the present state of CLK is compared with the state of DT. If both states are unequal, it shows that the knob has rotated clockwise and counter increments its value to show the position of the rotary knob. In the opposite case, counter decrements.

Conclusion

Rotary encoders are advanced position sensors that can rotate continuously. They are available in two types: incremental and absolute. The rotary encoder works by counting pulses generated due to the rotation of the knob. It has diverse applications in daily life electronics to industrial automation.

About the author

Kashif

I am an Electrical Engineer. I love to write about electronics. I am passionate about writing and sharing new ideas related to emerging technologies in the field of electronics.