10月 282007
Arduino – ロータリーエンコーダを回すのコードがアレだったのでシンプルに書き直した。回路はそのままで。
char rot_state; // 状態 0~3
char rot_pinA = 8; // PinA of RotaryEncoder
char rot_pinB = 9; // PinB
void setup()
{
Serial.begin(9600);
pinMode(rot_pinA, INPUT);
pinMode(rot_pinB, INPUT);
rot_state = rotary_getState(rot_pinA, rot_pinB); // 現在の状態を保存しておく
}
void loop()
{
// ロータリーエンコーダの状態を監視して、PCにシリアル通信で送る
char rot_past = rot_state;
rot_state = rotary_getState(rot_pinA, rot_pinB); // 今の状態
char rot_dir = rotary_getDir(rot_state, rot_past); // 回転方向
switch(rot_dir){
case 2:
Serial.println("R"); // 右回転
break;
case 1:
Serial.println("L"); // 左回転
break;
}
delayMicroseconds(10);
}
/* ロータリーエンコーダの状態番号0~3を取得する */
char rotary_getState(char pinA, char pinB){
// 2つのピンからの入力状態をチェック
if(digitalRead(pinA)){
if(digitalRead(pinB)) return 2;
else return 0;
}
else{
if(digitalRead(pinB)) return 1;
else return 3;
}
}
/* 1つ前の状態と比較して、回転方向を取得する */
char rotary_getDir(int state, int past_state){
if((state+3+1)%3 == past_state) return 1; // 左回り
else if((state+3-1)%3 == past_state) return 2; // 右回り
return 0; // 変化無し
}