ロータリーエンコーダー使おうとしたらライブラリがいくつかありました。
今回は最近更新された「RotaryEncoder」ライブラリを使ってみました。
環境
Ubuntu18.04
Arduino 1.8.10
ESP32
GxEPD2
ライブラリインストール
「ツール」-「ライブラリを管理...」でライブラリマネージャを呼び出し、「Rotaryencoder」と入力しインストール
「RotaryEncoder by Matthias Hartel」を選びます。
サンプルプログラム
「ファイル」-「スケッチ例」-「カスタムライブラリのスケッチ例」-「RotaryEncoder」-「SimplePallRotater」
を呼び出す
以下の箇所を探して
// Setup a RoraryEncoder for pins A2 and A3:
RotaryEncoder encoder(A2, A3);
void setup()
{
Serial.begin(57600);
Serial.println("SimplePollRotator example for the RotaryEncoder library.");
} // setup()
以下のように変更
// Setup a RoraryEncoder for pins A2 and A3:
RotaryEncoder encoder(12, 13);
void setup()
{
Serial.begin(115200);
Serial.println("SimplePollRotator example for the RotaryEncoder library.");
} // setup()
これで動いた。
動作解説
void loop()
{
static int pos = 0;
encoder.tick();
ということで、tick() をループ中で呼び出している。次の割り込み駆動のプログラムでは、ピン状態変更割り込みでtick()を呼び出している。
割り込みで動かす
「ファイル」-「スケッチ例」-「カスタムライブラリのスケッチ例」-「RotaryEncoder」-「InterruptRotater」
を呼び出す
#include <RotaryEncoder.h>
// Setup a RoraryEncoder for pins A2 and A3:
RotaryEncoder encoder(A2, A3);
void setup()
{
Serial.begin(57600);
Serial.println("SimplePollRotator example for the RotaryEncoder library.");
// You may have to modify the next 2 lines if using other pins than A2 and A3
PCICR |= (1 << PCIE1); // This enables Pin Change Interrupt 1 that covers the Analog input pins or Port C.
PCMSK1 |= (1 << PCINT10) | (1 << PCINT11); // This enables the interrupt for pin 2 and 3 of Port C.
} // setup()
// The Interrupt Service Routine for Pin Change Interrupt 1
// This routine will only be called on any signal change on A2 and A3: exactly where we need to check.
ISR(PCINT1_vect) {
encoder.tick(); // just call tick() to check the state.
}
となっているのを
#include <RotaryEncoder.h>
// Setup a RoraryEncoder for pins A2 and A3:
RotaryEncoder encoder(12, 13);
// The Interrupt Service Routine for Pin Change Interrupt 1
// This routine will only be called on any signal change on A2 and A3: exactly where we need to check.
void IRAM_ATTR ISR() {
encoder.tick(); // just call tick() to check the state.
}
void setup()
{
Serial.begin(115200);
Serial.println("SimplePollRotator example for the RotaryEncoder library.");
attachInterrupt(12, ISR, CHANGE);
attachInterrupt(13, ISR, CHANGE);
} // setup()
とすると動いた
チャタリング防止
0.1uFのコンデンサを入れるのが効果的