JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

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

2021-02-06 20:21:20 | ESP32
 約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");
}
}
--------------------------------------------------------------------------------------
 問題なく、動作しました。

 次に、ピン変化割込みを使う方法です。スケッチです。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");
}
}
}
--------------------------------------------------------------------------------------
 これも問題なく動作しました。
 目的、ケースによって使い分けします。
 ライブラリを使うと簡単で良いですね。

最新の画像もっと見る

コメントを投稿