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

このチュートリアルは武蔵野美術大学通信教育課程授業用に作成したものです。
今回はロータリーエンコーダを使って回転を取得します。

aitendoのエンコーダーはスイッチ付きのタイプですが、今回はエンコーダー部(3pin)の部分を使用し、Arduinoの2,GND,3にそれぞれ接続します。

sample code

#define PIN_A 2
#define PIN_B 3
const int8_t ENCODER_TABLE[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
volatile bool StatePinA = 1;
volatile bool StatePinB = 1;
volatile uint8_t State = 0;
volatile long Count = 0;
void setup() {
  pinMode(PIN_A, INPUT_PULLUP);
  pinMode(PIN_B, INPUT_PULLUP);
 
  attachInterrupt(0, ChangePinAB, CHANGE);
  attachInterrupt(1, ChangePinAB, CHANGE);
  Serial.begin(9600);
}

void loop() {
  Serial.println(Count);
}
void ChangePinAB(){
  StatePinA = PIND & 0b00000100;
  StatePinB = PIND & 0b00001000;
  State = (State<<1) + StatePinA;
  State = (State<<1) + StatePinB;
  State = State & 0b00001111;
  Count += ENCODER_TABLE[State];
}

Arduino UNOを使用する場合、ピンの設定は2,3を必ず使用してください。これは割り込みが使えるピンがボードごとに決まっているからです。他のボードを使う場合は各ボードの割り込みピンを確認して配線を変更してください。