2025年2月16日日曜日

CircuitPythonにロータリーエンコーダー用のモジュールがあった。

https://docs.circuitpython.org/en/latest/shared-bindings/rotaryio/index.html
circuit pythonにロータリーエンコーダー専用のモジュールがあるのなら自作しないで使うべきでした。
で、このページをみたらクリックタイプの動きがわかりました。
秋月で買った100円のクリックタイプのロータリーエンコーダーは1クリック進むとOFF,OFF,ON,ONの1サイクル分進んでいた、と。

rotaryio.IncrementalEncoderを呼び出すときに指定する。divisorがデフォルトで4で、
これはdedents(引っ掛かり)が、(ON,ON,OFF,OFFの)1サイクルあたりに1回しかこない場合に指定するようです。
ということは、1クリック分動かすと1サイクル分うごくものがある、と、
ロータリーエンコーダをGPIO1,GND,GPIO2に接続し、
上記のcircuitpythonのページのサンプルをraspberrypipico用にピンを少し書き換えて、以下のプログラムを動かしてみました。 import rotaryio import time from board import * enc = rotaryio.IncrementalEncoder(GP1, GP2) last_position = None while True: position = enc.position if last_position == None or position != last_position: print(position) last_position = position 結果、ロータリーエンコーダを回すと+1もしくは-1をした値を返してくれた。 もう簡単に試せるクリックなしのロータリーエンコーダを持っていないので試していないのだけど、 クリックなしのロータリーエンコーダーの場合は、IncrementalEncoderの第三引数に1を入れればよいのだと思う。 2025/2/20 追記: クリックなしロータリーエンコーダーでIncrementalEncoderモジュールを使ったところ、第三引数なし(divisor=4)だと誤りなく拾えるが、 回す量に対する読み取り頻度が体感1/4になってしまい、第三引数に1を設定すると読み取り頻度が向上するが、逆方向読み取りも多々発生する。 1周期1カウントや2カウントを拾うのなら使えそうだが、1周期4カウント拾うのは汎用的なものだと無理があるのかな?