LoginSignup
3
0

More than 3 years have passed since last update.

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

Posted at

はじめに

Arduino ESP32 でロータリエンコーダーを使用する記事はいくつかあります。
ライブラリマネージャーからインストールして使用する記事はこちら
 https://qiita.com/nanbuwks/items/1a5f881b6a84a08eacc1
このライブラリでは、私の手持ちのエンコーダーではチャタリングのせいか、そのままではうまくカウントしませんでした。また、複数のエンコーダーの使用は設定できないようでした。
今回は、2個のエンコーダーを使用するため、本家 Arduino のライブラリ
 https://www.arduino.cc/reference/en/libraries/esp32encoder/
を使用してみました。Arduion IDE のバージョンは 1.8.8 です。

準備

ダウンロードして Arduino の Libraries フォルダに格納します。
ロータリエンコーダーを下の回路図のように接続します。ESP32 ボードはカラー LCD の ついている TTGO を使いました。
ESP32-ENC.png

サンプルスケッチ

使用したライブラリの examples にあるサンプルをモディファイしたもので、
表示する方法が分からないのでリスト内の「#」「< >」は全角となってます。コピーして使うときには半角に直してください。
スケッチの動作はポート設定の後、カウンタの初期値を
 encoder1 = 100
 encoder2 = 0
に設定、エンコーダーを回転させ変化があったときにシリアルポートにカウント値を出力します。

#include <ESP32Encoder.h>

 ESP32Encoder encoder1;
 ESP32Encoder encoder2;

void setup(){

    Serial.begin(115200);

    // Enable the weak pull up resistors
    ESP32Encoder::useInternalWeakPullResistors=UP;

    // use pin 2 and 15 for encoder1
    encoder1.attachSingleEdge(2, 15);

    // use pin 13 and 12 for encoder2
    encoder2.attachSingleEdge(13, 12);

    // set starting count value after attaching
    encoder1.setCount(100);

    // clear the encoder's raw count and set the tracked count to zero
    encoder2.clearCount();

    Serial.println("Encoder Start = " + String((int32_t)encoder1.getCount()));

}

void loop(){
// Loop and read the count
  static int pos1 = 0;
  static int pos2 = 0;
  int newPos1 = encoder1.getCount();
  int newPos2 = encoder2.getCount();

  if ((pos1 != newPos1) | (pos2 != newPos2))
  {
   Serial.print("Encoder count = " + String((int32_t)encoder1.getCount())) ;
   Serial.println(" " + String((int32_t)encoder2.getCount()));

   pos1 = newPos1;
   pos2 = newPos2;
  } // if

    delay(100);
    }

エンコーダー入力の pullup について

一般的に秋月などで入手できるロータリーエンコーダーは 入力に10K 程度の抵抗を接続するなどして Pullup が必要になります。このライブラリでは

ESP32Encoder::useInternalWeakPullResistors=UP;

とすることで 内部で Pullup できます。Pulldown したいときは

ESP32Encoder::useInternalWeakPullResistors=DOWN;

となります。

エンコーダー入力モード

このライブラリではエンコーダーの入力モードを
 HalfQuad
 FullQuad
 SignalEdge
の中から選択することができます。GPIO の PIN 割り当てのときに

encoder1.attachSingleEdge(2, 15);

のように設定します。
exapmle では HalfQuad となっており、回転させると 2 個づつカウントし、時折ミスカウントしました。私の手持ちのエンコーダーでは SignalEdge に設定することにより安定してカウントできるようになりました。

ライブラリの設定、関数など

ソースなどを確認したところ以下の設定や関数が利用できるようです。

Encoder Function
   attachHalfQuad(PiNumberA, PinNumberB)
   attachFullQuad(PiNumberA, PinNumberB)
   attachSingleEdge(PiNumberA, PinNumberB)

   Encode.setCount()
   Encode.getCount()
   Encode.getCountRAW()
   Encode.clearCount()
   Encode.pauseCount()
   Encode.resumeCount()

etc

ロータリーエンコーダーの使い道として回転させて数値を入力する、というのの他にメニューを選択するなどがあります。このときにはカウント値ではなく Up/Down の方向だけが欲しいことがあります。このライブラリではそれらの関数は無いようです。

3
0
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
3
0