Arduinoでロータリエンコーダを使う(1)

安価に入手できるロータリエンコーダをArduinoに接続してカウント値を読み出せるようにします。次の写真はアダプタ基板WSN361を使ってブレッドボードに実装したときのものです。

単純な方法ではチャタリングがでて、正確にカウントできないことがありますが、ここではチャタリングキャンセル処理を入れて正確にカウントできるようにします。

rotenc1

ロータリエンコーダの種類

ロータリエンコーダにはアブソリュート型とインクリメンタル型の2種類があります。アブソリュート型というのは、角度データが絶対値で読み出せるものです。対する、インクリメンタル型は現在位置からどれほど回転したかを読み出せるものです。一般的にアブソリュート型は高価です。安価なものは100円前後で購入できるものもありますが、オムロンの産業用のエンコーダは数万円するようなものもあります。

さらに、パルスを検出する方法に機械的な電気接点を利用するものと非接触の光学式のものがあります。

パーツショップなどで安価に購入できるエンコーダは機械式のインクリメンタル型です。ちなみに、ボールが入ったマウスでは光学式のロータリーエンコーダが使われています。

回転の検出方法

ロータリエンコーダのパルスを読み出す原理は簡単です。通常、エンコーダを回転させると、2つのパルス(A相とB相)が出力されます。この2相の信号は互いに90度位相がずれるように作られています。

enc1

単純に回転を検出するだけなら、パルスの立ち上がり、または立下りエッジをカウントすれば良いことはわかると思います。問題は回転方向をどうやって知るかです。そこで、片方の相の信号に注目して、A相の変化点でB相の信号のレベルを調べると、回転方向に応じてレベルが異なることがわかります。
つまり、片方のパルスのエッジのタイミングで、もう片方のパルスのレベルを調べることで回転方向がわかります。

これをそのまま、プログラムすれば回転数(カウント値)読み取ることができます。

チャタリングの問題

ただ、実際に作ってみるとわかりますが、チャタリング(電気接点の機械的な振動によるスパイクノイズ)の影響で正確なカウントができないことがあります。電気的にチャタリングを解除する方法もありますが、シュミット回路などが必要になるので、チョット面倒です。

チャタリング解除処理

ここでは、チャタリングをソフトウェア的に取り除いて正確にカウントできるものを紹介します。

原理はスイッチなどに使われるのと同じで、適当な周期で、信号の状態を何度か読みだして、同じ状態が規定回数続いた場合に状態を確定するというものです。ただ、一般的なスイッチと違い、信号レベルの変化が速いため、サンプリングの周期を短くする必要があります。

(続く)

 

 

コメントは受け付けていません。