2015年3月11日水曜日

ロータリーエンコーダーをArduinoで使ってみた

オシロスコープのプローブが初期不良だったみたいなので交換してもらうことにした。
プローブが1本しかなくてオシロで2入力の位相を計測できないのでLEDで動作チェックしてみた


クリック位置(デテント?)では、00、11しか出力されないのは仕様の様だ

データーシートの位相差の項


クリック位置とクリック位置の中間で01や10になる
時計回り→
AB: 00 (10) 11 (01) 00
              ←反時計回り
()はクリックの中間位置
10 → 11または00
01 → 11または00
の変化を読み取るようにしてArduinoでスケッチを書いてみた

 //PINアサイン  
 int rotAPin = 2;  
 int rotBPin = 3;  
 volatile int rotA = 0;  
 volatile int rotB = 0;  
 volatile int oldRotA = 0;  
 volatile int oldRotB = 0;  
 void setup() {  
  pinMode(rotAPin, INPUT_PULLUP);  
  pinMode(rotBPin, INPUT_PULLUP);  
  Serial.begin(115200);  
  Serial.println("Start Rotary Encoder Test.");  
 }  
 void loop() {  
  oldRotA = rotA;  
  oldRotB = rotB;  
  rotA = digitalRead(rotAPin);  
  rotB = digitalRead(rotBPin);  
  if ((oldRotA != rotA) || (oldRotB != rotB)){  
   int oldRot = ((oldRotA << 1) | oldRotB);  
   int rot = ((rotA << 1) | rotB);  
   Serial.print(oldRotA);  
   Serial.print(" ");  
   Serial.print(oldRotB);  
   Serial.print(" -> ");  
   Serial.print(rotA);  
   Serial.print(" ");  
   Serial.print(rotB);  
   Serial.print(" ");  
   if (oldRot == 0b10) {  
    if (rot == 0b11) Serial.print(" >>");  
    else if (rot == 0b00) Serial.print(" <<");  
   } else if (oldRot == 0b01) {  
    if (rot == 0b00) Serial.print(" >>");  
    else if (rot == 0b11) Serial.print(" <<");  
   }  
   Serial.println("");  
  }  
 }  

ちょっと冗長ぎみですが(^q^;

シリアル出力例


時々読み取り値がおかしくなる(読みこぼし?)

オシロで(片チャンネルだけ)波形をとってみたが


そんなにチャタリングは出てないような感じです

読み取りエラーは出力用のシリアル通信の遅延が影響しているのかな?

0 件のコメント:

コメントを投稿