工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ロータリーエンコーダーの仕組みとArduinoでの使用方法

このチュートリアルでは、ロータリーエンコーダーの仕組みとArduinoでの使用方法を学びます。次のビデオを見るか、以下のチュートリアルを読むことができます。

概要

ロータリーエンコーダは、回転軸の角度位置を決定するために使用される位置センサーの一種です。回転運動に応じて、アナログまたはデジタルの電気信号を生成します。

出力信号またはセンシング技術のいずれかによって分類されるロータリーエンコーダには多くの異なるタイプがあります。このチュートリアルで使用する特定のロータリーエンコーダーはインクリメンタルロータリーエンコーダーであり、回転を測定するための最も簡単な位置センサーです。

このロータリーエンコーダは、直交エンコーダまたは相対ロータリーエンコーダとも呼ばれ、その出力は一連の方形波パルスです。

ロータリーエンコーダーの仕組み

エンコーダーを詳しく見て、その動作原理を見てみましょう。方形波パルスの生成方法は次のとおりです。エンコーダには、以下に示すように、共通のピンCと他の2つの別個の接触ピンAおよびBに接続された等間隔の接触ゾーンを持つディスクがあります。

ディスクが段階的に回転し始めると、ピンAとBが共通のピンと接触し始め、それに応じて2つの方形波出力信号が生成されます。

信号のパルスを数えるだけで、2つの出力のいずれかを使用して回転位置を決定できます。ただし、回転方向も決定する場合は、両方の信号を同時に考慮する必要があります。

2つの出力信号が互いに90度位相がずれて変位していることがわかります。エンコーダが時計回りに回転している場合、出力Aは出力Bよりも先になります。

したがって、信号がHighからLowまたはLowからHighに変化するたびにステップをカウントすると、その時点で2つの出力信号の値が反対になっていることがわかります。逆に、エンコーダが反時計回りに回転している場合、出力信号の値は等しくなります。したがって、これを考慮すると、エンコーダの位置と回転方向を読み取るようにコントローラを簡単にプログラムできます。

ロータリーエンコーダーArduinoの例

Arduinoを使って実際の例を作ってみましょう。この例で使用する特定のモジュールは、ブレークアウトボード上にあり、5つのピンがあります。最初のピンは出力A、2番目のピンは出力B、3番目のピンはボタンピン、そしてもちろん他の2つのピンはVCCピンとGNDピンです。

出力ピンはArduinoボードの任意のデジタルピンに接続できます。

このArduinoチュートリアルに必要なコンポーネントは、以下のリンクから入手できます。

  • ロータリーエンコーダモジュール………………。
  • Arduinoボード……………………………
  • ブレッドボードとジャンパー線………
ソースコード

Arduinoコードは次のとおりです:

/*     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つのピンを入力として定義し、シリアルモニターに結果を出力するためのシリアル通信を開始し、出力Aの初期値を読み取り、その値を変数aLastStateに入力する必要があります。

>

次に、ループセクションで出力Aを再度読み取りますが、ここで値をaState変数に入れます。したがって、エンコーダーを回転させてパルスを生成すると、これら2つの値は異なり、最初の「if」ステートメントが真になります。その直後に、2番目の「if」ステートメントを使用して回転方向を決定します。出力Bの状態が出力Aの状態と異なる場合、カウンターは1つ増加し、そうでない場合は減少します。最後に、シリアルモニターに結果を出力した後、aLastState変数をaState変数で更新する必要があります。

この例に必要なのはこれだけです。コードをアップロードする場合は、シリアルモニターを起動し、エンコーダーの回転を開始すると、シリアルモニターで値の取得が開始されます。私が持っている特定のモジュールは、フルサイクルごとに30カウントします。

詳細:超音波センサーHC-SR04およびArduino –完全ガイド

例2–ロータリーエンコーダーを使用したステッピングモーターの制御

この基本的な例に加えて、ロータリーエンコーダーを使用してステッピングモーターの位置を制御するもう1つの例を作成しました。

この例のソースコードは次のとおりです。

/*     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)

以下のコメントセクションでお気軽に質問してください。


製造プロセス

  1. C# キューと例:C# キューとは何ですか? 使用方法は?
  2. ArduinoとMPU6050によるサーボモーターの制御
  3. ロータリーエンコーダー付きDIYシンプル測定ホイール
  4. u-blox LEA-6H 02GPSモジュールとArduinoおよびPython
  5. DHT11でBlynkの温度と湿度を読み取る方法
  6. サーミスタの使い方は簡単ですか?!
  7. Arduinoで音楽を作る方法
  8. ArduinoでNMEA-0183を使用する方法
  9. ArduinoでModbusを使用する方法
  10. ArduinoとBitVoicerサーバーによる音声認識
  11. ArduinoとPythonを搭載したAIアシスタントロボット