search
LoginSignup
5

More than 1 year has passed since last update.

posted at

updated at

Organization

ロータリーエンコーダーをESP32で使う

ロータリーエンコーダー使おうとしたらライブラリがいくつかありました。

今回は最近更新された「RotaryEncoder」ライブラリを使ってみました。

image.png

環境

Ubuntu18.04
Arduino 1.8.10
ESP32
GxEPD2

ライブラリインストール

「ツール」-「ライブラリを管理...」でライブラリマネージャを呼び出し、「Rotaryencoder」と入力しインストール

image.png

「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()

とすると動いた

チャタリング防止

image.png

0.1uFのコンデンサを入れるのが効果的

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5