プローブが1本しかなくてオシロで2入力の位相を計測できないのでLEDで動作チェックしてみた
クリック位置(デテント?)では、00、11しか出力されないのは仕様の様だ
データーシートの位相差の項
クリック位置とクリック位置の中間で01や10になる
時計回り→()はクリックの中間位置
AB: 00 (10) 11 (01) 00
←反時計回り
10 → 11または00の変化を読み取るようにしてArduinoでスケッチを書いてみた
01 → 11または00
//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 件のコメント:
コメントを投稿