엔코더 값을 읽는 방법은 엔코더 유형에 따라 다릅니다. 인크리멘탈 엔코더와 앱솔루트 엔코더의 읽기 방법은 아래와 같습니다.
인크리멘탈 엔코더
인크리멘탈 엔코더는 A상과 B상 두 개의 출력 신호 채널을 제공합니다. 이 신호들은 서로 90° 전기각 위상차를 갖는 펄스 신호입니다. A상과 B상의 상태 변화를 감지하여 회전 방향과 회전 각도를 모두 파악할 수 있습니다. 다음은 Arduino로 인크리멘탈 엔코더를 읽기 위한 기본 단계입니다.
- 엔코더의 A상과 B상을 Arduino의 인터럽트 지원 핀(예: 2번, 3번 핀)에 연결합니다.
- Arduino 코드에서 엔코더 카운트를 저장할 전역 변수를 선언합니다.
- A상과 B상의 상태 변화를 처리하는 인터럽트 서비스 루틴(ISR)을 작성합니다. 이 루틴에서 한 채널의 현재 상태와 다른 채널의 이전 상태를 비교하여 회전 방향을 판별한 후, 엔코더 카운트를 업데이트합니다.
volatile long encoderCount = 0;
int lastB = 0;
void encoderInterrupt() {
int A = digitalRead(2);
int B = digitalRead(3);
// 간단한 쿼드러처 디코딩: 현재 A 상태와 이전 B 상태 비교
if (A == lastB) {
encoderCount++;
} else {
encoderCount--;
}
lastB = B;
}
setup()함수에서 핀 모드를 설정하고 인터럽트를 연결하여 A상 또는 B상의 상태가 변경될 때마다 ISR이 트리거되도록 합니다.
void setup() {
pinMode(2, INPUT);
pinMode(3, INPUT);
lastB = digitalRead(3);
attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
- 메인
loop()에서encoderCount변수를 읽어 모터 샤프트의 상대 위치와 회전 방향을 확인합니다.
참고: 위 예제는 간략화된 쿼드러처 디코딩 방식을 사용합니다. 고속 또는 고해상도 엔코더의 경우, 신호 지터 또는 접점 바운스로 인한 카운트 누락을 방지하기 위해 완전한 쿼드러처 상태 머신이나 전용 엔코더 인터페이스 라이브러리를 사용하는 것이 좋습니다.
앱솔루트 엔코더
앱솔루트 엔코더는 모터 샤프트의 절대 위치를 나타내는 디지털 신호를 출력합니다. 아래 예제는 위치 값의 각 비트가 개별 데이터선에 할당되는 병렬 출력 방식 앱솔루트 엔코더에 해당합니다.
참고: 대부분의 산업용 앱솔루트 엔코더는 병렬 출력 대신 SSI, SPI, RS-485와 같은 직렬 통신 인터페이스를 사용합니다. 이러한 인터페이스는 다른 읽기 방식이 필요하며, 경우에 따라 전용 프로토콜 라이브러리가 필요합니다. 정확한 인터페이스 및 배선 정보는 반드시 엔코더 데이터시트를 참조하십시오.
- 엔코더의 각 데이터 핀을 Arduino의 디지털 입력 핀에 연결합니다.
setup()함수에서 각 데이터 핀을 입력 모드로 설정합니다.
void setup() {
pinMode(dataPin1, INPUT);
pinMode(dataPin2, INPUT);
// ... 엔코더 비트 수에 따라 추가 데이터 핀 설정
}
- 엔코더 값을 읽는 함수를 작성합니다. 이 함수에서
digitalRead()를 사용하여 각 데이터 핀의 상태를 읽고, 결과를 하나의 정수 값으로 조합합니다.
int readEncoder() {
int value = 0;
value |= digitalRead(dataPin1) << 0;
value |= digitalRead(dataPin2) << 1;
// ... 엔코더 비트 수에 따라 추가 데이터 핀 읽기
return value;
}
- 메인
loop()에서readEncoder()함수를 호출하여 모터 샤프트의 절대 위치를 확인합니다.
참고: 이 예제들은 기본적인 엔코더 유형을 다룹니다. 실제 응용 환경의 엔코더는 신호 디바운싱 구현이나 전용 엔코더 인터페이스 IC 사용 등 더 고급 처리가 필요할 수 있습니다. 올바른 배선과 신호 처리를 위해 반드시 엔코더 데이터시트를 참조하십시오.