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)

/***

DetectrotationofRotaryEncoderbypin2&pin3

sendrotationstatetoPCviaSerialPort.



CPU:ATMEGA816MHz

Compiler:Arduino0009Alpha

Date:2007/10/26

Author:ShoHashimoto

WebSite:http://shokai.org

***/

charled_pin=13;//LEDonArduinoboard

charrot_pinA=2;//PinAofRotaryEncoder

charrot_pinB=3;//PinB

voidsetup()

{

Serial.begin(9600);

pinMode(led_pin,OUTPUT);

digitalWrite(led_pin,HIGH);

pinMode(rot_pinA,INPUT);

pinMode(rot_pinB,INPUT);

}

charrot_state;

voidloop()

{

charpast_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”);

}

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

Serial.println(“L”);

}



delayMicroseconds(10);

}