ロータリーエンコーダーの高速回転を考える
ロータリーエンコーダーを高速に回したとき、どう判定するか
ロータリーエンコーダーを使った機器では、 回転速度によって上位システムへ送るコードを 変えたい場合があります。
今回は、ロータリーエンコーダーの低速回転と高速回転を どのように判定するかについて考えてみます。
例えば、1ノッチの回転を低速回転と判断した場合は 'W' を送り、 高速回転の3ノッチの場合は 'Q' を送るものとします。
前回のノッチの時の時間を覚えておいて、今回のノッチの時間との差分を取り、 その時間が例えば60msecより大きければ低速回転、それ以下なら高速回転の 3ノッチの内の1ノッチと判断するロジックを使っていた場合、
前回から時間が空いて高速ノッチをした場合、1回目のノッチが低速回転と判断され、 'W'を送り、その後3ノッチで高速回転の'Q'を送る動きになります。
ですが、上位システムとしては高速回転を始めた1ノッチ目から3ノッチで'Q'を 一回だけ出して欲しい場合があります。
この時どのようにロジックを組めばいいでしょうか?
状態遷移図
次のような状態遷移を作れば、問題は解決されます。
状態遷移図の考え方
簡単に説明しますと、今、何もノッチの入っていない Idle状態だったとします。
次の入力は、どんなに早かろうが遅かろうが、 高速ノッチの1回目かもしれないので、
赤い線をたどり青い状態になります。
最初のノッチの判定
ここで60msec以上入力がなければ 青い1回目のノッチは1回の低速ノッチとして遅ればせながら紫の線をたどり 黄色の'W'出力に行き、1回だけ'W'を出力します。
もし青い高速1回目ノッチのあと60msec以内に次のノッチが入ってきたら 青い線をたどり白い高速2回目ノッチに進みます。
高速2ノッチ目に入っていて、そのあと60msec以上入力がない場合も同様に 既に赤い線と青い線2回分ノッチが入っているので、緑の線をたどりオレンジの 'W'に進み、オレンジと黄色の'W'を 2回出力します。
高速2ノッチ目に入っていて、その後60msec以内にノッチが入った場合は高速ノッチが 3回連続で入ったことになるので、'Q'を出力します。
Idleから入力があっても、すぐにコードを出さず保留するのがミソです。