はじめに
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 を使いました。
サンプルスケッチ
使用したライブラリの 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 の方向だけが欲しいことがあります。このライブラリではそれらの関数は無いようです。