🍣

ロータリーエンコーダーモジュール

2022/12/18に公開

デバイス概要

右回転、左回転、クリックで、デジタル信号を発します

使い方

ロータリーを回すと、以下のように位相が反転します

右に回した時は、s1が立ち上がり→s2が立ち上がり→s1が立ち下がり→s2が立ち下がりとなります。
左に回した時は、s2が立ち上がり→s1が立ち上がり→s2が立ち下がり→s1が立ち下がりとなります。

プログラム

s1,s2,keyはプルアップでピンを割り当てます

いったんs1のみに着目します。

右回転ではs1がONになった時(1→0になった時)、s2の位相はLOWのはずです。
反対に左回転ではs1がONになった時、s2の位相はHIGHになっています。

そこで、s1の割り込みが発生した時のs2の位相で、右回りか左回りかを判定します


s2についても同様に設定します。

最後に、使い回ししやすいようにclassにしました。

サンプルコード
class Rotate:
    preTick:int=0
    s1Pin:Pin
    s2Pin:Pin

    def __init__(self,s1PinNum:int,s2PinNum:int,callback) -> None:
        self.s1Pin = Pin(s1PinNum,Pin.IN,Pin.PULL_UP)
        self.s2Pin = Pin(s2PinNum,Pin.IN,Pin.PULL_UP)
        self.s1Pin.irq(trigger=Pin.IRQ_FALLING , handler=self.rotate)
        self.s2Pin.irq(trigger=Pin.IRQ_FALLING , handler=self.rotate)
        self.callback = callback

    def rotate(self,pin):
        # チャタリング対策
        diff = ticks_ms()-self.preTick
        self.preTick = ticks_ms()
        if diff < 50:return

        if pin==self.s1Pin:
            dir = 'left' if self.s2Pin.value() else 'right'
        elif pin==self.s2Pin:
            dir = 'right' if self.s1Pin.value() else 'left'
        # print(dir)
        self.callback(dir)

Discussion