Raspberry Pi - Rotary Encoder

Deze handleiding legt uit hoe u de incrementele rotary encoder gebruikt met de Raspberry Pi. Dit gaan we behandelen:

Hardware Benodigd

1×Raspberry Pi 5
1×Draaiencoder
1×Jumperdraden
1×(Aanbevolen) Schroefklem Block Shield voor Raspberry Pi
1×(Aanbevolen) Raspberry Pi Prototyping Basisplaat & Breadboard Kit
1×(Aanbevolen) HDMI-Touchscreen-Monitor voor Raspberry Pi

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de Rotary Encoder

Een draaiende knop die beweging omzet in een signaal wordt een rotary encoder genoemd. Hiermee kunt u zien hoeveel iets is verdraaid en waar het zich bevindt. Er zijn twee hoofdtypen:

  • Incrementele encoder: Deze gebruikt snelle pulsen om te meten hoeveel iets is veranderd.
  • Absolute encoder: Dit type geeft voor elke positie een unieke code, zodat u precies weet waar iets is, zelfs als de stroom uitvalt.

Deze gids richt zich op de incrementele encoder.

Rotary Encoder Module Pinout

rotary encoder pinout

Een rotary encoder module heeft 4 pinnen:

  • CLK pin (Output A): is de hoofd-puls die ons vertelt hoeveel rotatie heeft plaatsgevonden. Elke keer dat u de knop een klik (detent) in welke richting ook draait, geeft de CLK pin een signaal dat een volledige cyclus doorloopt (LOW HIGH LOW).
  • DT pin (Output B): werkt vergelijkbaar met de CLK pin maar het signaal loopt 90 graden achter op dat van CLK. Dit helpt ons de draairichting te bepalen (met de klok mee of tegen de klok in).
  • SW pin: is de uitgang van de drukknop in de encoder. Normaal is deze open. Met een pull-up weerstand op deze pin is de SW pin HIGH wanneer de knop niet is ingedrukt, en LOW wanneer hij wel wordt ingedrukt.
  • VCC pin (+): moet verbonden worden met VCC (tussen 3,3 en 5 Volt)
  • GND pin: moet verbonden worden met GND (0V)

Rotary Encoder versus Potentiometer

U kunt de rotary encoder verwarren met de potentiometer, maar het zijn verschillende componenten. Hier een vergelijking:

  • De rotary encoder is als een moderne versie van de potentiometer, maar kan meer functies.
  • De rotary encoder kan 360 graden rondgedraaid worden zonder te stoppen, terwijl een potentiometer meestal ongeveer driekwart van een cirkel draait.
  • De rotary encoder geeft pulsen (digitale signalen), terwijl de potentiometer een analoge spanning levert.
  • De rotary encoder is handig om te meten hoeveel de knop is verdraaid, niet precies waar hij staat. Een potentiometer is geschikt als u exact wilt weten welke stand de knop heeft.

Hoe werkt een Rotary Encoder

rotary encoder output

Binnenin de encoder zit een schijf met gleuven die verbonden is met een pin C, wat fungeert als gedeelde aarde (ground). Er zijn nog twee andere pinnen, A en B.

  • Wanneer u aan de knop draait, maken pinnen A en B contact met de gedeelde aarde pin C, maar in een bepaalde volgorde afhankelijk van de draairichting (met de klok mee of tegen de klok in).
  • Deze contacten creëren twee signalen die ietwat uit fase zijn omdat de ene pin eerder contact maakt dan de andere. Deze twee signalen liggen 90 graden uit elkaar in timing. Dit heet quadratuur-encoding.
  • Draait u de knop met de klok mee, dan maakt pin A eerst contact met de aarde voordat pin B dat doet. Draait u tegen de klok in, dan maakt pin B eerst contact.
  • Door te controleren wanneer elke pin contact maakt of verliest met de aarde, kunnen we bepalen welke kant de knop op draait. We doen dit door te zien wat er met pin B gebeurt als pin A verandert.
Hoe een rotary encoder werkt

Wanneer pin A wisselt van LOW naar HIGH:

  • Als pin B LOW is, is de knop met de klok mee gedraaid.
  • Als pin B HIGH is, is de knop tegen de klok in gedraaid.

※ Notiz:

Pin A en B zijn verbonden met respectievelijk de CLK en DT pinnen. Afhankelijk van de fabrikant kunnen deze omgewisseld zijn. De onderstaande code is getest met de rotary encoder van DIYables.

Hoe Programmeert u voor de Rotary Encoder

  • Controleer het signaal van de CLK pin
  • Als de status verandert van LOW naar HIGH, controleer dan de status van de DT pin.
    • Als de DT pin HIGH is, wordt de knop tegen de klok in gedraaid, verhoog de teller met 1
    • Als de DT pin LOW is, wordt de knop met de klok mee gedraaid, verlaag de teller met 1

Bedradingsschema

Raspberry Pi rotary encoder Bedradingsschema

This image is created using Fritzing. Click to enlarge image

Raspberry Pi Code – Rotary Encoder

De onderstaande code voor Raspberry Pi doet het volgende:

  • Detecteert de richting en de hoeveelheid rotatie van de encoder.
    • Bij het detecteren dat de knop een klik (detent) met de klok mee draait, wordt de teller met één verhoogd.
    • Bij het detecteren dat de knop een klik tegen de klok in draait, wordt de teller met één verlaagd.
  • Detecteert of de knop wordt ingedrukt.

Snel aan de slag

  • Zorg dat u Raspbian of een ander compatibel besturingssysteem op uw Raspberry Pi geïnstalleerd heeft.
  • Zorg dat uw Raspberry Pi verbonden is met hetzelfde lokale netwerk als uw pc.
  • Zorg dat uw Raspberry Pi toegang tot internet heeft als u bibliotheken moet installeren.
  • Gebruikt u de Raspberry Pi voor het eerst? Zie dan hoe u de Raspberry Pi instelt
  • Verbind uw pc met de Raspberry Pi via SSH met de ingebouwde SSH-client op Linux en macOS of met PuTTY op Windows. Zie hoe uw pc verbindt met Raspberry Pi via SSH.
  • Zorg dat u de RPi.GPIO library geïnstalleerd heeft. Zo niet, installeer deze dan met het volgende commando:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Maak een Python-scriptbestand aan met de naam rotary_encoder.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/tutorials/raspberry-pi/raspberry-pi-rotary-encoder import RPi.GPIO as GPIO import time # Pin numbers on Raspberry Pi CLK_PIN = 7 # GPIO7 connected to the rotary encoder's CLK pin DT_PIN = 8 # GPIO8 connected to the rotary encoder's DT pin SW_PIN = 25 # GPIO25 connected to the rotary encoder's SW pin DIRECTION_CW = 0 DIRECTION_CCW = 1 counter = 0 direction = DIRECTION_CW CLK_state = 0 prev_CLK_state = 0 button_pressed = False prev_button_state = GPIO.HIGH # Configure GPIO pins GPIO.setmode(GPIO.BCM) GPIO.setup(CLK_PIN, GPIO.IN) GPIO.setup(DT_PIN, GPIO.IN) GPIO.setup(SW_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Read the initial state of the rotary encoder's CLK pin prev_CLK_state = GPIO.input(CLK_PIN) try: while True: # Read the current state of the rotary encoder's CLK pin CLK_state = GPIO.input(CLK_PIN) # If the state of CLK is changed, then pulse occurred # React to only the rising edge (from LOW to HIGH) to avoid double count if CLK_state != prev_CLK_state and CLK_state == GPIO.HIGH: # If the DT state is HIGH, the encoder is rotating in counter-clockwise direction # Decrease the counter if GPIO.input(DT_PIN) == GPIO.HIGH: counter -= 1 direction = DIRECTION_CCW else: # The encoder is rotating in clockwise direction => increase the counter counter += 1 direction = DIRECTION_CW print("Rotary Encoder:: direction:", "CLOCKWISE" if direction == DIRECTION_CW else "ANTICLOCKWISE", "- count:", counter) # Save last CLK state prev_CLK_state = CLK_state # State change detection for the button button_state = GPIO.input(SW_PIN) if button_state != prev_button_state: time.sleep(0.01) # Add a small delay to debounce if button_state == GPIO.LOW: print("The button is pressed") button_pressed = True else: button_pressed = False prev_button_state = button_state except KeyboardInterrupt: GPIO.cleanup() # Clean up GPIO on program exit
  • Sla het bestand op en voer het Python-script uit via de Terminal met het volgende commando:
python3 rotary_encoder.py
  • Draai de knop met de klok mee en daarna tegen de klok in
  • Druk op de knop
  • Bekijk het resultaat in de Terminal.
PuTTY - Raspberry Pi
DIRECTION: Clockwise | COUNTER: 1 DIRECTION: Clockwise | COUNTER: 2 DIRECTION: Clockwise | COUNTER: 3 DIRECTION: Clockwise | COUNTER: 4 DIRECTION: Clockwise | COUNTER: 5 DIRECTION: Counter-clockwise | COUNTER: 4 DIRECTION: Counter-clockwise | COUNTER: 3 DIRECTION: Counter-clockwise | COUNTER: 2 DIRECTION: Counter-clockwise | COUNTER: 1 DIRECTION: Counter-clockwise | COUNTER: 0 The button is pressed

Code-uitleg

Bekijk de commentaarregels in de code voor een regel-voor-regel toelichting.

Raspberry Pi Rotary Encoder Toepassingen

Met de Rotary Encoder kunt u onder andere de volgende toepassingen realiseren:

  • Raspberry Pi - Rotary Encoder bestuurt de positie van een servo motor
  • Raspberry Pi - Rotary Encoder bestuurt de helderheid van een LED
  • Raspberry Pi - Rotary Encoder bestuurt de snelheid van een stappenmotor

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en helpt u stap voor stap.

Gerelateerde Tutorials

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!