아두이노 - 로터리 엔코더 | Arduino - Rotary Encoder
이 튜토리얼에서는 아두이노와 함께 증분 엔코더를 사용하는 방법을 배우게 됩니다. 구체적으로, 우리는 다음을 배울 것입니다:
- 로터리 엔코더의 작동 방식
- 로터리 엔코더 대 포텐쇼미터
- 아두이노에 로터리 엔코더 연결하는 방법
- 인터럽트 없이 아두이노가 로터리 엔코더에서 방향과 위치를 읽도록 프로그래밍하는 방법
- 인터럽트를 사용하여 아두이노가 로터리 엔코더에서 방향과 위치를 읽도록 프로그래밍하는 방법
준비물
1 | × | Arduino Uno | Amazon | |
1 | × | USB 2.0 cable type A/B | 쿠팡 | Amazon | |
1 | × | Rotary Encoder | 쿠팡 | Amazon | |
1 | × | Jumper Wires | Amazon | |
1 | × | (Optional) 9V Power Adapter for Arduino | Amazon | |
1 | × | (Recommended) Screw Terminal Block Shield for Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) Breadboard Shield For Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) Enclosure For Arduino Uno | Amazon |
로터리 엔코더 정보
로터리 엔코더는 회전 운동을 전기 신호로 변환하는 전기기계 장치입니다. 회전 및 축이나 손잡이의 위치를 측정합니다. 두 가지 주요 유형이 있습니다:
- 증분 엔코더: 상대적 변화를 측정하기 위해 펄스를 생성하는 장치
- 절대 엔코더: 각 위치마다 고유한 디지털 코드를 제공하여, 전원 손실 후에도 정밀한 위치 결정에 이상적인 장치
이 가이드는 증분 엔코더에 관한 것입니다.
로터리 엔코더 모듈 핀아웃
로터리 엔코더 모듈은 4개의 핀을 가지고 있습니다:
- CLK 핀 (출력 A): 메인 펄스로, 회전이 얼마나 발생했는지 알려줍니다. 노브를 어느 방향으로든 한 번의 디텐트(클릭)만큼 돌릴 때마다, CLK 핀은 하나의 전체 주기(LOW → HIGH → LOW)의 신호를 출력합니다.
- DT 핀 (출력 B): CLK 핀처럼 작동하지만, CLK 신호에 비해 90도 지연된 신호를 출력합니다. 이것은 회전 방향(시계 방향 또는 반시계 방향)을 파악하는 데 도움을 줍니다.
- SW 핀: 인코더 내부의 푸시버튼에서 나오는 출력입니다. 보통 열려 있습니다. 이 핀에 풀업 저항을 사용하면, 노브가 눌리지 않았을 때 SW 핀은 HIGH이고, 눌렸을 때 LOW가 됩니다.
- VCC 핀 (+): VCC(3.3V와 5V 사이)에 연결해야 합니다.
- GND 핀: GND(0V)에 연결해야 합니다.
로터리 엔코더 대 포텐쇼미터
로타리 인코더를 포텐쇼미터와 혼동할 수도 있지만, 그것들은 구별되는 부품입니다. 여기 그들 사이의 비교가 있습니다:
- 로터리 엔코더는 포텐쇼미터의 현대 버전과 같지만, 그들은 더 많은 것을 할 수 있습니다.
- 로터리 엔코더는 멈추지 않고 완전한 원형을 돌 수 있지만, 포텐쇼미터는 원의 약 3/4만 돌 수 있습니다.
- 로터리 엔코더는 펄스를 출력하는 반면, 포텐쇼미터는 아날로그 전압을 출력합니다.
- 로터리 엔코더는 단지 노브가 얼마나 움직였는지 찾아낼 때 유용합니다, 정확히 어디에 있는지는 아닙니다. 포텐쇼미터는 노브의 정확한 위치를 정말 알아야 할 때 유용합니다.
로터리 엔코더의 작동 원리
인코더 내부에는 공통 접지처럼 작동하는 C라고 불리는 핀에 연결된 슬롯이 있는 원판이 있습니다. 두 개의 추가 핀, A와 B가 더 있습니다.
노브를 돌릴 때, A핀과 B핀이 C핀이라는 공통 접지와 닿지만, 노브를 돌리는 방향(시계 방향이나 반시계 방향)에 따라 특정 순서로 닿습니다.
이러한 접촉은 두 개의 신호를 생성합니다. 한 핀이 다른 핀보다 먼저 접지와 닿기 때문에 시간상 약간의 차이가 있습니다. 두 신호는 서로 90도의 동기화 오차를 가집니다. 이를 '쿼드러처 인코딩'이라고 합니다.
노브를 시계 방향으로 돌릴 때는 A핀이 B핀보다 먼저 접지에 닿습니다. 노브를 반시계 방향으로 돌릴 때는 B핀이 A핀보다 먼저 접지에 닿습니다.
각 핀이 접지에 닿거나 떨어지는 시점을 모니터링함으로써 노브가 어느 방향으로 돌아가는지 알아낼 수 있습니다. 이는 A핀의 변화가 있을 때 B핀에 무슨 일이 일어나는지 확인함으로써 수행됩니다.
A가 LOW에서 HIGH로 상태가 변경될 때:
- B가 낮으면, 노브는 시계 방향으로 돌려집니다.
- B가 높으면, 노브는 반시계 방향으로 돌려집니다.
※ NOTE THAT:
A핀과 B핀은 CLK핀과 DT핀에 연결됩니다. 그러나 제조사에 따라 순서가 다를 수 있습니다. 아래에 제공된 코드는 DIYables에서 제공하는 로터리 인코더와 함께 테스트되었습니다.
로터리 엔코더 프로그래밍 방법
- CLK 핀에서 신호를 확인하세요
- 상태가 LOW에서 HIGH로 바뀌면 DT 핀의 상태를 확인하세요.
- DT 핀의 상태가 HIGH이면, 다이얼이 반시계 방향으로 돌아가므로 카운터를 1 증가시키세요
- DT 핀의 상태가 LOW이면, 다이얼이 시계 방향으로 돌아가므로 카운터를 1 감소시키세요
선연결
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
아두이노 코드 - 인터럽트 없는 로터리 엔코더
아래의 아두이노 코드는 다음과 같은 기능을 합니다:
- 인코더의 회전 방향과 양을 감지합니다.
- 시계 방향으로 한 단계(클릭) 돌아간 노브를 감지하면 카운터를 하나 증가시킵니다.
- 반시계 방향으로 한 단계(클릭) 돌아간 노브를 감지하면 카운터를 하나 감소시킵니다.
- 버튼이 눌렸는지 감지합니다.
버튼 디바운싱 코드를 단순화하기 위해 ezButton 라이브러리가 사용됩니다.
사용 방법
- Arduino IDE에 ezButton 라이브러리를 설치하세요. 방법 보기
- 위의 코드를 복사하고 Arduino IDE로 열기
- Arduino IDE에서 Upload 버튼을 클릭하여 아두이노에 코드를 업로드하세요
- 손잡이를 시계 방향으로 돌린 다음, 반시계 방향으로 돌리세요
- 손잡이를 누르세요
- 시리얼 모니터에서 결과를 확인하세요.
코드 설명
코드의 줄마다 있는 주석을 확인해보세요.
아두이노 코드 - 인터럽트를 이용한 로터리 인코더
이전 예제 코드에서는 핀 상태를 지속적으로 확인하는 폴링 방법을 사용했습니다. 이에는 두 가지 단점이 있습니다:
- Waste Arduino resource - 아두이노 자원 낭비
- Some counter may be missed if another code takes long time to excecute. - 다른 코드가 실행하는 데 시간이 오래 걸리면 일부 카운터가 누락될 수 있습니다.
이를 처리하는 한 가지 방법은 인터럽트를 사용하는 것입니다. 인터럽트는 특정 이벤트를 지속적으로 확인할 필요를 없애줍니다. 이를 통해 Arduino가 다른 작업을 수행하면서도 이벤트를 간과하지 않을 수 있습니다.
다음은 인터럽트를 사용하여 로터리 엔코더를 읽는 방법의 예입니다.
이제, 당신이 노브를 돌리면, 앞서 본 코드에서 보았던 것처럼 시리얼 모니터에 정보가 나타나는 것을 알 수 있을 것입니다.
※ NOTE THAT:
- 인터럽트를 사용하려면 엔코더의 CLK 핀을 인터럽트를 처리할 수 있는 아두이노 핀에 연결해야 합니다. 하지만 모든 아두이노 핀이 이를 할 수 있는 것은 아닙니다. 예를 들어, 아두이노 우노에서는 2번과 3번 핀만 인터럽트와 함께 작동할 수 있습니다.
- 다른 웹사이트의 튜토리얼에서 단일 엔코더에 대해 두 개의 인터럽트를 사용하는 것을 볼 수도 있지만, 이는 불필요하고 낭비입니다. 하나의 인터럽트만으로 충분합니다.
- 인터럽트에서 사용되는 전역 변수에는 volatile 키워드를 사용하는 것이 중요합니다. 이를 무시하면 예상치 못한 문제가 발생할 수 있습니다.
- 인터럽트 내의 코드는 가능한 한 단순하게 유지하세요. 인터럽트 내에서 Serial.print()나 Serial.println()을 사용하는 것은 피하세요.
아두이노 로터리 엔코더 응용 프로그램
로터리 엔코더를 사용하여 다음과 같은 응용 프로그램을 할 수 있지만 이에 국한되지 않습니다:
- Arduino - 로터리 엔코더가 서보 모터의 위치를 제어합니다.
- Arduino - 로터리 엔코더가 LED의 밝기를 제어합니다.
- Arduino - 로터리 엔코더가 스테퍼 모터의 속도를 제어합니다.
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.