明日は我が身の備忘録(あすびぼ)

自分向け備忘録です。頻繁に更新は難しいでしょうね

ArduinoUNOでロータリエンコーダを読む 立ち上がりエッジ読み取り

 前回に引き続き、いまだに重い腰を上げてArduinoのスケッチ例を試してArduinoの使い方を学んでみる。今回は少し正確な角度検出をしたくなったので、Amazon で中華製ロータリーエンコーダを購入してArduinoで回転角度を測れるようにしてみた。今回は逓倍なしの立ち上がりで読みとり。

f:id:kirikoshokunin:20210323103526j:plain:w300
中華製ロータリーエンコーダとArduino

ロータリーエンコーダ

 まずロータリーエンコーダとは、軸の回転をパルス出力に変換する装置のこと。つまり、1回転するたびに36パルスを出力するロータリーエンコーダがあったとるすと、10 deg. ごとに1パルスを発生させることになる。下の図にパルスの定義を示す。1パルスとは波形の立ち上がりから次の立ち上がりまでのこと。

f:id:kirikoshokunin:20210322222443p:plain:w350
エンコーダ1相波形

 このようにパルスの数をカウントすれば回転した角度、回転数がわかる。しかし、どちらの方向に回転したかはわからない。絶対に一方向にしか回転しないなら問題ないが、どちらにも回転できると方向がわからないと不便なことが多い。  

 そのため、一般的なロータリーエンコーダはA相とB相という2つの波形を出力する。この2相は90 deg. 位相がずれていて回転方向によって位相ずれの方向が異なっているので、回転方向がわかる。言葉で説明するのは大変なので、下の図を参照してほしい。

f:id:kirikoshokunin:20210322223455p:plain:w350
A,B相と回転方向

 つまり、A相が立ち上がりエッジ(もしくは立ち下りエッジ)のときB相の出力がHighなのかLowなのかによって回転方向がわかる。

 さらにZ相もしくはI相という出力があるロータリーエンコーダも多い。この信号は一回転に一回だけパルスがでるもので、原点の位置を表すためにつけられている。これによって、回転角度しかわからなかったロータリーエンコーダがZ相を探知してからカウントし続ければ、1回転の中でどの位置にいるかがわかるようになる。

 今回購入したロータリーエンコーダ(C38S6G5-1024Z-G24N)は1回転1024bitのABZ相があるもので3000円程度の比較的安いもの。因みに日本製のものは安いものでこの4~5倍はする。その分、日本製のものは耐環境性やノイズが小さいというメリットがあるが、単純な角度測定したいだけだったので、中華製のもので十分だと思う。(最近の中華製は安くて品質も悪くないものも多い気がする)

オープンコレクタ

 このエンコーダは出力方式の記載がなかったが、試した結果オープンコレクタ出力であることが分かった。オープンコレクタとは下の図のようにコレクタがプルアップされずに解放されてる回路のこと。このようにすることで、ユーザ側が定格範囲内なら自由に出力電圧を設定できるという特徴がある。Arduinoの場合はデジタル入力の内蔵プルアップをONにすればよい。

f:id:kirikoshokunin:20210322215731p:plain:w300
オープンコレクタ回路

 ロータリーエンコーダの波形をADALM2000でよみとる

 おなじみのADALM2000のオシロスコープ機能で中華製ロータリーエンコーダ(C38S6G5-1024Z-G24N)の信号を読んでみる。このようにちゃんとA相とB相で位相がずれていて回転方向がわかる。

f:id:kirikoshokunin:20210322230712p:plain:w300
ADALM2000でエンコーダ出力を読み取った画面

Arudinoで波形を読み取る方法

デジタル入力割り込み

 Arduinoでは、入力がONになったら関数を呼び出すような入力割り込み機能がある。これを使えば、ロータリーエンコーダの信号周波数がある程度高くなっても読み飛ばすことがなくなる。因みにポーリングでエンコーダ波形を読み取る場合は、ポーリング周期とロータリーエンコーダの信号周波数をきちんと考えないと読み飛ばしてしまい、うまく動作しないことが多い。    入力割り込みは”立ち上がりエッジ”と、”立ち下がりエッジ”、”両方のエッジ”、”LOWのとき”のように割り込み要因を選択できる。ただし、Arduinoのボードによって入力割り込みを設定できるピンに制限があるので注意が必要。  ArduinoUNOの場合はPIN2とPIN3だけが入力割り込みに対応している。

 例えば、A相の信号をpin2に接続して他のデジタル入力ピンにB相の信号を接続すれば、A相の立ち上がりエッジで割り込みをしてB相の入力を読み取ればどちらの方向に回転しているかわる。それに応じてエンコーダパルスのカウントをインクリメントしたり、デクリメントしたりすればよい。また、このときにZ相がLowだったらそこが原点なので、回転数がわかる。

 ちなみに、立ち上がりエッジだけでなく両方のエッジで割りこむと分解能を2倍に上げられる。また、A,B相どちらでも割り込みことで分解能を4倍に上げることができる。これは、次回に記事としてまとめる。

入力割り込みの詳細は下のURLを参照してほしい。

www.arduino.cc

 

スケッチ

 A相の立ち上がりエッジで割りこんでB相の電圧を読み取って回転方向を識別するプログラムを下に示す。

 プログラム実行結果

 上のスケッチを実行したシリアルモニタでエンコーダカウントを読み取った動画を下に示す。


8周遅れのArduino (ArduinoUNOでロータリーエンコーダの信号を読み取る)

前回記事

kirikoshokunin.hatenablog.com