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ミリ秒を作っている。
なので、ロータリーエンコーダと同時にタイミングが難しい処理を行うとおかしくなるかもしれない。
例えば赤外線の受信とか。
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;//PinBvoidsetup()
{
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);
}