Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

ロータリーエンコーダーを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のコンデンサを入れるのが効果的

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?