Arduino 보드에서 로터리 엔코더 사용하기
프로젝트에서 버튼이나 슬라이더 입력 같은 컴포넌트를 사용하여 여러 프로젝트를 제어할 수 있지만, 만약 노브가 필요하다면 어떻게 할까요? 프로젝트에 회전 입력이 필요하다면 포텐셔미터나 로터리 인코더 두 가지 선택지가 있습니다.
포텐셔미터 는 손잡이 위치에 따라 저항을 변화시키며, 구조가 단순하고 확실한 선택이 될 수 있지만, 시계 방향 또는 반시계 방향으로만 돌릴 수 있습니다 (현재까지는). 두 방향으로 계속 회전할 수 있는 것을 원한다면 로터리 엔코더가 가장 적합합니다. 두 가지 중 결정하는 데 도움이 필요하다면, 우리 엔코더 vs. 포텐셔미터 토론이 당신의 답을 찾는 데 도움을 줄 수 있습니다.
엔코더 는 두 가지 기본 스타일로 제공됩니다:
1. 증분 엔코더 는 축이 얼마나 그리고 어느 방향으로 회전했는지를 나타내기 위해 일련의 펄스를 사분면 배열로 사용합니다.
2. 절대 엔코더 는 고유하게 각 위치를 알고 있습니다.
이 기사에서는 주로 증분 엔코더에 초점을 맞출 것이며, 당신이 가장 일반적으로 볼 수 있는 엔코더 유형입니다. 단일 출력 엔코더(일명 타코미터)도 제공되지만, 축이 이동한 거리만 표시하고 방향은 표시하지 않기 때문에 훨씬 덜 유용합니다. 엔코더 유형에 대한 보다 상세한 설명은 우리 기사에서 확인할 수 있지만, 오늘은 증분 엔코더의 작동 방식과 Arduino 보드에 연결하는 기본적인 방법을 다룰 것입니다.
사분변 인코더: 튜토리얼 및 개요
인코더 신호 A와 B에 대한 사분주 다이어그램입니다. B의 상승 에지와 A의 낮은 신호는 이 패턴에서 오른쪽으로 이동함을 나타냅니다. A의 하강 에지와 B가 높으면 왼쪽으로 이동함을 나타냅니다.
대부분의 인코더의 중심에는 "A"와 "B" 출력이 있으며, 이는 안정적으로 점진적으로 펄스를 생성합니다. 필요한 경우 이 출력은 전원 및 접지와 결합됩니다. A와 B 출력은 "사분면 인코딩"되어 있으며, 각각의 신호는 의무 주기가 50%(절반의 시간 동안 켜져 있고 절반의 시간 동안 꺼져 있음)입니다. 작동 방식은 다음과 같습니다:
- 각 의무 주기는 서로 대비하여 90° 위상이 어긋나며, 하나의 출력이 변경될 때 다른 출력은 상태 변경 시간의 중간에 있습니다.
- 연결된 마이크로컨트롤러 또는 전용 보드는 이러한 펄스를 회전 증가로 변환하며, 펄스 시퀀스는 샤프트가 회전한 방향을 나타냅니다.
위의 다이어그램에서 보이는 것처럼, B 신호가 낮은 상태에서 상승하면 이 패턴의 위치가 오른쪽으로 전진합니다. 그러나 B 신호가 이미 높은 상태일 때 상승하면 왼쪽으로 전진하게 됩니다. A 신호의 상승과 하강과 결합하여, 각 라인에 대해 네 가지 명확한 상태를 제공합니다:
신호 A에 대해서도 동일한 신호 패턴이 제공되어 각각의 방향으로 네 가지 가능한 전환을 제공하여 총 여덟 가지 전환을 가능합니다. 이 패턴이 원형으로 감싸져 반복되면 이제 사분면 회전 인코더의 기반을 갖추게 됩니다.
1. B 상승, A 낮음
2. B 하강, A 높음
3. B 상승, A 높음
4. B 하강, A 낮음
Arduino에서 로터리 인코더 사용
Arduino와 함께 두 종류의 엔코더를 연결할 것입니다:
- 접촉 엔코더: 작으며 일반적으로 인터페이스 장치로 사용됩니다.
- 광학 엔코더 (LPD3806-600BM-G5-24C): 베어링 지지대를 갖춘 큰 스타일로, 일반적으로 모터 속도 측정에 사용됩니다.
작은 엔코더를 사용하는 경우 다음 단계를 수행하십시오:
1. 중간 선을 접지에 연결합니다.
2. 하나의 외부 연결을 D2에 연결하고 다른 하나를 D3에 연결합니다; 양성 전압은 필요하지 않습니다.
큰 엔코더에 대해 다음 단계를 수행하십시오:
1. 빨간 전원선을 +5V에 연결하고 검은색 전선을 접지에 연결합니다.
2. A와 B 라인(녹색 및 흰색)을 Arduino D2와 D3에 연결합니다.
3. 연결, 전압 요구사항, 색상 스킴은 구현에 따라 달라질 수 있음을 주의하십시오.
Arduino Encoder Code
이미지: Jeremy S. Cook
인코더의 A 및 B 라인이 회전과 함께 펄스하는 방식을 이해하면 이 입력을 코드로 번역하는 것이 유용한 출력을 얻는 핵심이 됩니다. 이 단계는 이론적으로는 간단하지만 실제로는 까다로울 수 있습니다. 여기에서 예제 코드를 찾을 수 있습니다 (테스트를 돕기 위한 3D 프린트 가능한 톱 부품도 함께 제공됩니다). 이 톱은 완벽하지는 않지만 방향적으로 정확하며 인코더가 작동하는 방식을 보여줍니다. Arduino의 마이크로컨트롤러가 어느 라인이든 고와 저 사이의 전환을 감지하면, 두 라인의 상태를 비교하여 적절하게 증가 또는 감소시킵니다.
D2 및 D3를 선택해야 하는데, 이는 많은 Arduino 보드에서 ATmega328의 인터럽트를 생성할 수 있는 두 개의 유일한 입력이기 때문입니다. 즉, 이곳에서 전환이 감지되면 프로그램의 논리가 호출하지 않아도 즉시 읽기 루틴으로 들어갑니다.
millis() 디바운스 코드를 염두에 두십시오. 이는 전환하는 동안 상태 간에 빠르게 변경되는 입력에 대해 처리하여 짧은 시간 동안 빠르게 연결 및 연결 해제를 반복할 수 있습니다. 이 코드는 일부 애플리케이션에서 허용 가능한 작동을 하고 인코더가 어떻게 작동하는지 이해하는 데 도움이 될 수 있지만, 100% 정확한 판독값을 얻기는 쉽지 않습니다.
Arduino Encoder Library 사용하기
Arduino 엔코더 코드는 엔코더가 어떻게 작동하는지 이해하는 데 도움이 되지만, 프로젝트에서 엔코더를 사용하고 싶다면 Paul Stoffregen의 준비된 라이브러리를 활용하세요. 시작하는 방법은 다음과 같습니다:
1. GitHub에서 엔코더 라이브러리를 다운로드하세요.
2. Arduino IDE에서 Sketch ==> Include Library ==> Add .ZIP Library로 이동하여 "Encoder-master.zip"을 추가합니다.
3. 설치가 완료되면, File ==> Examples ==> Encoder에서 네 가지 프로그램이 나열된 것을 볼 수 있습니다. "Basic" 예제를 불러와 Arduino 보드로 전송하세요.
4. 엔코더를 연결할 때 이전과 같이 양극 및 음극을 연결하지만 이번에는 A 및 B 신호선을 D5 및 D6으로 라우트합니다.
5. 시리얼 모니터를 9600 baud로 열면 위치가 정확하게 증가 및 감소하는 것을 볼 수 있습니다.
광학 엔코더와 마찬가지로, 위치가 어떠한 조정 없이 변경되어야 합니다. 추가 재미를 위해 같은 baud rate로 Arduino IDE의 시리얼 플로터를 열어보세요. 위치 번호를 단순히 알려주는 대신, 값의 그래프를 자동으로 생성할 것입니다.
커스텀 인터페이스로 사용하든 속도와 거리를 측정하는 데 사용하든, 엔코더는 Arduino 프로젝트에 훌륭한 회전 입력 방식입니다. 다른 많은 유형의 장치보다 설정하는 데 약간 더 많은 작업이 필요하지만 결과는 그만한 가치가 있을 수 있습니다.
기사 태그