DeaD_EyE icon

micropython incremental encoder

DeaD_EyE | PRO | 09/24/24 02:07:04 PM UTC | 0 ⭐ | 457 👁️ | Never ⏰ | []
Python |

1.89 KB

|

None

|

0 👍

/

0 👎

import time
from machine import Pin, enable_irq, disable_irq
from micropython import schedule
from _thread import allocate_lock
 
"""
00 0
01 1
11 2
10 3
"""
class IgnoreIRQ:
    def __enter__(self):
        self._irq = disable_irq()
    def __exit__(self, exc_type, exc_obj, exc_tb):
        enable_irq(self._irq)
        
        
class Encoder:
    def __init__(self, a, b):
        self.a = Pin(a, mode=Pin.IN, pull=Pin.PULL_UP)
        self.b = Pin(b, mode=Pin.IN, pull=Pin.PULL_UP)
        
        self._last = self.gray_bin()
        self._value = 0
        self._lock = allocate_lock()
    
    def start(self):
        self.a.irq(handler=self._edge, trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING)
        self.b.irq(handler=self._edge, trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING)
 
    def stop(self):
        self.a.irq(handler=None, trigger=0)
        self.b.irq(handler=None, trigger=0)
    
    def gray_bin(self) -> int:
        a, b = self.a(), self.b()
        
        if not a and not b:
            return 0
        elif not a and b:
            return 1
        elif a and b:
            return 2
        elif a and not b:
            return 3    
    
    def _edge(self, pin: Pin):
        # start = time.ticks_us()
        with self._lock, IgnoreIRQ():
            current = self.gray_bin()
            
            if current == (self._last - 1) % 4:
                self._value += 1
            elif current == (self._last + 1) % 4:
                self._value -= 1
                
            self._last = current
        # self.delta_time_us = time.ticks_us() - start
        
    @property
    def value(self):
        with self._lock:
            return self._value
 
 
enc = Encoder(2, 3)
enc.start()
 
last = None
while True:
    current = enc.value
    if current != last:
        print(current)
        last = current
    time.sleep_ms(10)
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎