2022年2月12日ESP32でロータリーエンコーダーを使用して、LEDの明るさ調整をしてみたいと思います。LEDの明るさの制御には、PWMを使用します。動作確認まとめESP32とロータリーエンコーダーの接続ESP32とロータリーエンコーダー、LED、LCDモジュールを接続していきます。準備するもの今回使用するものは、以下になります。小型ボリューム用つまみLED抵抗(220Ω)ロータリーエンコーダー、DIP化基板、小型ボリューム用つまみは、秋月電子通商様から購入しました。ロータリーエンコーダーをDIP化基板に半田付けします。部品を以下のように接続していきます。プログラム作成ロータリーエンコーダーを使用して、LEDの明るさを調整するプログラムを作成していきます。ロータリーエンコーダーのライブラリの追加ロータリーエンコーダーを使用するためのライブラリをインストールします。IDEを起動して、メニューの「ツール」→「ライブラリを管理」を選択します。表示した「ライブラリマネージャ」のテキストボックスに「rotaryencoder」を入力します。Hertel」を探してインストールします。ロータリーエンコーダーとPWM制御ライブラリのインストールが完了したらプログラムを作成していきます。処理概要は、以下になります。ロータリーエンコーダーを回して、LEDの明るさ調整を行う。ロータリーエンコーダーを正転させるとLEDが明るくなる。ロータリーエンコーダーを逆回転させるとLEDが暗くなる。LEDの明るさ調整は、PWM制御で行う。ロータリーエンコーダーの回転方向を表示する。encoderProc();}プログラムについて簡単に説明していきます。1~2行目で読み込んでいるヘッダファイルは、LCDモジュール(液晶)を使用するためのものです。3行目で読み込んでいる「RotaryEncoder.h」が、ロータリーエンコーダーを使用するためのヘッダファイルになります。15~25行目が、ロータリーエンコーダーに関する設定になります。RotaryEncoder::LatchMode::TWO03);15~16行目で、ロータリーエンコーダーからの入力ピンを設定しています。18~19行目は、PWM制御を255段階で行うため、最小値に0、最大値に255を設定しています。25行目で、ロータリーエンコーダークラスの変数を定義しています。第1、第2引数にロータリーエンコーダーからの入力ピン番号を指定します。第3引数は、ラッチモードとなっていましたが、違いがわからないためサンプルスケッチと同様の設定にしておきました。次に初期化処理「setup()」関数の説明になります。Serial.println("Start");}77~79行目で、LEDのPWM制御の設定を行っています。77行目で、LEDピン(5番)を出力用に設定しています。78行目で、PWMの制御設定を行っています。第1引数で利用するPWMのチャンネル、第2引数でPWMの基本周波数、第3引数でデューティー比を表すビット数を設定しています。79行目で、LEDピン(5番)にPWMのチャンネル0を割り当てています。チャンネルは、0~15を選択できます。84~86行目は、LCDモジュールの初期設定になります。88行目で、ロータリーエンコーダーの開始値を設定しています。次に、ロータリーエンコーダーの制御とLEDの明るさを設定している「encoderProc()」関数の処理について説明いたします。}}「encoderProc()」関数は、「loop()」関数で呼び出されている唯一の関数になります。29行目の「encoder.tick()」関数を呼び出すことで、ロータリーエンコーダーからの入力値A、Bを取得して、内部で保持する値の増減を行っているようです。正回転をすると「+1」、逆回転をすると「-1」になります。31行目で、ロータリーエンコーダークラス内で保持している現在値を取得します。33~40行目で、最小値~最大値の範囲内に値を収めるように制御しています。取得値が最小値より小さい、または、最大値より大きい場合は、「encoder.setPosition()」でロータリーエンコーダークラス内で保持している値を範囲内に収まるように変更しています。45行目で、LEDの明るさ調整のためのPWM出力設定を行っています。78行目で、デューティー比を表すビット数を8に設定しているため、0~255の値が設定できます。以上がプログラムの簡単な説明になります。実際に動作を確認してみます。つまみを左に回すと正回転、右に回すと逆回転になります。左に回していくと、LEDが点灯してだんだんと明るくなっていきます。右に回していくとだんだんと暗くなっていきます。シリアルモニタやLCDモジュールでも値が確認できています。左に回すと「1」で正回転、右に回すと「-1」で逆回転が確認できました。まとめロータリーエンコーダーを使用して、LEDの明るさ調整を行ってみました。最初にロータリーエンコーダーの制御を自分で作ってみたのですが、取得値が飛び飛びになってしまい、なかなかうまくいきませんでした。ライブラリを使用して実装したところ、正常に値が取得できていて、自分の力不足を痛感しているところです。再度どこかのタイミングで、ロータリーエンコーダーの制御プログラムに挑戦していきたいと思います。