Arduino
ESP32
ロータリーエンコーダ
0
どのような問題がありますか?

この記事は最終更新日から1年以上が経過しています。

Organization

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

はじめに

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 の方向だけが欲しいことがあります。このライブラリではそれらの関数は無いようです。

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザー登録ログイン
pisamatsu
宇宙開発が趣味の年金生活者です。小さなアンテナで衛星を追いかけたり、通信をしたり、STM-32・ESP32+Arduino でいろいろ作ってます。Pythonを勉強中。
rymansat
「2機目の人工衛星が2021年に宇宙へ飛び立ちます!」 ●普段は宇宙開発に関わっていないサラリーマンが身近で誰でもできる宇宙開発を実現させることがリーマンサット・プロジェクト(rsp.)の目的です。●キューブサットの開発をはじめ、宇宙を軸として様々なコミュニティやクリエイターとコラボレーションし、民間宇宙開発に関するネットワークを強化、拡張することを目指して活動しています。

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
0
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー