🍣
ロータリーエンコーダーモジュール
デバイス概要
右回転、左回転、クリックで、デジタル信号を発します
使い方
ロータリーを回すと、以下のように位相が反転します
右に回した時は、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