●ロータリーエンコーダを使ってみる

2相の光学式ロータリーエンコーダの端子にLEDを取り付けてどのように動作するのか見てみます
出力端子とGNDの間にLEDを取り付けました。
この現在の角度がわからないタイプのエンコーダはインクリメンタル型と言うらしいです。



このエンコーダに5V程度の電圧をかけて回してみます


LEDの点灯がデジタル的でなくて、徐々に明るくなって徐々に暗くなるタイプでした。
この場合、マイコンなどに直接接続すると良い事がなさそうなので波形をパット点いてパット消えるデジタルに整形する必要がありそうです。


■右回転と左回転を判別する方法

エンコーダを回すと次のような感じでLEDが点灯します。

そこで2つのLEDの明るさが変化したタイミングにより線を引いてみます。

A相を上位ビットB相を下位ビットとした場合において、
正転:10 → 11 → 01 → 00
逆転:00 → 01 → 11 → 10

により回転方向が判別できてパルスの回数により回転量が判別できます。
プログラム的には前回値を保持しておいて今回値と合体させて、スイッチ文で判定するのが一番簡単そうです。

前回値を左シフト2をして今回値と足し算します。
そうすると、正転の場合には
00 10 : 0x02
10 11 : 0x0b
11 01 : 0x0d
01 00 : 0x04
の値を取り、逆転の場合には
10 00 : 0x08
00 01 : 0x01
01 11 : 0x07
11 10 : 0x0e
の値を取ります。(赤色の文字は値を16進数に変換した値です)
この値で分岐させることによりマイコンで右回転、左回転の判断ができるはずです。


■エンコーダの波形をデジタルに整形する

アナログ的な出力のエンコーダですのでデジタルに整形します。
ある程度の電圧になったら一気にONにしてある程度の暗さになったら一気にOFFにする汎用ロジックICの 74HC14のシュミットトリガを接続します。

Vccにはプラス極、GNDにはマイナス極、5Vを加えると動作します。
CMOSですから5Vは決して超えてはなりません壊れますので。
ICの内部に6個のシュミットトリガがありますのでその中の2個を使用しました。

エンコーダの信号を入力に接続して10KΩでプルダウンしました。
しかし、10KΩだと速く回転させた時に十分にプルダウンが追いつきませんでした。
抵抗はエンコーダに合わせて調整したほうが良さそうです。

動作させるとON・OFFが素早く切り替わります。



■マイコンに接続する

arduinoというマイコンに接続しました。
シュミットトリガの出力をデジタルピンの2番3番に接続します。

Arduino IDEという開発環境を開いて、(右回転と左回転を判別する方法)で考えた方法をそのままプログラムに変換しました。

void setup() {
  Serial.begin( 9600 );
  pinMode( 2, INPUT );
  pinMode( 3, INPUT );
}


int old;
void loop() {
  int i=(digitalRead(2)<<1)+digitalRead(3);
  if(old!=i){
    int j=(old<<2)+i;
    switch(j){
      case 0x02:
      case 0x0b:
      case 0x0d:
      case 0x04:
        Serial.print("正転:");
        break;
      case 0x08:
      case 0x01:
      case 0x07:
      case 0x0e:
        Serial.print("逆転:");
        break;
      default:
        Serial.print("エラー:");
    }
    Serial.println(j,HEX);
    old=i;
  }
}
実行結果です。
シリアルモニタを開くとSerial.printでの出力が表示されます。
正転・逆転も正確に動作しました。



▲トップページ > マイコンなど