6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-28

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

今回は最近更新された「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のコンデンサを入れるのが効果的

6
6
0

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
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?