CircuitPython 10行プログラミング (8) ロータリ・エンコーダ

 ロータリ・エンコーダは、回転する方向を判別できるデバイスです。ボリュームを使っても同じようなことができます。ボリュームに比べて耐久性は高く、ボリュームのように回転角に制限がありません。

 Trinket M0マイコン・ボードとCircuitPythonを使います。

利用するロータリ・エンコーダ

 アマゾンで入手しました。書かれているスペックは動作電圧が5V、パルスが20です。秋月電子通商で外形の似た製品のページにデータシートがありました。こちらのスペックは、動作電圧が5V、パルスが24です。ロータリ・エンコーダで検索して最初に出てきたオムロンの解説ページによると、アブソリュート形とインクリメンタル形の2種類がある中で、この製品はインクリメンタル形と思われます。


 基板裏に10kΩの抵抗があるので信号が電源にプルアップされているとすれば、ONは0Vになると思われます。信号はA相、B相の二つですが、基板上に書かれたシルクの信号名に相当しているか不明だったので、検索してよく似ているボードを探しました。このArduinoのページから、次のような接続だとわかりました。

  • CLK A相
  • DT  B相
  • SW プッシュ・スイッチ
  • +  5V
  • GND GND

 整理します。このインクリメンタル形ロータリ・エンコーダは、右にも左にもぐるぐる回すことができ、その出力はCLKとDT端子に出ます。回転軸を上から押すと軽くへこみ、その出力はSW端子に反映されます。

ライブラリ

 IncrementalEncoderのライブラリでは、A、B相のピンを指定します。保存(実行)すると、rotaryioというライブラリはないというエラー表示が出ます。こちらのページには、SAMD21ではサポートされてない機種があると書かれています。Adafruitの解説ページは、「at this time, Gemma M0, Trinket M0 and other non-Express boards do not support rotaryio」と書かれていたので、現時点では使えないようです。

import rotaryio
import time
from board import *

enc = rotaryio.IncrementalEncoder(D1, D2)
last_position = None

while True:
position = enc.position
if last_position == None or position != last_position:
print(position)
last_position = position

非同期の動作

 ロータリ・エンコーダは、AとB相端子を監視して、状態が変化したら、前の状態と比較してどっちの方向へ回転したか、回転方向へ何パルス発生したかをカウントすると利用できます。しかし、アプリケーション・ソフト内では、いつロータリ・エンコーダが回し始めたかを検知するには割り込みを使うことになります。ノブのスイッチも同じです。
 したがって、10行程度では記述するのは無理だと思い、別に機会に取り上げることにしました。

補足 3.3Vで動作

 電源電圧は5Vのようですが、3.3Vの電源でも動作します。右に回したときの波形です。

 左に回したときの波形です。