約1年ぶりにESP32を取り出して、実験しました。
昨年、ESP32でロータリーエンコーダーのテストをしました。この時は、ライブラリを使わず、自前のスケッチでテストを行いました。
最近、Arduino Pro Miniで、Ben Buxton氏のライブラリ を使い、大変よく動作することを確認しましたので、ESP32でも氏のライブラリーを使ってテストしてみます。
ライブラリは、GitHubからダウンロードできます。こちらからRotary-master.zipをダウンロードして、Arduino IDEのライブラリに登録します。
GPIO12とGPIO13を使ってテストします。回路図です。
まず、割込みを使わない方法で、GitHubにも掲載されている方法で、テストしてみました。スケッチです。すべての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");
}
}
--------------------------------------------------------------------------------------
#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");
}
}
}
--------------------------------------------------------------------------------------
#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");
}
}
}
--------------------------------------------------------------------------------------
これも問題なく動作しました。
目的、ケースによって使い分けします。
ライブラリを使うと簡単で良いですね。
※コメント投稿者のブログIDはブログ作成者のみに通知されます