ESP32 ロータリーエンコーダーのテストその2

JH7UBC 2021.2.7


以前、ESP32でロータリーエンコーダーのテストをしました。この時は、ライブラリを使わず、自前のスケッチでテストを行いました。
最近、Arduino Pro Miniで、Ben Buxton氏のライブラリ を使い、大変よく動作することを確認しましたので、ESP32でも氏のライブラリーを使ってテストしてみます。
ライブラリは、GitHubからダウンロードできます。こちらからRotary-master.zipをダウンロードして、Arduino IDEのライブラリに登録します。 
GPIO12とGPIO13を使ってテストします。回路図です。

まず、割込みを使わない方法で、GutGubにも掲載されている方法で、テストしてみました。
スケッチです。すべてのGPIOで利用可能で、プルアップは、ライブラリで行いますので、プルアップ抵抗は必要ありません。
しかし、GPIO34,GPIO35,GPIO36,GPIO39は、入力専用で、プルアップ抵抗が必要です。
ロータリーエンコーダーを時計回り(右回り)に回転させるとシリアルモニタに「Right」と反時計回り(左回り)に回転させると「Left」と表示されます。
#include<Rotary.h>
#define ENC_A 12
#define ENC_B 13

Rotary r = Rotary(ENC_A,ENC_B);

void setup() {
Serial.begin(9600);
r.begin();
}

void loop() {
unsigned char result = r.process();
if (result) {
Serial.println(result == DIR_CW ? "Right" : "Left");
}
}

問題なく、動作しました。

次に、ピン変化割込みを使う方法です。スケッチです。
ESP32では、全てのGPIOで割込みが使用可能でので、Arduinoよりピン割り当ての自由度が大きくなります。

#include<Rotary.h>
#define ENC_A 12
#define ENC_B 13

Rotary r = Rotary(ENC_A,ENC_B);

void setup() {
r.begin();
Serial.begin(9600);
attachInterrupt(ENC_A,rotary_encoder,CHANGE);
attachInterrupt(ENC_B,rotary_encoder,CHANGE);
}

void loop() {
}

void rotary_encoder(){
unsigned char result = r.process();
if(result){
if(result == DIR_CW){
Serial.println("Right");
}else{
Serial.println("Left");
}
}
}
これも問題なく動作しました。
目的、ケースによって使い分けします。
ライブラリを使うと簡単で良いですね。

inserted by FC2 system