ロータリーエンコーダは可変抵抗と違って無限に回転できるものが多いです。今回はこんな感じのロータリーエンコーダを使います。
リンク
ロータリーエンコーダの使い方
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 |
Zero | 4番ピン以外のデジタルピン |
MKR | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
2つ以上のロータリーエンコーダを使う場合
タイマ割り込みを使えば、Arduino Unoで無理やり複数のロータリーエンコーダを使うっことができます。
より正確に測りたい場合は、 Arduino Dueを使った方が良いかと思います。Arduino Due はすべてのピンでピン変化割り込みが使えるので、全てのピンで複数のロータリーエンコーダを使うことが出来ます。Arduino Dueは 32bit マイコンでArduino Unoよりも処理が早いので、取りこぼしも減ると思います。
リンク
コメント
割り込み処理のミスについてあれこれと・・・ご一読いただければ。
http://igarage.cocolog-nifty.com/blog/2022/03/post-fbb7ad.html