Arduino – ロータリーエンコーダを回す

Arduinoでロータリーエンコーダの回転を検出した。

ロータリーエンコーダは可変抵抗と異なり、アナログ値を出すのではなく回転方向を2byteでデジタル出力するので、無限に回転させる事ができる。マウスのホイールもロータリーエンコーダで出来ている。

Source Code (Arduino 0009 Alpha / ATmega8 16MHz)

基本的に回路もプログラムもATMega8でやったのと全く同じ方法でできた。

s.h.log: AVR – mega8でロータリーエンコーダを回す

ロータリーエンコーダーの真ん中の足をGNDに接続し、左右の足をそれぞれマイコンのピンに接続。また、左右の足とマイコンのピンの間で、10kΩの抵抗を使ってプルアップする(VCCに接続する)

まあ写真の通り。

インクリメンタル型ロータリーエンコーダーは2本の線で4種類の回転状態を出力する。1クリック回す(カチッと言う)と、4種類の状態が一回りする。

とりあえず状態に0,1,2,3と名前をつけて、10ms毎ぐらいに状態を見に行くと、状態が1増えていたら右に回転、減っていたら左に回転みたいな感じでわかる。

ただし、Arduinoにはタイマーが無いので、メインループ loop() の中で delayMicroseconds(10); を呼んで、10ミリ秒を作っている。

なので、ロータリーエンコーダと同時にタイミングが難しい処理を行うとおかしくなるかもしれない。

例えば赤外線の受信とか。



 

回路の写真。抵抗は10kΩを使う。

DSC05557

DSC05562

Source Code (Arduino 0009 Alpha / ATmega8 16MHz)

/***

  Detect rotation of Rotary Encoder by pin2 & pin3

  send rotation state to PC via SerialPort.

  

  CPU: ATMEGA8 16MHz

  Compiler: Arduino 0009 Alpha

  Date: 2007/10/26

  Author: Sho Hashimoto

  WebSite: http://shokai.org

  ***/

char led_pin = 13; // LED on Arduino board

char rot_pinA = 2; // PinA of RotaryEncoder

char rot_pinB = 3; // PinB

void setup()

{

  Serial.begin(9600);

  pinMode(led_pin, OUTPUT);

  digitalWrite(led_pin, HIGH);

  pinMode(rot_pinA, INPUT);

  pinMode(rot_pinB, INPUT);

}

char rot_state;

void loop()

{

  char past_state = rot_state;

  

  // 2つのピンからの入力状態をチェック

  if(digitalRead(rot_pinA)){

    if(digitalRead(rot_pinB)) // HH

      rot_state = 1;

    else // HL

      rot_state = 0;

  }

  else{

    if(digitalRead(rot_pinB)) // LH

      rot_state = 2;

    else // LL

      rot_state = 3;

  }

  

  // 回転方向を割り出す

  if((rot_state+3+1)%3 == past_state){ // 右回り

    Serial.println(”R”);

  }

  else if((rot_state+3-1)%3 == past_state){ // 左回り

    Serial.println(”L”);

  }

  

  delayMicroseconds(10);

}

  1. コメントはまだありません。
  1. トラックバックはまだありません。
track feed