- ロータリーエンコーダとそのタイプ
- KY-040ロータリーエンコーダのピン配列と説明
- ロータリーエンコーダーのしくみ
- 必要なコンポーネント
- PIC16F877Aロータリーエンコーダインターフェース回路図
- コードの説明
ロータリエンコーダは、 システムと対話するユーザを支援入力装置です。ラジオポテンショメータのように見えますが、一連のパルスを出力するため、アプリケーションがユニークになります。エンコーダーのノブを回転させると、小さなステップの形で回転し、ステッピング/サーボモーターの制御、メニューのシーケンスのナビゲート、数値の値の増減などに使用できます。
この記事では、さまざまなタイプのロータリーエンコーダーとその仕組みについて学習 します。また 、PICマイクロコントローラーPIC16F877Aとインターフェースし、エンコーダーを回転させて整数の値を制御し、その値を16 * 2LCD画面に表示します。このチュートリアルの最後に、プロジェクトにロータリーエンコーダーを使用することに慣れます。それでは始めましょう…
ロータリーエンコーダとそのタイプ
シャフトエンコーダと呼ばれることの多いロータリーエンコーダ。これは電気機械変換器です。つまり、機械的な動きを電子パルスに変換します。つまり、角位置、動き、またはシャフト位置をデジタル信号またはアナログ信号に変換します。これは、回転すると段階的に移動し、各段階で事前定義された幅を持つ一連のパルス列を生成するノブで構成されています。
市場には多くの種類のロータリーエンコーダがあり、設計者は用途に応じて1つを選択できます。最も一般的なタイプを以下に示します
- インクリメンタルエンコーダ
- アブソリュートエンコーダ
- 磁気エンコーダ
- 光学式エンコーダ
- レーザーエンコーダー
これらのエンコーダーは出力信号とセンシング技術に基づいて分類され、インクリメンタルエンコーダーとアブソリュートエンコーダーは出力信号に基づいて分類され、磁気、光学、レーザーエンコーダーはセンシング技術に基づいて分類されます。 エンコーダは、ここで使用するインクリメンタル型エンコーダです。
アブソリュートエンコーダは、電源を切った後も位置情報を保存しており、再度電源を入れると位置情報が得られます。
もう1つの基本タイプであるインクリメンタルエンコーダは、エンコーダがその位置を変更したときにデータを提供します。位置情報を保存できませんでした。
KY-040ロータリーエンコーダのピン配列と説明
KY-040インクリメンタルタイプのロータリエンコーダのピン配列を以下に示します。このプロジェクトでは、このロータリーエンコーダーをマイクロチップの人気のあるマイクロコントローラーPIC16F877Aとインターフェースします。
最初の2つのピン(GroundとVcc)は、エンコーダに電力を供給するために使用され、通常は+ 5V電源が使用されます。エンコーダーには、ノブを時計回りと反時計回りに回転させるほかに、内側のノブを押すことで押すことができるスイッチ(アクティブロー)もあります。このスイッチからの信号は、ピン3(SW)を介して取得されます。最後に、2つの出力ピン(DTとCLK)があり、以下ですでに説明したように波形を生成します。以前、このロータリーエンコーダーをArduinoとインターフェースさせました。
ロータリーエンコーダーのしくみ
出力は、シャフトとのGNDおよびVCCとの接続を提供する内部銅パッドに完全に依存します。
ロータリーエンコーダには2つの部分があります。シャフトに接続され、シャフトの回転に応じて時計回りまたは反時計回りに回転するシャフトホイール、および電気接続が行われるベース。ベースには、シャフトホイールが回転するとベースポイントを接続し、DTポートとCLKポートの両方に方形波を提供するように、DTまたはCLKに接続されたポートまたはポイントがあります。
シャフトが回転したときのような出力になります-
2つのポートは方形波を提供しますが、タイミングにわずかな違いがあります。このため、出力を1と0として受け入れる場合、0 0、1 0、1 1、0 1の4つの状態しか存在できません。バイナリ出力のシーケンスによって、時計回りまたは反時計回りの回転が決まります。たとえば、ロータリーエンコーダがアイドル状態で1 0を提供し、その後1 1を提供する場合、エンコーダは時計回りの方向に1ステップ位置を変更しますが、アイドル10の後に00を提供する場合はシャフトが反時計回りに1ステップで位置を変更していることを意味します。
必要なコンポーネント
ロータリーエンコーダーをPICマイクロコントローラーとインターフェースするために必要なものを特定する時が来ました。
- PIC16F877A
- 4.7k抵抗
- 1k抵抗
- 10kポット
- 33pFセラミックディスクコンデンサ–2個
- 20Mhzクリスタル
- 16x2ディスプレイ
- ロータリーエンコーダー
- 5Vアダプター。
- ブレッドボード
- フックアップワイヤー。
PIC16F877Aロータリーエンコーダインターフェース回路図
以下は、回路図に従ってコンポーネントを接続した後の最終セットアップの写真です。
ポテンショメータを使用する代わりに、LCDのコントラストに単一の1K抵抗を使用しました。また、最後にある完全な作業ビデオを確認してください。
コードの説明
完全なPICコードは、このプロジェクトの最後にデモビデオとともに提供されます。ここでは、コードのいくつかの重要な部分について説明します。PICマイクロコントローラーを初めて使用する場合は、最初からPICチュートリアルに従ってください。
前に説明したように、出力を確認し、DTとCLKの両方のバイナリ出力を区別する必要があるため、操作用に if-else パーツを作成しました。
if(Encoder_CLK!= position){ if(Encoder_DT!= position){ // lcd_com(0x01); カウンター++; // lcd lcd_com(0xC0);に出力 されるカウンターを増やします。lcd_puts( ""); lcd_com(0xC0); lcd_bcd(1、counter); } else { // lcd_com(0x01); lcd_com(0xC0); カウンター -; //カウンターを 減らしますlcd_puts( ""); lcd_com(0xC0); lcd_bcd(1、counter); // lcd_puts( "Left"); } }
また、各ステップの位置を保存する必要があります。これを行うために、現在の位置を格納する変数 「position」 を使用しました。
位置= Encoder_CLK; //エンコーダのクロック位置を変数に保存します。0または1にすることができます。
これ以外に、LCDのスイッチが押されたことを通知するオプションが用意されています。
if(Encoder_SW == 0){ sw_delayms(20); //遅延をデバウンス if(Encoder_SW == 0){ // lcd_com(1); // lcd_com(0xC0); lcd_puts( "スイッチが押されました"); // itoa(counter、value、10); // lcd_puts(value);
system_initの 機能は、ピンI / O動作を初期化するLCDロータリーエンコーダ位置を格納するために使用されます。
void system_init (){ TRISB = 0x00; //出力としてのポートB、このポートはLCD TRISDbits.TRISD2 = 1に 使用されます。TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init(); //これにより、LCD 位置 が初期化されます= Encoder_CLK; // whileループが開始する前に、システム初期化でCLK位置がソートされます。}
LCD関数は、lcd_puts()、lcd_cmd()が宣言されているlcd.cおよびlcd.hライブラリに記述されています。
変数宣言、構成ビット、およびその他のコードスニペットについては、以下の完全なコードを見つけてください。