2007年06月08日
Arduino
ロータリーエンコーダを使う
ロータリーエンコーダーは、回転から距離を図るセンサー。
今回使ったのは、OME-100-2MCA(105-015-00)
価格は高いが、2相出力するので、回転方向がわかる。
まずは、回転を計測する
入力には、プルアップが必要で、10kΩを試した。
volatile int count;
int backCount = 0;
void setup()
{
count = 0;
attachInterrupt(0, blink, RISING);
Serial.begin(9600);
}
void loop()
{
delay(100);
int val = count - backCount;
Serial.println(val);
backCount = count;
}
void blink()
{
count++;
}
ロータリーエンコーダーは回転させると、HIGHとLOWのパルスを送り出してくる。
HIGHに変わった瞬間を知るには、attachInterrupt関数を使う。
attachInterrupt(0, blink, RISING);attachInterruptは割り込み処理の関数で、変化があるとループ処理を一時停止して、上の場合だと、blink関数を呼び出す。 1つめの引数は、ポート番号。0,1がDigital 2,3に対応している。 それと、割り込み処理の中で使う変数は、宣言時にvolatileをつける必要がある。
2相出力で回転方向を計測
volatile int count;
int backCount = 0;
int inPutPin = 4; // Signal B
void setup()
{
count = 0;
attachInterrupt(0, blink, RISING);
pinMode(inPutPin, INPUT);
Serial.begin(9600);
}
void loop()
{
delay(100);
int val = count - backCount;
Serial.println(val);
backCount = count;
}
void blink()
{
if(digitalRead(inPutPin) == HIGH){ // 逆回転
count--;
}else{
count++;
}
}
回転方向を知るために、Signal Bを、Dital 4ポートにつなぎ、
HIGHの時、逆回転、LOWの時、正回転になるので、countを引いたり足したりして、回転を計算している。
if(digitalRead(inPutPin) == HIGH){ // 逆回転
count--;
}else{
count++;
}