Hallo,
in einer Unterhaltung hat sich ergeben, dass die eingesetzen Encoder sehr oft Probleme mit prellen haben.
Hier habe ich mal eine stark vereinfachte Klasse geschrieben, die nur auf eine Flanke reagiert, keine Bitmuster abfragt und der du eine Entprellzeit mitgeben kannst.
from machine import Pin
from time import ticks_ms, ticks_diff
class Rotary:
def __init__(self, direction_pin, clock_pin, debounce_time):
self.direction_pin = Pin(direction_pin, Pin.IN, Pin.PULL_DOWN)
self.clock_pin = Pin(clock_pin, Pin.IN, Pin.PULL_DOWN)
self.debounce_time = debounce_time
self.timestamp = ticks_ms()
self.clock_pin.irq(handler=self.rotary_change, trigger=Pin.IRQ_FALLING)
self.counter = 0
def rotary_change(self, pin):
if ticks_diff(ticks_ms, self.timestamp) >= self.debounce_time:
self.counter += -1 if self.direction_pin.value() else 1
self.timestamp = ticks_ms()
Alles anzeigen
Da dein Handler ja eigentlich auch nichts anderes macht als +1 oder -1 zu rechnen, habe ich darauf mal verzichtet.
Zum testen der Klasse, kannst du zum Beispiel sowas machen:
from utime import sleep
from Rotary import Rotary
def main():
# last Value for Rotary = debounce-time in ms
rotary = Rotary(16, 17, 10)
while True:
print(rotary.counter)
sleep(0.1)
if __name__ == "__main__":
main()
Alles anzeigen
Die Klasse unter 'Rotary.py' speichern. In meinem Beispiel ist 16 der Clock-Pin, 17 der Direction-Pin und 10 ist die Entprellzeit in Millisekunden. Damit kannst du ja etwas spielen, bis alles so funktioniert wie du willst.
Könntest auch noch einen PWM-Pin definieren und Duty-Cycle abhängig vom Encoder laufen lassen und dann nochmal messen. Also sowas:
from utime import sleep
from Rotary import Rotary
from machine import Pin, PWM
PWM_PIN = 18
def main():
# last Value for Rotary = debounce-time in ms
rotary = Rotary(16, 17, 10)
pwm = PWM(Pin(PWM_PIN))
duty_cycle = 0
pwm.duty(duty_cycle)
while True:
duty_cycle = rotary.counter if rotary.counter >= 0 else 0
print(duty_cycle)
pwm.duty(duty_cycle)
sleep(0.5)
if __name__ == "__main__":
main()
Alles anzeigen
Jeder Code ist ungetestet. Default-Wert für die Frequenz liegt (glaube ich) schon bei 5kHz, die müsste man nicht extra angeben.
Grüße
Dennis