rotary encoder & interrupts

advertisement
living with the lab
Interfacing a Rotary Encoder with an Arduino
Rotary encoders are used keep track of the rotational position of a knob, like a
volume knob on a stereo, or the rotational position of a motor shaft.
Panasonic EVE-KC2F2024B
24 pulses per revolution
6mm diameter flattened output shaft
output type: quadrature (incremental)
minimum life: 15,000 rotations
cost: less than $1 (USD)
Arduino Uno
microcontroller board
living with the lab
Encoder Output and Rotational Direction
counterclockwise rotation of knob
clockwise rotation of knob
pin A = ON
A
pin A = OFF
pin B = ON
A
B
B
COM
pin B = OFF
increment rotational counter
When switch A goes OFF and B is ON, then rotation must be clockwise.
When switch A goes OFF and B is OFF, then rotation must be counterclockwise.
When switch A goes ON and B is OFF, then rotation must be clockwise.
When switch A goes ON and B is ON, then rotation must be counterclockwise.
decrement rotational counter
2
living with the lab
The Guts of a Mechanical Encoder
As the encoder knob is turned, the spring-loaded contacts pass over metal segments that connect to the A, B
and COM pins. Electrical continuity occurs when a contact touches metal, but no continuity occurs when a
contact touches the black plastic. One of the three contacts is always touching COM.
electrical continuity
between A and COM
no electrical continuity
between A and COM
spring-loaded electrical contacts
A
COM
B
3
living with the lab
Sensor Wiring (need four 10kΩ resistors and two 0.01F capacitors)
10kΩ 10kΩ
10kΩ
this part of the circuit keeps the
A, B and COM “switches” from
flickering at the beginning or end
contact . . . this “debounces” the
switches
10kΩ
the encoder is the part in the red box
4
living with the lab
A Simple Sketch
•
•
•
This sketch increments the variable “encoderPos” when the encoder knob is turned clockwise and
decrements the variable when the knob is turned counterclockwise.
The sketch uses an “interrupt” to avoid missing any changes in the position of the knob.
The Arduino Uno has two interrupts attached to digital pins 2 and 3; we only use pin 2 as an interrupt here.
volatile int encoderPos = 0;
void setup() {
pinMode(2, INPUT);
pinMode(3, INPUT);
attachInterrupt(0, encoder, CHANGE);
Serial.begin (9600);
}
void loop(){
}
void encoder() {
if(digitalRead(2) == digitalRead(3))
{encoderPos--; }
else
{encoderPos++; }
Serial.println (encoderPos, DEC);
}
// the value of a volatile variable can change
// in the function called by the interrupt
// encoder pinA is attached to digital pin2
// encoder pinB is attached to digital pin3
// interrupt0 maps to pin2
// main body of the sketch employing the interrupt
// check to see if pins A & B have the same state
// decrement position if A & B are the same
// increment position if A & B are not the same
// send encoderPos to serial monitor
5
living with the lab
Example Application
This implementation shows a knob mounted to the rotary encoder. This hardware
includes two LEDS that come on and off as the encoder passes over the contacts.
The hardware can be used with the sketch on the previous slide to demonstrate
how the encoder works.
6
Download