KY-040 Arduino Rotary Encoder User Manual
KY-040 Arduino Rotary Encoder User Manual
It’s a great device for stepper and servo motor control. You could also use it to control
devices like digital potentiometers.
On one side of the switch there are three pins. They are normally referred
to as A, B and C. In the case of the KY-040, they are oriented as shown.
Inside the encoder there are two switches. Once switch connects pin A
to pin C and the other switch connects pin B to C.
As you can see, the angular position of the A terminal and the B terminal is such that:
Rotating the switch clockwise wll cause the switch connecting A and C to change states first.
Rotating the switch counterclockwise will cause the switch connecting B and C to change
states first.
If we were to represent the opening an closing of the switches as wave forms, it would look
something like this.
Essentially, determining which switch changed states rst is how the direction of rotation is
determined.
The module is designed so that a low is output when the switches are closed and a high
when the switches are open.
The low is generated by placing a ground at Pin C and passing it to the CLK and DT pins
when switches are closed.
The high is generated with a 5V supply input and pullup resistors, such that CLK
This website uses cookies to enhance your experience. By continuing to visit this and DT
are both high when switches are open.
Not previously mentioned is the existence of of push button switch that is integral to the
encoder. If you push on the shaft, a normally open switch will close. The feature is
useful if you want to change switch function. For example, you may wish to have the
ability to between coarse and fine adjustments.
void setup() {
pinMode (pinA,INPUT);
pinMode (pinB,INPUT);
/* Read Pin A
Whatever state it's in will reflect the last position
*/
pinALast = digitalRead(pinA);
Serial.begin (9600);
}
void loop() {
aVal = digitalRead(pinA);
if (aVal != pinALast){ // Means the knob is rotating
// if the knob is rotating, we need to determine direction
// We do that by reading pin B.
if (digitalRead(pinB) != aVal) { // Means pin A Changed first - We're Rotating Clockwise
encoderPosCount ++;
bCW = true;
} else {// Otherwise B changed first and we're moving CCW
bCW = false;
encoderPosCount--;
}
Serial.print ("Rotated: ");
if (bCW){
Serial.println ("clockwise");
}else{
Serial.println("counterclockwise");
}
Serial.print("Encoder Position: ");
Serial.println(encoderPosCount);
}
pinALast = aVal;
}