산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

로터리 엔코더의 작동 원리 및 Arduino와 함께 사용하는 방법

<메인 클래스="사이트 메인" id="메인">

이 튜토리얼에서는 로터리 엔코더의 작동 방식과 Arduino와 함께 사용하는 방법을 배웁니다. 다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다.

개요

로터리 엔코더는 회전축의 각도 위치를 결정하는 데 사용되는 일종의 위치 센서입니다. 회전 운동에 따라 아날로그 또는 디지털 전기 신호를 생성합니다.

<그림 클래스="aligncenter">

출력 신호 또는 감지 기술로 분류되는 다양한 유형의 로터리 인코더가 있습니다. 이 튜토리얼에서 사용할 특정 로터리 인코더는 증분형 로터리 인코더이며 회전을 측정하는 가장 간단한 위치 센서입니다.

이 로터리 엔코더는 구적 엔코더 또는 상대 로터리 엔코더라고도 하며 출력은 일련의 구형파 펄스입니다.

로타리 인코더의 작동 원리

인코더를 자세히 살펴보고 작동 원리를 살펴보겠습니다. 구형파 펄스가 생성되는 방법은 다음과 같습니다. 인코더에는 아래 그림과 같이 공통 핀 C와 두 개의 다른 개별 접촉 핀 A 및 B에 연결된 균일한 간격의 접촉 영역이 있는 디스크가 있습니다.

디스크가 단계적으로 회전하기 시작하면 핀 A와 B가 공통 핀과 접촉하기 시작하고 그에 따라 두 개의 구형파 출력 신호가 생성됩니다.

신호의 펄스를 계산하기만 하면 두 출력 중 하나를 회전 위치를 결정하는 데 사용할 수 있습니다. 그러나 회전 방향도 결정하려면 두 신호를 동시에 고려해야 합니다.

두 개의 출력 신호가 서로 90도 위상차로 변위되었음을 알 수 있습니다. 인코더가 시계 방향으로 회전하면 출력 A가 출력 B보다 앞서게 됩니다.

따라서 신호가 High에서 Low로 또는 Low에서 High로 변경될 때마다 단계를 계산하면 두 개의 출력 신호가 반대 값을 갖는 것을 알 수 있습니다. 반대로 인코더가 시계 반대 방향으로 회전하는 경우 출력 신호는 동일한 값을 갖습니다. 따라서 이를 고려하면 인코더 위치와 회전 방향을 읽도록 컨트롤러를 쉽게 프로그래밍할 수 있습니다.

로타리 인코더 Arduino 예제

아두이노를 사용하여 실제 예제를 만들어 보겠습니다. 이 예제에 사용할 특정 모듈은 브레이크아웃 보드에 있으며 5개의 핀이 있습니다. 첫 번째 핀은 출력 A, 두 번째 핀은 출력 B, 세 번째 핀은 Button 핀이며 물론 다른 두 핀은 VCC와 GND 핀입니다.

<그림 클래스="aligncenter">

출력 핀을 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)

코드 설명: 따라서 먼저 인코더가 연결된 핀을 정의하고 프로그램에 필요한 몇 가지 변수를 정의해야 합니다. 설정 섹션에서 두 개의 핀을 입력으로 정의하고 직렬 모니터에 결과를 인쇄하기 위한 직렬 통신을 시작하고 출력 A의 초기 값을 읽고 값을 변수 aLastState에 넣어야 합니다.

그런 다음 루프 섹션에서 출력 A를 다시 읽지만 이제 값을 State 변수에 넣습니다. 따라서 인코더를 회전하고 펄스가 생성되면 이 두 값이 달라지고 첫 번째 "if" 문이 참이 됩니다. 그 직후 두 번째 "if" 문을 사용하여 회전 방향을 결정합니다. 출력 B 상태가 출력 A 상태와 다른 경우 카운터는 1만큼 증가하고, 그렇지 않으면 감소합니다. 마지막으로 직렬 모니터에 결과를 출력한 후 aLastState 변수를 aState 변수로 업데이트해야 합니다.

이것이 이 예제에 필요한 전부입니다. 코드를 업로드하는 경우 직렬 모니터를 시작하고 인코더 회전을 시작하면 직렬 모니터에서 값을 가져오기 시작합니다. 제가 가지고 있는 특정 모듈은 각 전체 주기에 30번을 셉니다.

자세히 알아보기:초음파 센서 HC-SR04 및 Arduino – 전체 가이드

예시 2 – 로터리 엔코더를 사용하여 스테퍼 모터 제어

이 기본 예제 외에도 로터리 인코더를 사용하여 스테퍼 모터 위치를 제어하는 ​​예제를 하나 더 만들었습니다.

<그림 클래스="aligncenter">

이 예제의 소스 코드는 다음과 같습니다.

/*     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 02 GPS 모듈(Arduino 및 Python 포함)
  5. DHT11로 Blynk에서 온도와 습도를 읽는 방법
  6. 서미스터를 사용하는 것이 얼마나 쉬운가요?!
  7. Arduino로 음악을 만드는 방법
  8. Arduino와 함께 NMEA-0183을 사용하는 방법
  9. Arduino에서 Modbus를 사용하는 방법
  10. Arduino 및 BitVoicer 서버로 음성 인식