로터리 엔코더가 작동하고 Arduino와 인터페이스하는 방법

Loteoli Enkodeoga Jagdonghago Arduinowa Inteopeiseuhaneun Bangbeob



로터리 엔코더는 전자 분야에서 다양한 용도로 사용되는 중요한 전기 기계 장치입니다. 이 기사에서는 Arduino와의 인터페이스와 함께 로터리 엔코더의 유형과 작동에 대해 설명합니다.

로터리 엔코더란?

로터리 엔코더는 로터리 노브의 각도 위치를 감지하고 신호를 마이크로컨트롤러 또는 연결된 다른 장치로 보내는 디지털 입력 장치입니다. 멈추지 않고 360° 회전할 수 있습니다. 샤프트 엔코더라고도 합니다. 프린터, 오디오 전자 장치, 모터 및 컨트롤러에 사용됩니다.









로터리 엔코더의 종류

생성된 출력 신호에 따라 결정되는 로터리 엔코더에는 주로 두 가지 유형이 있습니다. 이러한 유형의 이름은 다음과 같습니다.



증분 로터리 엔코더

이 유형의 엔코더는 회전 노브의 회전을 펄스 형태로 카운트합니다. 노브를 한 번 돌리면 펄스가 생성됩니다. 매 펄스마다 카운터가 증가하여 샤프트의 각도 위치를 나타냅니다.





앱솔루트 로터리 엔코더

이 유형의 엔코더는 모든 샤프트 위치에 대해 별도의 코드가 있으므로 샤프트의 절대 각도 위치를 제공하고 해당 코드를 통해 각도를 측정합니다. 각도 위치를 출력하기 위해 카운터가 필요하지 않습니다. 앱솔루트 로터리 엔코더의 전원이 꺼지더라도 각도 위치에 대한 각 값은 유지됩니다. 또한 저렴한 엔코더입니다.



로터리 엔코더의 작동

로터리 엔코더는 접지된 공통 핀 C에 연결된 동일한 간격의 영역이 있는 디스크로 구성됩니다. 다른 두 개의 핀 A와 B는 로터리 노브가 회전할 때 C와 접촉하는 접촉 핀입니다. 핀 A 또는 B가 접지에 연결되면 신호가 생성됩니다. 출력 핀에서 생성된 이러한 신호는 위상이 90° 다릅니다. 노브를 시계방향으로 돌리면 A핀이 그라운드에 연결되고 노브를 시계반대방향으로 돌리면 B핀이 먼저 그라운드에 연결되기 때문이다. 따라서 이러한 연결을 통해 노브의 회전 방향이 결정됩니다.

의 상태라면 같지 않다 , 손잡이가 시계 방향으로 돌린 것입니다.


B의 상태가 A와 같으면 노브가 시계 반대 방향으로 돌린 것입니다.

로터리 엔코더의 핀 구성

아래 주어진 다이어그램은 출력 핀 A와 B, 푸시 버튼으로 사용할 수 있는 로터리 스위치, 전원 공급용 핀을 보여주는 로터리 엔코더의 핀아웃을 제공합니다.

로터리 엔코더의 핀 설명

다음은 모든 로터리 엔코더 핀에 대한 설명입니다.

출력 B 또는 CLK

이 핀은 노브 또는 로터리 엔코더가 회전한 횟수를 출력합니다. 노브를 돌릴 때마다 CLK는 HIGH와 LOW의 사이클을 완료합니다. 1회전으로 계산됩니다.

출력 A 또는 DT

회전 방향을 결정하는 로터리 엔코더의 두 번째 출력 핀입니다. CLK 신호보다 90° 뒤쳐져 있습니다. 따라서 상태가 CLK의 상태와 같지 않으면 회전 방향은 시계 방향이고 그렇지 않으면 시계 반대 방향입니다.

스위치

스위치 핀은 푸시 버튼이 눌렸는지 여부를 확인하는 데 사용됩니다.

VCC

이 핀은 5V 공급 장치에 연결됩니다.

GND

이 핀은 접지에 연결됩니다.

로터리 엔코더와 Arduino의 인터페이스

로터리 엔코더에는 5개의 핀이 있습니다. 로터리 엔코더의 VCC와 GND는 Arduino의 VCC와 GND에 연결됩니다. 나머지 핀 CLK, DT 및 SW는 Arduino의 디지털 입력 핀에 연결됩니다.

로터리 엔코더용 아두이노 코드

// 로터리 엔코더 입력
#define CLK_PIN 2
#define DT_PIN 3
#define SW_PIN 4
정수 카운터 = 0 ;
int 현재 CLK 상태;
int lastCLKState;
스트링 전류 방향 = '' ;
서명되지 않은 긴 lastButtonPressTime = 0 ;
무효 설정 ( ) {
// 인코더 핀 설정 ~처럼 입력
  pinMode ( CLK_PIN, 입력 ) ;
  pinMode ( DT_PIN, 입력 ) ;
  pinMode ( SW_PIN, 입력_풀업 ) ;
// 직렬 모니터 설정
직렬 시작 ( 9600 ) ;
// CLK의 초기 상태 읽기
lastCLKState = 디지털 읽기 ( CLK_PIN ) ;
}
무효 루프 ( ) {
// CLK의 현재 상태 읽기
currentCLKState = 디지털 읽기 ( CLK_PIN ) ;
// 만약 마지막 CLK의 현재 상태는 다릅니다. 그 다음에 맥박이 뛰다
// 에만 반응 1 이중 카운트를 피하기 위한 상태 변경
만약에 ( 현재CLK상태 ! = lastCLK상태 && 현재CLK상태 == 1 ) {
// DT 상태가 CLK 상태와 다른 경우, 그 다음에
// 엔코더가 시계 반대 방향으로 회전하므로 감소
만약에 ( 디지털 읽기 ( DT_PIN ) ! = 현재CLK상태 ) {
카운터--;
현재 방향 = 'CCW' ;
} 또 다른 {
// 인코더는 시계 방향으로 회전하므로 증분합니다.
카운터++;
현재 방향 = 'CW' ;
}
직렬.인쇄 ( '회전 방향: ' ) ;
직렬.인쇄 ( 현재방향 ) ;
직렬.인쇄 ( ' | 카운터 값: ' ) ;
Serial.println ( 카운터 ) ;
}
// 기억하세요 마지막 CLK 상태
lastCLKState = 현재CLKState;
// 버튼 상태 읽기
int buttonState = 디지털 읽기 ( SW_PIN ) ;
// LOW 신호를 감지하면 버튼을 누릅니다.
만약에 ( 버튼 상태 == 낮음 ) {
// 50ms가 지난 경우 마지막 LOW 펄스는
// 버튼을 눌렀다 떼었다가 다시 눌렀습니다.
만약에 ( 밀리 ( ) - lastButtonPressTime > 오십 ) {
Serial.println ( '버튼을 눌렀다!' ) ;
}
// 기억하세요 마지막 버튼 누르기 이벤트 시간
lastButtonPressTime = 밀리초 ( ) ;
}
// 놓다 ~에 약간의 지연 돕다 독서를 디 바운스
지연 ( 1 ) ;
}


위의 코드에서 loop() 함수에서 CLK 핀의 상태를 확인합니다. 이전 상태와 같지 않으면 회전 노브가 회전했음을 나타냅니다. 이제 노브의 회전 방향을 확인하기 위해 CLK의 현재 상태와 DT의 상태를 비교합니다. 두 상태가 같지 않으면 노브가 시계 방향으로 회전했음을 나타내고 카운터는 회전 노브의 위치를 ​​표시하기 위해 해당 값을 증가시킵니다. 반대의 경우 카운터가 감소합니다.

결론

로터리 엔코더는 지속적으로 회전할 수 있는 고급 위치 센서입니다. 증분형과 절대형의 두 가지 유형으로 제공됩니다. 로터리 엔코더는 노브의 회전으로 인해 생성된 펄스를 카운트하여 작동합니다. 그것은 일상 생활 전자 제품에서 산업 자동화에 이르기까지 다양한 응용 분야를 가지고 있습니다.