- 必要な材料
- ロータリーエンコーダはどのように機能しますか?
- ロータリーエンコーダの種類
- KY-040ロータリーエンコーダのピン配列と説明
- Arduinoロータリーエンコーダ回路図
- ロータリーエンコーダー用のArduinoのプログラミング
- Arduinoでのロータリーエンコーダの動作
ロータリエンコーダは、システムと対話するユーザを支援入力装置です。ラジオポテンショメータのように見えますが、一連のパルスを出力するため、アプリケーションがユニークになります。エンコーダーのノブを回転させると、小さなステップの形で回転し、ステッピング/サーボモーターの制御、一連のメニューのナビゲート、数値の増減などに使用できます。
この記事では、さまざまなタイプのロータリーエンコーダーとその機能について学習します。また、Arduinoとインターフェイスし、エンコーダーを回転させて整数の値を制御し、その値を16 * 2LCD画面に表示します。このチュートリアルの最後に、プロジェクトにロータリーエンコーダーを使用することに慣れます。それでは始めましょう…
必要な材料
- ロータリーエンコーダー(KY-040)
- Arduino UNO
- 16 * 2英数字LCD
- ポテンショメータ10k
- ブレッドボード
- 接続線
ロータリーエンコーダはどのように機能しますか?
ロータリーエンコーダは電気機械変換器であり、機械的な動きを電子パルスに変換します。これは、回転すると段階的に移動し、各段階で事前定義された幅を持つ一連のパルス列を生成するノブで構成されています。エンコーダにはそれぞれ独自の動作メカニズムを持つ多くのタイプがあります。タイプについては後で学習しますが、チュートリアルで使用しているため、ここではKY040インクリメンタルエンコーダのみに集中します。
エンコーダの内部機械構造を以下に示します。これは基本的に、この円形ディスクの上に導電性パッド(銅色)が配置された円形ディスク(灰色)で構成されています。これらの導電性パッドは、以下に示すように等距離に配置されます。出力ピンは、ノブを回転させたときに導電性パッドが出力ピンと接触するように、この円形ディスクの上部に固定されています。次の図に示すように、ここには出力Aと出力Bの2つの出力ピンがあります。
出力ピンAと出力Bによって生成された出力波形は、それぞれ青色と緑色で表示されます。導電性パッドがピンの真下にある場合はハイになり、時間どおりになり、導電性パッドが離れるとピンがローになり、上記の波形のオフ時間が発生します。ここで、パルス数を数えると、エンコーダーが移動したステップ数を判別できます。
ここで、ノブを回している間に取られたステップ数を数えるのに1つで十分なのに、なぜ2つのパルス信号が必要なのかという疑問が生じる可能性があります。これは、ノブがどの方向に回転したかを特定する必要があるためです。2つのパルスを見ると、両方とも90°位相がずれていることがわかります。したがって、ノブを時計回りに回すと、出力Aが最初にハイになり、ノブを反時計回りに回すと、出力Bが最初にハイになります。
ロータリーエンコーダの種類
市場には多くの種類のロータリーエンコーダがあり、設計者は用途に応じて1つを選択できます。最も一般的なタイプを以下に示します
- インクリメンタルエンコーダ
- アブソリュートエンコーダ
- 磁気エンコーダ
- 光学式エンコーダ
- レーザーエンコーダー
これらのエンコーダーは出力信号とセンシング技術に基づいて分類され、インクリメンタルエンコーダーとアブソリュートエンコーダーは出力信号に基づいて分類され、磁気、光学、レーザーエンコーダーはセンシング技術に基づいて分類されます。エンコーダは、ここで使用するインクリメンタル型エンコーダです。
KY-040ロータリーエンコーダのピン配列と説明
KY-040インクリメンタル型ロータリエンコーダのピン配列を以下に示します。
最初の2つのピン(GroundとVcc)は、エンコーダに電力を供給するために使用され、通常は+ 5V電源が使用されます。エンコーダーには、ノブを時計回りと反時計回りに回転させるほかに、内側のノブを押すことで押すことができるスイッチ(アクティブロー)もあります。このスイッチからの信号は、ピン3(スイッチ)を介して取得されます。最後に、すでに上で説明したように波形を生成する2つの出力ピンがあります。それでは、Arduinoとのインターフェース方法を学びましょう。
Arduinoロータリーエンコーダ回路図
ロータリーエンコーダとArduinoのインターフェースの完全な回路図を下の図に示します。
ロータリーエンコーダには、上記のラベルに示されている順序で5つのピンがあります。最初の2つのピンはGroundとVccで、ArduinoのGroundと+ 5Vピンに接続されています。エンコーダのスイッチはデジタルピンD10に接続されており、1kの抵抗を介してHighにプルアップされています。 2つの出力ピンはそれぞれD9とD8に接続されています。
ロータリーエンコーダーを回転させることによって増減する変数の値を表示するには、表示モジュールが必要です。ここで使用されているものは、一般的に入手可能な16 * 2英数字LCDディスプレイです。4ビットモードで動作するようにディスプレイを接続し、Arduinoの+ 5Vピンを使用して電力を供給しました。ポテンショメータは、LCDディスプレイのコントラストを調整するために使用されます。LCDディスプレイとArduinoのインターフェースについて詳しく知りたい場合は、リンクをたどってください。完全な回路はブレッドボードの上に構築できます。すべての接続が完了すると、次のようになります。
ロータリーエンコーダー用のArduinoのプログラミング
ロータリーエンコーダーの動作原理を理解していれば、ロータリーエンコーダーとインターフェースするためのArduinoボードをプログラムするのはかなり簡単で簡単です。パルス数を読み取ってエンコーダーが何回転したかを判断し、最初にどのパルスがハイになったのかを確認して、エンコーダーがどの方向に回転したかを確認するだけです。このチュートリアルでは、LCDの最初の行にインクリメントまたはデクリメントされている数値を表示し、2番目の行にエンコーダーの方向を表示します。同じことを行うための完全なプログラムは、このページの下部にあるデモンストレーションビデオで見つけることができ、ライブラリは必要ありません。それでは、プログラムを小さなチャンクに分割して、動作を理解しましょう。
LCDディスプレイを使用したため、ArduinoIDEにデフォルトで存在する液晶ライブラリを含めます。次に、LCDをArduinoに接続するためのピンを定義します。最後に、これらのピンのLCDディスプレイを初期化します。
#include
次に セットアップ 機能内で、LCD画面に紹介メッセージを表示し、そのメッセージがユーザーに読めるように2秒間待ちます。これは、LCDが正しく機能していることを確認するためです。
lcd.print( "ロータリーエンコーダー"); //イントロメッセージライン 1lcd.setCursor(0、1); lcd.print( "Arduinoを使用"); //イントロメッセージライン 2delay(2000); lcd.clear();
ロータリーエンコーダには、Arduinoの入力ピンとなる3つの出力ピンがあります。これらの3つのピンは、それぞれスイッチ、出力A、出力Bです。これらは、 以下に示すように、 pinMode 関数を使用して入力として宣言されます。
//ピンモード宣言 pinMode(Encoder_OuputA、INPUT); pinMode(Encoder_OuputB、INPUT); pinMode(Encoder_Switch、INPUT);
ボイドセットアップ 機能の内部では、出力Aピンのステータスを読み取り、ピンの最後のステータスを確認します。次に、この情報を使用して新しい値と比較し、どのピン(出力Aまたは出力B)がハイになったのかを確認します。
previous_Output = digitalRead(Encoder_OuputA); //出力Aの初期値を読み取ります
最後に、メイン ループ 関数内で、出力Aと出力Bの値を前の出力と比較して、どちらが最初にハイになるかを確認する必要があります。これは、以下に示すように、AとBの現在の出力の値を前の出力と比較するだけで実行できます。
if(digitalRead(Encoder_OuputA)!= previous_Output) { if(digitalRead(Encoder_OuputB)!= previous_Output) { Encoder_Count ++; lcd.clear(); lcd.print(Encoder_Count); lcd.setCursor(0、1); lcd.print( "時計回り"); }
上記のコードでは、出力Bが前の出力から変更された場合に、2番目の if 条件が実行されます。その場合、エンコーダー変数の値が増分され、LCDにエンコーダーが 時計回りに 回転していることが表示されます。同様に、 if 条件が失敗した 場合 、後続の else 条件で変数をデクリメントし、エンコーダーが 反時計回りに 回転していることを表示します。そのためのコードを以下に示します。
else { Encoder_Count--; lcd.clear(); lcd.print(Encoder_Count); lcd.setCursor(0、1); lcd.print( "反時計回り"); } }
最後に、メイン ループの 最後に、前の出力値を現在の出力値で更新して、同じロジックでループを繰り返すことができるようにする必要があります。次のコードは同じことをします
previous_Output = digitalRead(Encoder_OuputA);
もう1つのオプションは、エンコーダーのスイッチが押されているかどうかを確認することです。これは、ロータリーコーダーのスイッチピンをチェックすることで監視できます。このピンはアクティブローピンです。つまり、ボタンを押すとローになります。押されていない場合、ピンはハイのままです。また、プルアップ抵抗を使用して、スイッチが押されていないときにハイのままであることを確認し、浮動小数点状態を回避します。
if(digitalRead(Encoder_Switch)== 0){lcd.clear(); lcd.setCursor(0、1); lcd.print( "スイッチが押されました"); }
Arduinoでのロータリーエンコーダの動作
ハードウェアとコードの準備ができたら、コードをArduinoボードにアップロードし、Arduinoボードの電源を入れます。USBケーブルを介して電力を供給するか、12Vアダプターを使用できます。電源を入れると、LCDにイントロメッセージが表示され、空白になります。次に、ロータリーエンコーダーを回転させると、回転する方向に基づいて値が増加または減少し始めるのがわかります。2行目は、エンコーダーが時計回りまたは反時計回りのどちらの方向に回転しているかを示します。下の写真は同じことを示しています
また、ボタンが押されると、2行目にボタンが押されたことが表示されます。完全な動作は、以下のビデオで見つけることができます。これは、エンコーダーをArduinoとインターフェースし、期待どおりに機能しているかどうかを確認するためのサンプルプログラムです。ここに着くと、プロジェクトやプログラムにエンコーダーを使用できるようになります。
チュートリアルを理解し、想定どおりに機能したことを願っています。問題がある場合は、コメントセクションまたはフォーラムを使用して技術的なヘルプを参照してください。