Module – Rotary encoder

Hardware

Rotary encoder module KY-040 bovenkant

   BESTEL NU!

De rotary encoder kan onder meer gebruikt worden om snelheid en/of omwentelingen te meten.
Bij een rotary encoder Hebben we twee blokvormige golf outputs (A en B) welke 90 graden met elkaar uit fase zijn. Het aantal pulsen of stappen welke worden gegenereerd per omwenteling kan varuieren. De rotary encoder van Sparkfun bijvoorbeeld heeft 12 stappen, maar andere kunnen er meer of minder hebben. Het diagram hieronder toont de de relatie van de fasen A en B tot elkaar als de encoder met de klok mee wordt gedraaid of juist andersom.
 
rotary encoder principe
 
Encoder uitleg schema 01
Rotary encoder fasering
Rotary encoder waveform
Iedere keer als de A signaal puls van positief naar 0 gaat, lezen we de waarde van de B puls uit. Wz zien dat wanneer de encoder met de klok mee wordt gedraaid, de B puls altijd positief is. Bij het draaien tegen de klok in, is de B puls negatief. Door het monitoren van beide outputs met een microcontroller (Arduino), kunnen we de draairichting bepalen en door het bijhouden van het aantal A  pulsen, ook hoever er is gedraaid. We kunnen nog een stap verder gaan en de frequentie van de pulsen tellen om te bepalen hoe snel er is gedraaid. We kunnen concluderen, dat een rotary encoder een groot aantal voordelen heeft ten opzichte van een potmeter.
De output is een bitreeks van 2-bit, voorbeeld:
Uitleg van de werking (eng):

Rotating the encoder one step takes the signal a full period, starting at A and B both in the HIGH state, both changing to LOW, and both changing back to HIGH again. If you apply the logic on both transitions, you will do a double +1 for every clock-wise transition:

1. A and B are both HIGH (initial state)
2. A changes to LOW, B is still HIGH, so +1 because A changed and B != A
3. B changes to LOW, no effect
4. A and B are now both LOW
5. A changes back to HIGH, B is still LOW, so +1 because A changed and B != A
6. B changes to HIGH, no effect
7. A and B are both HIGH (final state)

For every counter-clock-wise transition, you will instead do -1 twice:

1. A and B are both HIGH (initial state)
2. B changes to LOW, no effect
3. A changes to LOW, B is already LOW, so -1 because A changed and B == A
4. A and B are now both LOW
6. B changes to HIGH, no effect
5. A changes back to HIGH, B is already HIGH, so -1 because A changed and B == A
7. A and B are both HIGH (final state)

Pinout (Keyes KY-040 module)

Rotary encoder module KY-040 pinout
Rotary encoder module KY-040 bovenkant
Pin:Functie:
1GND
2+5V
3SW (Schakelaar)
4DT (Data puls)
5CLK (Klok puls)

Aansluiten

Sluit de module aan volgens onderstaand schema:

Rotary encoder module KY-040 arduino schema
Rotary Encoder pin:Arduino Pin:
1 (GND)GND
2 (+)+5V
4 (DT)3
5 (CLK)2

Polling of Interrupts?

Je kan de Rotary Encoder op 2 manieren uitlezen: polling of met interrupts.

Polling
Polling doe je door de stand of beweging van de encoder uit te lezen in de LOOP, het nadeel hiervan is dat je tijdens de loop niet veel kan doen omdat dat de telling verstoord en de pulsen niet goed geteld worden, met polling is het wellicht wel mogelijk om meerdere Enscoders aan te sluiten op een Arduino UNO.

Interrupts
Met interrupts kun je een vallende of stijgende puls waarnemen en een subroutine laten uitvoeren die dan de pulsen telt, op deze manier is het tellen van de pulsen veel nauwkeuriger, het nadeel is dat je 2 interrupts nodig hebt per encoder en dus maar 1 kan aansluiten op een Arduino UNO (3 op de MEGA).

Ps. Bij de Keyes module is 1 “klik/stap” 4 pulsen/tellingen.


Script #1 Polling


Script #2 “INTERRUPT”

Onderstaand script leest de encoder uit via een interrupt subroutine en geeft de waarde weer via de console:

Output


Script #3 “POLLING” met bibliotheek

Wat heb je nodig?
1) Arduino Rotary encoder bibliotheek

Output


Script #4 “POLLING”

Onderstaand vind je een eenvoudig script zonder bibliotheken (bron g7nbp.blogspot.nl)

Output


Voorbeeld met weerstanden

Bron: https://www.elektormagazine.nl/labs/rotary-encoder-on-a-single-mcu-pin

Determining the spinning direction

Spinning a properly wired rotary encoder produces a series of pulses on its A & B pins. To determine the spinning direction from these two signals all that is needed is to delay one of them by one step and then EXOR the two together.

Example

Suppose ‘A’ = ‘00110011…’ and ‘B’ = ‘01100110…’, then delay signal ‘A’, say, by one step to get ‘01100110…’. EXOR-ing the delayed ‘A’ with ‘B’ gives ‘00000000…’. When it is spinning in the other direction, then ‘A’ = ‘11001100…’ (‘B’ unchanged), and ‘A’ delayed by one step is ‘10011001…’. EXOR-ing the delayed ‘A’ with ‘B’ now gives ‘11111111…’.

Make it analog

Looking at the signals ‘A’ and ‘B’ together as a parallel bus allows us to consider them as a 2-bit binary value that can take on four values: 0b00, 0b01, 0b10 and 0b11 (Grey code). Multi-bit binary values can be converted to a single analog voltage using a digital-to-analog converter (DAC). That is what we will do here.

R-2R resistor network

A common, simple DAC can be built with a so-called R-2R resistor network. Such a network consists of a bunch of resistors with only two values: R and 2R. For each bit two resistors are needed, every extra bit adds two resistors. A 2-pin rotary encoder therefore needs four resistors.

Such a circuit produces an analog voltage that takes on four values. The signal can be sampled with an AD converter and then decoded to recover the signals ‘A’ and ‘B’. These can then be processed further in the same way as for a “normal” rotary encoder.

A practical implementation

Two rotary encoders with integrated pushbuttons require a 6-bit DA converter. A microcontroller with a built-in 10-bit AD converter can easily decode the composite signal as it will have a 4-bit margin per bit, allowing the use of 5% resistors (1% would be better of course). Suitable microcontrollers are abundant, for instance the ATmega328 as found on an Arduino Uno board.

In a real-life implementation the value of R in the R-2R network must be much larger than the pull-up resistors to avoid the latter from influencing the R-2R ratio too much. At the same time, the pull-ups must not be too small, otherwise the current flowing through the switch contacts would be too high.

2R resistors are simply two R resistors in series.

Capacitors are needed to debounce the mechanical contacts to avoid that might otherwise cause interference between the two encoders.

Bronnen:
arduino.stackexchange.com
heliosoph.mit-links.info
henrysbench.capnfatz.com
martoparts.nl
playground.arduino.cc