Rotary encoder (Pico)

De rotary encoder is een bijzonder component. In 2024 heb ik voor het eerst kennis gemaakt met de 'draaipuls' schakelaar op de Raspberry Pi. Sindsdien was ik op zoek naar een toepassing op de Pico. Ik wil op een Led-display een waarde afbeelden met behulp van een rotary encoder. Deze basistoepassing kan gebruikt worden als onderdeel voor andere toepassingen zoals een dimmerroutine of countdown teller. 

Wil je meer weten over de rotary encoder? Klik dan hier.

Daar gaan we…

Modules verbinden met de Pico
We beginnen met het verbinden van een Led-display via I2C. We gebruiken hiervoor het 4-cijferig led-display, de TM1637.

Het Led-display, de TM1637

Verbind het Led-display met de Pico zoals in de tabel aangegeven.

Ook de rotary encoder wordt middels I2C met de Pico verbonden. Ik gebruik hiervoor de EC11 waarbij een debounce (anti-stuiter) circuit is aangebracht. Mocht je een encoder willen aanschaffen, raad ik deze aan. Het kan behoorlijk frustreren als je circuit ‘stuitert’ en meer pulsen afgeeft dan wenselijk is.

Het is wel jammer dat ze andere benamingen aan de pinnen van de module hebben gegeven. Daarom heb ik de pinnen vertaald naar de gebruikelijke rotary encoder (I2C) benaming.

Roterende encoder module (EC-11) met anti-stuiter circuit

Verbind de EC-11 module met de Pico zoals hieronder in de tabel aangegeven.

VERKEERDE VERBINDING?
Nee, ik heb bewust de klok en de data omgewisseld omdat de draairichting van de encoder voor mijn gevoel in tegengestelde richting draaide. Ik had ook in de software pinnen 9 en 14 kunnen omdraaien, dat was waarschijnlijk wat netter geweest. Mocht je de bedrading 1 op 1 (klok -> klok, data -> data) willen doen, dan is dat geen probleem. Je weet nu wat het gevolg kan zijn.


Thonny IDE
Ik ga er van uit dat je weet hoe Thonny IDE werkt en hoe je de Raspberry Pi Pico ermee verbind. Weet je het niet of twijfel je? Kijk dan hier waar ik uitleg hoe je het kunt doen.


Aanvullende bibliotheken
Voor de TM-1637 maken we in micropython gebruik van de standaard bibliotheek, maar om pulsen van de Rotary Encoder (EC-11) te kunnen lezen, is er wat onderliggende code nodig.

Download de bestanden rotary.py en rotary_irq_rp2.py naar je computer en pak het zipbestand uit.

Open Thonny en navigeer naar de map waarin je de bestanden in het zipbestand hebt uitgepakt. In het voorbeeld hieronder betreft het de map C: \ Users \ Downloads.

Klik met de rechter muisknop op de bestanden rotary.py en rotary_irq_rp2.py en selecteer ‘Uploaden naar /‘ om ze naar de Pico te uploaden.

De Code
Hieronder vind je het hoofdprogramma dat de pulsen van de rotary encoder inleest, deze omzet naar een telreeks en de uitkomst ervan op het Led-display toont.

Kopieer onderstaande code en plak deze in een leeg bestand in Thonny, sla deze op de Pico op als main.py in dezelfde map waar de twee gedownloade bestanden staan en start het programma (groene knop met witte pijl). Bij een herstart zal de Pico automatisch main.py starten.

import time
from rotary_irq_rp2 import RotaryIRQ
from machine import I2C, Pin
import tm1637

# Initialiseer 7-segment Led-display
display = tm1637.TM1637(clk=Pin(9), dio=Pin(4)) 
display.brightness(3)
display.scroll("GO",delay=200)

display.number (0)  # Startwaarde op display

print ("Draai aan de knop\n")

# Clk = GP14, Data = GP15
rotary = RotaryIRQ(14, 15)

# Drukknop op rotary encoder -> GP12
btn = Pin(12, Pin.IN)

current_val = 0 

while True:
    if btn.value() == 0:  # Is de knop ingedrukt?
        print("Reset encoder naar:", 0)
        rotary.reset() # Reset de rotary teller naar nul
        
        time.sleep_ms(250) # Wachttijd om waar te nemen dat de knop ingedrukt is
        
    new_val = rotary.value()  # Wat is de encoderwaarde op dit moment?
    
    if current_val != new_val:  # Is de encoderwaarde veranderd!
        print('Encoder value:', new_val)
                
        display.number(new_val) # Toon nieuwe waarde op display
                
        current_val = new_val  # De laatst bekende waarde

Als de code gestart is scrollt “GO” voorbij en verschijnt vervolgens de waarde “0” om te laten zien dat het programma gestart is. Vervolgens kun je de knop beide kanten opdraaien waarbij op het display de waarde verandert. Als je de knop indrukt reset de teller en begint het weer bij nul.

Veel plezier ermee! Mocht je vragen of opmerkingen hebben, laat dan hieronder een reactie achter.

Have A Nice Day!

1 Reactie

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd.


*