Arduinoを使用したロータリーエンコーダのチュートリアル

ロータリーエンコーダは、回転時の動きと位置を監視できる電子部品です。 ロータリーエンコーダーは、ロータリーエンコーダーが回転するとパルスを生成できる光学センサーを使用します。 通常、機械式またはロボット式モーションモニターとしてのロータリーエンコーダーのアプリケーションは、ディスプレイでのメニュー選択にも使用できます。 ロータリエンコーダには2つの出力があるため、負(CW)と正(CCW)の回転を区別でき、ボタンも1つあります。

ステップ1:ロータリーエンコーダーのパルスフロー

次のロータリーエンコーダによって生成されるパルスフローは、上の図のようになります。

ステップ2:ロータリーエンコーダーのピン配列

説明:

  • GND-> GND
  • +-> + 5V
  • SW->押したときのロータリーエンコーダーのボタン
  • DT->データ
  • CLK->データ2

DTまたはCLKピンのいずれかをArduino Unoの割り込みフットに接続するか、DTとCLKの両方を割り込みピンに接続する必要があります。

ステップ3:回路図

  • GNDàGND Arduino Uno
  • +à+ 5V Arduino Uno
  • SWàPIN 4 Arduino Uno
  • DTàPIN 3 Arduino Uno
  • CLKàPIN2 Arduino Uno

ステップ4:コード

次のチュートリアルでは、割り込みとして使用されるArduino UnoのPIN 2が使用されますが、PIN 3は通常の入力としてのみ使用されます。

#define encoder0PinA 2
#define encoder0PinB 3 #define encoder0Btn 4 int encoder0Pos = 0; void setup(){Serial.begin(9600); pinMode(encoder0PinA、INPUT_PULLUP); pinMode(encoder0PinB、INPUT_PULLUP); pinMode(encoder0Btn、INPUT_PULLUP); attachInterrupt(0、doEncoder、CHANGE); } int valRotary、lastValRotary; void loop(){int btn = digitalRead(encoder0Btn); Serial.print(btn); Serial.print( ""); Serial.print(valRotary); if(valRotary> lastValRotary){Serial.print( "CW"); } if(valRotary {

Serial.print( "CCW"); } lastValRotary = valRotary; Serial.println( ""); delay(250); } void doEncoder(){if(digitalRead(encoder0PinA)== digitalRead(encoder0PinB)){encoder0Pos ++; } else {encoder0Pos--; } valRotary = encoder0Pos / 2.5; }

上記のスケッチの10行目では、ピン2 Arduino Unoの割り込みを有効にします。 「doEncoder」関数では、ロータリーエンコーダーから計算されます。 DTとCLK(Arduino Unoのピン割り込み)の値が同じ場合、「encoder0Pos」変数がインクリメント/追加され、その条件に加えて、「encoder0Pos」変数がデクリメントされます。

ステップ5:説明

ValRotary値は、実行されているステップの数の値です。 ValRotary値は、ロータリーセンサーエンコーダーの読み取り値を2.5で割った値から取得されます。 ロータリーエンコーダーの1ステップが1を超える場合があるため、テストから2.5の値が取得されます。そのため、ステップごとに読み取り遅延を追加することにより、その値を2.5で除算します。

行19〜25には、ロータリーロータリーエンコーダーCWまたはCCWを決定するプログラムがあります。 行19〜25の説明は、現在のロータリーエンコーダの読み取り値が以前のロータリーデータよりも大きく、CWとして表される場合です。 一方、現在の測定値が前の測定値よりも小さい場合は、CCWと表示されます。

ステップ6:出力

1 =ロータリが押されていないときの開始ボタンの値

関連記事