 Get tutorials Arduino Sensor Kit V1.0 for Arduino

Lesson 19 Rotary Encoder

Introduction

A rotary encoder is an electro-mechanical device that converts the angular position or motion of a shaft or axle to an analog or digital code. Rotary encoders are usually placed at the side which is perpendicular to the shaft. Rotary encoders act as sensors for detecting angle, speed, length, position and acceleration in automation field. Components

- 1 * SunFounder Uno board

- 1 * USB data cable

- 1 * Rotary Encoder module

- Jumper wires

Experimental Principle

There are mainly two types of rotary encoder: absolute and incremental (relative) ones. The output of absolute encoders indicates the current position of the shaft, making them angle transducers. The output of incremental encoders provides information about the motion of the shaft, which is typically further processed elsewhere into information such as speed, distance, and position.

In this experiment, we will use the latter. An incremental encoder is a rotary sensor to turn rotational displacement into a series of digital pulse signals which are then used to control the angular displacement. It generates two-phase square waves whose phase difference is 90°. Usually the two-phase square waves are called channel A and channel B. See the following figure for details. It is difficult to distinguish between the left turn and right turn when programming. However, when using an oscilloscope to observe the left turn and right turn of a switch, you will find a phase difference between the signals of the two output pins as shown below. It shows that if output 1 and output 2 is high, then the switch rotates clockwise; if output 1 is high and output 2 is low, then the switch rotates counterclockwise. As a result, during SCM programming, if output 1 is high, then you can tell whether the rotary encoder turns left or right as long as you know the state of output 2.

Experimental Procedures

Step 1: Build the circuit

Rotary Encoder Module               SunFounder Uno

CLK -----------------------------------D2

DT ------------------------------------ D3

SW ------------------------------------ D4

+ -------------------------------------- 5V

- ------------------------------------- GND

Step 2: Program (Please refer to the example code in LEARN -> Get Tutorial on our website)

Step 3: Compile

Step 4: Upload the sketch to SunFounder Uno

Now, you can see the angular displacement of the rotary encoder printed on Serial Monitor. When you spin the rotary encoder clockwise, the angular displacement increases; when you spin it counterclockwise, the value decreases. Press the switch on the rotary encoder and the value will return to zero. Code

 #define clkPin 2#define dtPin 3#define swPin 4 //the number of the button int encoderVal = 0; void setup(){ pinMode(clkPin, INPUT); pinMode(dtPin, INPUT); pinMode(swPin, INPUT); digitalWrite(swPin, HIGH); Serial.begin(9600);} void loop(){ int change = getEncoderTurn(); encoderVal = encoderVal + change; if(digitalRead(swPin) == LOW) { encoderVal = 0; } Serial.println(encoderVal);} int getEncoderTurn(void){ static int oldA = HIGH; static int oldB = HIGH; int result = 0; int newA = digitalRead(clkPin); int newB = digitalRead(dtPin); if (newA != oldA || newB != oldB) { // something has changed if (oldA == HIGH && newA == LOW) { result = (oldB * 2 - 1); } } oldA = newA; oldB = newB; return result;} 