Arduino – Rotary encoder (Keyes KY-040)

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 “INTERRUPT”

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

Output


Script #2 “POLLING” met bibliotheek

Wat heb je nodig?
1) Arduino Rotary encoder bibliotheek

Output


Script #3 “POLLING”

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

Output


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

Top