Arduinoでロータリーエンコーダを使う(つなぎ方&スケッチ)

記事内に広告が含まれています。

ロータリーエンコーダは可変抵抗と違って無限に回転できるものが多いです。今回はこんな感じのロータリーエンコーダを使います。

スポンサーリンク

ロータリーエンコーダの使い方

2番ピンと3番ピンにロータリーエンコーダのAとBをつなぎ、GNDを共有します。(Uno, Nano, Mini ,またそれらの互換ボードでは2番ピン、3番ピンのみで使えます。)その他のボードについてはこの表で確認してください。

ロータリーエンコーダの配線図

以下のスケッチで動きます。1クリックあたりCountの値が4変化します。

#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() {
  update_value();
  Serial.println(value);
  delay(10);
}
void ChangePinAB(){
  StatePinA = PIND & 0b00000100;
  StatePinB = PIND & 0b00001000;
  State = (State<<1) + StatePinA;
  State = (State<<1) + StatePinB;
  State = State & 0b00001111;
  Count += ENCODER_TABLE[State];
}
void update_value(){
  noInterrupts();
  value = Count;
  interrupts();
}

2番ピン3番ピン以外で使いたい場合はUno以外のボードを使いましょう。

下の表はピン変化割り込みが使えるピンとボードの関係です。

ボード使えるピン
Uno, Nano, Min 2,3
Due , Uno WiFi Rev.2, 101 全てのデジタルピン
Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21
Micro, Leonardo 0, 1, 2, 3, 7
Zero4番ピン以外のデジタルピン
MKR0, 1, 4, 5, 6, 7, 8, 9, A1, A2

2つ以上のロータリーエンコーダを使う場合

タイマ割り込みを使えば、Arduino Unoで無理やり複数のロータリーエンコーダを使うっことができます。

より正確に測りたい場合は、 Arduino Dueを使った方が良いかと思います。Arduino Due はすべてのピンでピン変化割り込みが使えるので、全てのピンで複数のロータリーエンコーダを使うことが出来ます。Arduino Dueは 32bit マイコンでArduino Unoよりも処理が早いので、取りこぼしも減ると思います。

コメント

  1. 割り込み処理のミスについてあれこれと・・・ご一読いただければ。
    http://igarage.cocolog-nifty.com/blog/2022/03/post-fbb7ad.html