2007年06月08日

Arduino

ロータリーエンコーダを使う

ロータリーエンコーダーは、回転から距離を図るセンサー。
今回使ったのは、OME-100-2MCA(105-015-00)
価格は高いが、2相出力するので、回転方向がわかる。

まずは、回転を計測する

rotaly.jpg

入力には、プルアップが必要で、10kΩを試した。
rotaly_z.jpg

arduinoのソース
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相出力で回転方向を計測

rotaly2.jpg

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++;
}