class Encoder -- 直交デコーダー

Encoder クラスは、直交デコーダーとして構成された i.MX RT QENC ハードウェアブロックをラップします。ロータリーエンコーダーから来る二相信号(phase_a / phase_b)を追跡し、位相関係に応じて 32 ビットの位置カウンターをインクリメントまたはデクリメントし、絶対参照のためにオプションの index / reset 入力と組み合わせることができます。

OpenMV Cam RT1062(mimxrt ポート)でのみ利用できます。STM32 ベースの OpenMV カメラでは、代わりにエンコーダーモード(Timer.ENC_AB)用に構成した pyb.Timer を使用してください。OpenMV Cam AE3(alif ポート)では公開されていません。

使用例:

from machine import Pin, Encoder

enc = Encoder(0, Pin("P0", Pin.IN), Pin("P1", Pin.IN), phases=4)
enc.value(0)
# ... rotate the encoder ...
print("position:", enc.value())

コンストラクタ

class machine.Encoder(id: int, phase_a: Pin | None = None, phase_b: Pin | None = None, *, phases: int = 1, filter_ns: int = 0, max: int | None = None, min: int = 0, index: Pin | None = None, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None)

id で識別される QENC エンコーダーブロックを構築します(またはそのシングルトンを取得します)。同じ引数は、既存のインスタンスを再構成するための init() でも受け付けられます。

phase_a / phase_b は 2 つの直交入力ピンです。

phases(キーワード専用)はデコードの粒度を選択します。QENC は 1(パルスペアごとに 1 エッジをカウント)、2(位相 A の両エッジ)、または 4(「4x デコード」-- 両位相のすべてのエッジをカウント)をサポートします。デフォルトは 1 です。

filter_ns(キーワード専用)-- 入力が安定している必要のある最小時間(ナノ秒単位)です。ドライバはこの値以下で最も長いハードウェアフィルタを使用します。0(デフォルト)はフィルタリングを無効にします。

max / min(キーワード専用)-- 位置カウンターのモジュロ範囲です。カウンターが max を超えると min にラップし、サイクルカウンターがインクリメントされます(逆方向に動く場合はデクリメント)。両方に 0 を渡すと範囲が無効になります。

index(キーワード専用)-- 立ち上がりエッジで位置カウンターを min に再ロードし、方向に応じてサイクルカウンターを更新する Pin です。一般的な用途は、ロータリーエンコーダーの Z チャンネルマークです。

reset(キーワード専用)-- 立ち上がりエッジで位置カウンターを開始値に再ロードする Pin です(サイクルカウンターは変更されません)。

match(キーワード専用)-- IRQ_MATCH 割り込みが発生する位置値です。None を渡すと無効になります。

match_pin(キーワード専用)-- 位置カウンターが match と等しい間は high に駆動され、それ以外では low になる Pin です。

メソッド

init(phase_a: Pin | None = None, phase_b: Pin | None = None, *, phases: int = 1, filter_ns: int = 0, max: int | None = None, min: int = 0, index: Pin | None = None, reset: Pin | None = None, match: int | None = None, match_pin: Pin | None = None) None

指定したパラメータでエンコーダーを再初期化し、その位置カウンターとサイクルカウンターをリセットします。コンストラクタと同じキーワード引数を受け付けます。

deinit() None

エンコーダーを停止し、保留中の割り込みをすべて無効にして、QENC ハードウェアリソースを解放します。ソフトリセットでは、すべての Encoder インスタンスが自動的に deinit されます。

value() int
value(value: int, /) int

符号付き位置カウンターを取得または設定します。

引数なしの場合は、現在の位置を返します。

単一の value 引数を指定した場合は、位置カウンターをアトミックに value に設定し、以前のカウントを返します。一般的な慣用句 enc.value(0) は、測定ウィンドウの開始時にカウンターをリセットします。

cycles() int
cycles(value: int, /) int

サイクルカウンターを取得または設定します。これは符号付き 16 ビット整数で、位置カウンターが max / min を何回超えてラップしたかを追跡します。

引数なしの場合は、現在のサイクルカウントを返します。

単一の value 引数を指定した場合は、サイクルカウンターを value に設定し(位置カウンターには触れません)、以前のカウントを返します。

irq(handler: Callable[[Encoder], None] | None = None, trigger: int = 0, hard: bool = False) None

サポートされている QENC イベントのいずれかが発生したときに呼び出されるコールバックを登録します。ハンドラは唯一の引数として Encoder オブジェクトを受け取ります。具体的なイベントは、ハンドラ内で irq.flags() を介して識別できます。

trigger は、1 つ以上の IRQ_* 定数のビットマスクです:

  • IRQ_RESET -- reset ピンがアサートされました。

  • IRQ_INDEX -- index ピンがアサートされました。

  • IRQ_MATCH -- 位置カウンターが match に達しました。Match はワンショットであり、IRQ を再インストールして再アームする必要があります。

  • IRQ_ROLL_OVER -- 位置カウンターが max から min へラップしました。

  • IRQ_ROLL_UNDER -- 位置カウンターが min から max へラップしました。

hard=True はハード割り込みハンドラを登録します(レイテンシは低くなりますが、ハンドラはメモリ割り当てを行ってはいけません)。デフォルトはスケジュールされたコールバックです。handler=None を渡すと割り込みが無効になります。

定数

IRQ_RESET: int

reset ピンイベントに対する irq() トリガーフラグです。

IRQ_INDEX: int

index ピンイベントに対する irq() トリガーフラグです。

IRQ_MATCH: int

位置一致イベントに対する irq() トリガーフラグです。

IRQ_ROLL_OVER: int

カウンターのロールオーバー(max -> min)に対する irq() トリガーフラグです。

IRQ_ROLL_UNDER: int

カウンターのロールアンダー(min -> max)に対する irq() トリガーフラグです。