ロータリーエンコーダーの仕組みとArduinoでの使用方法
このチュートリアルでは、ロータリーエンコーダーの仕組みとArduinoでの使用方法を学びます。次のビデオを見るか、以下のチュートリアルを読むことができます。
ロータリーエンコーダは、回転軸の角度位置を決定するために使用される位置センサーの一種です。回転運動に応じて、アナログまたはデジタルの電気信号を生成します。
出力信号またはセンシング技術のいずれかによって分類されるロータリーエンコーダには多くの異なるタイプがあります。このチュートリアルで使用する特定のロータリーエンコーダーはインクリメンタルロータリーエンコーダーであり、回転を測定するための最も簡単な位置センサーです。
このロータリーエンコーダは、直交エンコーダまたは相対ロータリーエンコーダとも呼ばれ、その出力は一連の方形波パルスです。
エンコーダーを詳しく見て、その動作原理を見てみましょう。方形波パルスの生成方法は次のとおりです。エンコーダには、以下に示すように、共通のピンCと他の2つの別個の接触ピンAおよびBに接続された等間隔の接触ゾーンを持つディスクがあります。
ディスクが段階的に回転し始めると、ピンAとBが共通のピンと接触し始め、それに応じて2つの方形波出力信号が生成されます。
信号のパルスを数えるだけで、2つの出力のいずれかを使用して回転位置を決定できます。ただし、回転方向も決定する場合は、両方の信号を同時に考慮する必要があります。
2つの出力信号が互いに90度位相がずれて変位していることがわかります。エンコーダが時計回りに回転している場合、出力Aは出力Bよりも先になります。
したがって、信号がHighからLowまたはLowからHighに変化するたびにステップをカウントすると、その時点で2つの出力信号の値が反対になっていることがわかります。逆に、エンコーダが反時計回りに回転している場合、出力信号の値は等しくなります。したがって、これを考慮すると、エンコーダの位置と回転方向を読み取るようにコントローラを簡単にプログラムできます。
Arduinoを使って実際の例を作ってみましょう。この例で使用する特定のモジュールは、ブレークアウトボード上にあり、5つのピンがあります。最初のピンは出力A、2番目のピンは出力B、3番目のピンはボタンピン、そしてもちろん他の2つのピンはVCCピンとGNDピンです。
出力ピンはArduinoボードの任意のデジタルピンに接続できます。
このArduinoチュートリアルに必要なコンポーネントは、以下のリンクから入手できます。
Arduinoコードは次のとおりです:
コードの説明: したがって、最初に、エンコーダーが接続されているピンを定義し、プログラムに必要ないくつかの変数を定義する必要があります。セットアップセクションでは、2つのピンを入力として定義し、シリアルモニターに結果を出力するためのシリアル通信を開始し、出力Aの初期値を読み取り、その値を変数aLastStateに入力する必要があります。
次に、ループセクションで出力Aを再度読み取りますが、ここで値をaState変数に入れます。したがって、エンコーダーを回転させてパルスを生成すると、これら2つの値は異なり、最初の「if」ステートメントが真になります。その直後に、2番目の「if」ステートメントを使用して回転方向を決定します。出力Bの状態が出力Aの状態と異なる場合、カウンターは1つ増加し、そうでない場合は減少します。最後に、シリアルモニターに結果を出力した後、aLastState変数をaState変数で更新する必要があります。
この例に必要なのはこれだけです。コードをアップロードする場合は、シリアルモニターを起動し、エンコーダーの回転を開始すると、シリアルモニターで値の取得が開始されます。私が持っている特定のモジュールは、フルサイクルごとに30カウントします。
詳細:超音波センサーHC-SR04およびArduino –完全ガイド
この基本的な例に加えて、ロータリーエンコーダーを使用してステッピングモーターの位置を制御するもう1つの例を作成しました。
この例のソースコードは次のとおりです。
以下のコメントセクションでお気軽に質問してください。
/* Arduino Rotary Encoder Tutorial
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
void setup() {
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
Serial.begin (9600);
// Reads the initial state of the outputA
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA); // Reads the "current" state of the outputA
// If the previous and the current state of the outputA are different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; // Updates the previous state of the outputA with the current state
}
Code language: Arduino (arduino)例2–ロータリーエンコーダーを使用したステッピングモーターの制御
/* Stepper Motor using a Rotary Encoder
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
// defines pins numbers
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11
int counter = 0;
int angle = 0;
int aState;
int aLastState;
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
aLastState = digitalRead(outputA);
lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display }
}
void loop() {
aState = digitalRead(outputA);
if (aState != aLastState){
if (digitalRead(outputB) != aState) {
counter ++;
angle ++;
rotateCW();
}
else {
counter--;
angle --;
rotateCCW();
}
if (counter >=30 ) {
counter =0;
}
lcd.clear();
lcd.print("Position: ");
lcd.print(int(angle*(-1.8)));
lcd.print("deg");
lcd.setCursor(0,0);
}
aLastState = aState;
}
void rotateCW() {
digitalWrite(dirPin,LOW);
digitalWrite(stepPin,HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin,LOW);
delayMicroseconds(2000);
}
void rotateCCW() {
digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin,LOW);
delayMicroseconds(2000);
}
Code language: Arduino (arduino)
製造プロセス