ESP8266 - 로터리 엔코더 | ESP8266 - Rotary Encoder
이 튜토리얼은 ESP8266과 함께 증분 회전 엔코더를 사용하는 방법을 알려줍니다. 다룰 내용은 다음과 같습니다:
- 로터리 엔코더의 작동 원리
- 로터리 엔코더와 포텐쇼미터(다른 유형의 노브)의 차이점
- 로터리 엔코더를 ESP8266에 물리적으로 연결하는 방법
- 로터리 엔코더로부터 방향과 위치를 읽기 위해 ESP8266에 코드를 작성하는 방법
준비물
1 | × | ESP8266 NodeMCU | Amazon | |
1 | × | Micro USB Cable | Amazon | |
1 | × | Rotary Encoder | 쿠팡 | Amazon | |
1 | × | Jumper Wires | Amazon | |
1 | × | (Optional) Screw Terminal Expansion Board for ESP8266 | 쿠팡 | Amazon |
로터리 엔코더에 대하여
로터리 엔코더는 회전을 전기 신호로 변환할 수 있는 종류의 노브입니다. 이것은 무언가가 얼마나 비틀렸는지와 그 위치가 어디인지를 알려줍니다. 주요 두 가지 유형이 있습니다:
- 증분 엔코더: 이것은 어떤 것이 얼마나 움직였는지를 측정하기 위해 빠른 신호를 사용합니다.
- 절대 엔코더: 이 타입은 각 위치에 대해 특별한 코드를 제공하여, 전원이 꺼져도 물체의 정확한 위치를 알 수 있게 해줍니다.
이 튜토리얼은 증분 엔코더에 초점을 맞춥니다.
로터리 엔코더 모듈 핀배열
로터리 엔코더 모듈에는 4개의 핀이 있습니다:
- CLK 핀(출력 A): 회전이 얼마나 일어났는지 알려주는 주된 펄스입니다. 어느 방향으로든 노브를 한 단계(클릭) 돌릴 때마다, CLK 핀은 한 사이클(LOW → HIGH → LOW)을 완성하는 신호를 출력합니다.
- DT 핀(출력 B): CLK 핀처럼 작동하지만 CLK 신호보다 90도 뒤처져서 신호를 출력합니다. 이것은 회전 방향(시계 방향이나 반시계 방향)을 파악하는 데 도움을 줍니다.
- SW 핀: 인코더 내부의 푸시버튼에서 나오는 출력입니다. 보통 열려 있습니다. 이 핀에 풀업 저항을 사용하면, 노브가 눌리지 않았을 때 SW 핀은 HIGH가 되고, 눌렸을 때는 LOW가 됩니다.
- VCC 핀(+): VCC(3.3과 5 볼트 사이)에 연결해야 합니다.
- 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:
Pin A와 B는 CLK 및 DT 핀에 연결됩니다. 그러나 제조업체에 따라 순서가 다를 수 있습니다. 아래 제공된 코드는 DIYables에서 제공하는 로터리 엔코더와 함께 테스트되었습니다.
로터리 엔코더 프로그래밍 방법
- CLK 핀에서 신호를 확인하세요.
- 상태가 LOW에서 HIGH로 바뀌면 DT 핀의 상태를 확인하세요.
- DT 핀의 상태가 HIGH이면, 손잡이가 반시계 방향으로 돌아간 것이므로 카운터를 1 증가시키세요.
- DT 핀의 상태가 LOW이면, 손잡이가 시계 방향으로 돌아간 것이므로 카운터를 1 감소시키세요.
선연결
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP8266의 핀 배치 및 ESP8266 및 다른 구성 요소에 전원을 공급하는 방법에 대해 더 많이 보십시오.
ESP8266 코드 - 회전 엔코더
아래의 ESP8266 코드는 다음과 같은 작업을 수행합니다:
- 인코더의 회전 방향과 회전량을 감지합니다.
- 시계 방향으로 한 눈금(클릭) 돌아간 노브를 감지하면 카운터를 1 증가시킵니다.
- 반시계 방향으로 한 눈금(클릭) 돌아간 노브를 감지하면 카운터를 1 감소시킵니다.
- 버튼이 눌렸는지 감지합니다.
버튼 디바운싱을 위한 코드를 간단히 하기 위해, ezButton 라이브러리가 사용됩니다.
사용 방법
Arduino IDE에서 ESP8266을 시작하는 방법은 다음과 같은 단계를 따르세요:
- ESP8266을 처음 사용한다면 Arduino IDE에서 ESP8266 환경 설정하는 방법 튜토리얼을 확인하세요.
- 다이어그램에 표시된 대로 구성 요소를 연결하세요.
- USB 케이블을 사용하여 컴퓨터에 ESP8266 보드를 연결하세요.
- 컴퓨터에서 Arduino IDE를 엽니다.
- 올바른 ESP8266 보드(예: NodeMCU 1.0 (ESP-12E Module))와 해당 COM 포트를 선택하세요.
- Arduino IDE에 ezButton 라이브러리를 설치하세요. 방법 보기
- 위의 코드를 복사하여 Arduino IDE로 열기
- Arduino IDE에서 Upload 버튼을 클릭하여 ESP8266에 코드를 업로드하세요.
- 노브를 시계 방향으로, 그다음 반시계 방향으로 돌리세요.
- 노브를 누르세요.
- 시리얼 모니터에서 결과를 확인하세요.
코드 설명
코드의 줄마다 달린 주석 확인하세요.
ESP8266 코드 - 인터럽트를 사용한 로터리 엔코더
이전 코드에서 핀의 상태를 폴링을 사용하여 반복적으로 확인하는 것은 자원을 낭비할 수 있으며, 다른 작업에 오랜 시간이 걸릴 경우 정확하게 계산하지 못할 수 있습니다. 인터럽트는 지속적인 확인을 피함으로써 ESP8266이 이벤트를 놓치지 않고 다른 작업을 처리할 수 있도록 하는 해결책을 제공합니다.
여기 ESP8266을 사용하여 인터럽트로 로터리 인코더를 읽는 예제가 있습니다.
이제, 당신이 손잡이를 돌릴 때, 이전 코드에서 보았던 것처럼 직렬 모니터에 정보가 나타나는 것을 알 수 있습니다.
※ NOTE THAT:
다른 웹사이트의 튜토리얼에서 하나의 엔코더에 두 개의 인터럽트를 사용하는 경우를 볼 수도 있지만, 이는 불필요하고 낭비입니다. 하나의 인터럽트만으로 충분합니다.
인터럽트에서 사용되는 전역 변수에는 volatile 키워드를 사용하는 것이 중요합니다. 이를 무시하면 예기치 않은 문제가 발생할 수 있습니다.
인터럽트 안의 코드는 가능한 한 간단하게 유지하세요. 인터럽트 내부에서 Serial.print() 또는 Serial.println() 사용을 피하세요.
ESP8266 로터리 엔코더 애플리케이션
로터리 엔코더를 사용하여 다음과 같은 응용 프로그램을 할 수 있지만 이에 한정되지 않습니다:
- ESP8266 - 회전 엔코더가 서보 모터의 위치를 제어함
- ESP8266 - 회전 엔코더가 LED의 밝기를 제어함
- ESP8266 - 회전 엔코더가 스테퍼 모터의 속도를 제어함
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.