ロータリーエンコーダの仕組みとArduinoとのインターフェース

Rotarienkodano Shi Zumitoarduinotonointafesu



ロータリー エンコーダは、エレクトロニクス分野でさまざまな用途に使用される重要な電気機械デバイスです。この記事ではロータリーエンコーダーの種類と仕組み、Arduinoとのインターフェースについて解説します。

ロータリーエンコーダとは

ロータリー エンコーダは、ロータリー ノブの角度位置を感知し、マイクロコントローラーまたは接続されているその他のデバイスに信号を送信するデジタル入力デバイスです。止まることなく360°回転できます。シャフトエンコーダとも呼ばれます。プリンター、オーディオ電子機器、モーター、コントローラーなどに使用されています。









ロータリーエンコーダの種類

ロータリーエンコーダには主に 2 つのタイプがあり、ロータリーエンコーダが生成する出力信号に基づいて決定されます。これらのタイプには次の名前が付けられます。



インクリメンタルロータリエンコーダ

ロータリノブの回転数をパルスとしてカウントするタイプのエンコーダです。ノブを1回転させるとパルスが発生します。パルスごとにカウンタが増分して、シャフトの角度位置を示します。





アブソリュートロータリエンコーダ

このタイプのエンコーダは、シャフト位置ごとに個別のコードを持ち、そのコードを通じて角度を測定するため、シャフトの絶対角度位置を示します。角度位置の出力を与えるためにカウンターは必要ありません。アブソリュートロータリエンコーダへの通電が遮断されても、角度位置のそれぞれの値は保持されます。低コストのエンコーダでもあります。



ロータリーエンコーダの働き

ロータリー エンコーダは、接地された共通ピン C に接続された等間隔の領域を備えたディスクで構成されています。他の 2 本のピン A、B は、ロータリーノブを回転させると C と接触するコンタクトピンです。ピン A または B がグランドに接続されると、信号が生成されます。出力ピンから生成されるこれらの信号は、位相が 90° 異なります。これは、ノブを時計回りに回すとピン A がグランドに接続され、ノブを反時計回りに回すとピン B が最初にグランドに接続されるためです。したがって、ノブの回転方向はこれらの接続によって決まります。

の状態であれば、 B に等しくありません 、ノブが時計回りに回りました。


B の状態が A と等しい場合、ノブは反時計回りに回転しています。

ロータリエンコーダのピン配置

以下の図は、出力ピン A と B、押しボタンとして使用できるロータリー スイッチ、および電源用のピンを示すロータリー エンコーダのピン配置を示しています。

ロータリエンコーダの端子説明

以下に、すべてのロータリー エンコーダ ピンの説明を示します。

出力BまたはCLK

このピンは、ノブまたはロータリーエンコーダーが回転した回数を出力します。ノブを回すたびに、CLK は HIGH と LOW のサイクルを完了します。 1回転としてカウントされます。

アウトAまたはDT

これは、回転方向を決定するロータリー エンコーダーの 2 番目の出力ピンです。 CLK信号より90°遅れます。したがって、その状態が CLK の状態と等しくない場合、回転方向は時計回り、そうでない場合は反時計回りになります。

スイッチ

スイッチピンは押しボタンが押されたかどうかを確認するために使用されます。

VCC

このピンは 5V 電源に接続されています

GND

このピンはグランドに接続されています

ロータリーエンコーダとArduinoのインターフェース

ロータリーエンコーダには 5 つのピンがあります。ロータリーエンコーダのVCCとGNDはArduinoのVCCとGNDに接続されています。残りのピン CLK、DT、SW は Arduino のデジタル入力ピンに接続されます。

ロータリーエンコーダ用のArduinoコード

// ロータリエンコーダ入力
#CLK_PIN 2 を定義します
#DT_PIN 3 を定義します
#define SW_PIN 4
int カウンタ = 0 ;
int currentCLKState;
int lastCLKState;
ストリング電流の方向 = 「」 ;
unsigned long lastButtonPresTime = 0 ;
セットアップを無効にする ( ) {
// エンコーダピンを設定する として 入力
    pinMode ( CLK_PIN、入力 ) ;
    pinMode ( DT_PIN、入力 ) ;
    pinMode ( SW_PIN、INPUT_PULLUP ) ;
// シリアルモニターのセットアップ
シリアルの開始 ( 9600 ) ;
// CLKの初期状態を読み取る
lastCLKState = デジタル読み取り ( CLK_PIN ) ;
}
ボイドループ ( ) {
// CLKの現在の状態を読み取る
currentCLKState = デジタル読み取り ( CLK_PIN ) ;
// もし 最後 CLK の現在の状態が異なります。 それから パルスが発生しました
// のみに反応する 1 二重カウントを避けるための状態変更
もしも ( 現在のCLK状態 = 最後のCLK状態 && currentCLKState == 1 ) {
// DT 状態が CLK 状態と異なる場合、 それから
// エンコーダは反時計回りに回転しているため、デクリメントは
もしも ( デジタル読み取り ( DT_PIN ) = 現在のCLK状態 ) {
カウンター - ;
現在の方向 = 「反時計回り」 ;
} それ以外 {
// エンコーダは時計回りに回転しているため、インクリメントします
カウンタ++;
現在の方向 = 「CW」 ;
}
シリアルプリント ( 「回転方向:」 ) ;
シリアルプリント ( 現在の方向 ) ;
シリアルプリント ( ' | カウンタ値: ' ) ;
Serial.println ( カウンター ) ;
}
// 覚えておいてください 最後 CLK状態
lastCLKState = currentCLKState;
// ボタンの状態を読み取る
int buttonState = デジタル読み取り ( SW_PIN ) ;
// LOW信号を検出するとボタンが押されます
もしも ( ボタンの状態 == LOW ) {
// 50msが経過した場合 最後 LOW パルス、それは、
// ボタンが押されて、放されて、もう一度押されました
もしも ( ミリ ( ) - 最後にボタンを押した時間 > 50 ) {
Serial.println ( 「ボタンが押されました!」 ) ;
}
// 覚えておいてください 最後 ボタン押しイベント 時間
lastButtonPressTime = ミリ秒 ( ) ;
}
// 置く わずかな遅れ ヘルプ 読み取りをデバウンスする
遅れ ( 1 ) ;
}


上記のコードでは、CLK ピンの状態がloop() 関数でチェックされます。以前の状態と等しくない場合は、ロータリーノブが回転したことを示します。ここで、ノブの回転方向を確認するために、現在の CLK の状態と DT の状態を比較します。両方の状態が等しくない場合は、ノブが時計回りに回転したことを示し、カウンターはその値を増分して回転ノブの位置を示します。逆の場合、カウンタはデクリメントされます。

結論

ロータリー エンコーダは、連続的に回転できる高度な位置センサーです。インクリメンタルとアブソリュートの 2 つのタイプがあります。ロータリーエンコーダーは、ノブの回転によって発生するパルスをカウントすることで動作します。日常生活のエレクトロニクスから産業オートメーションまで、さまざまな用途に使用できます。