- 필요한 재료
- 로터리 인코더는 어떻게 작동합니까?
- 로터리 엔코더의 종류
- KY-040 로터리 엔코더 핀아웃 및 설명
- Arduino 로터리 엔코더 회로도
- 로터리 인코더 용 Arduino 프로그래밍
- Arduino와 함께 로터리 엔코더 작동
로터리 인코더 시스템과 상호 작용하는 사용자 입력을 도와주는 장치이다. 라디오 전위차계처럼 보이지만 응용 프로그램을 고유하게 만드는 일련의 펄스를 출력합니다. 엔코더의 노브를 돌리면 작은 스텝으로 회전하여 스테퍼 / 서보 모터 제어, 일련의 메뉴 탐색, 숫자 값 증가 / 감소 등에 사용할 수 있습니다.
이 기사에서는 다양한 유형의 로터리 인코더와 작동 방식에 대해 알아 봅니다. 또한 Arduino 와 인터페이스 하고 인코더를 회전하여 정수 값을 제어하고 값을 16 * 2 LCD 화면에 표시합니다. 이 튜토리얼이 끝나면 프로젝트에 Rotary Encoder를 사용하는 데 익숙해 질 것입니다. 그럼 시작하겠습니다…
필요한 재료
- 로터리 엔코더 (KY-040)
- Arduino UNO
- 16 * 2 영숫자 LCD
- 전위차계 10k
- 브레드 보드
- 전선 연결
로터리 인코더는 어떻게 작동합니까?
로터리 엔코더는 전기 기계식 변환기로, 기계적 움직임을 전자 펄스로 변환합니다. 회전 할 때 단계적으로 이동하고 각 단계에 대해 미리 정의 된 폭으로 일련의 펄스 트레인을 생성하는 노브로 구성됩니다. 각각 고유 한 작동 메커니즘을 가진 여러 유형의 인코더가 있습니다. 나중에 유형에 대해 배우 겠지만 지금은 튜토리얼에서 사용하고 있으므로 KY040 Incremental Encoder 에만 집중하겠습니다.
인코더의 내부 기계 구조는 아래와 같습니다. 기본적 으로이 원형 디스크 위에 전도성 패드 (구리색)가 있는 원형 디스크 (회색) 로 구성됩니다. 이러한 전도성 패드는 아래와 같이 동일한 거리에 배치됩니다. 출력 핀은이 원형 디스크 위에 고정되어 있습니다. 이렇게하면 손잡이가 회전 할 때 전도성 패드가 출력 핀과 접촉하게됩니다. 여기에는 아래 그림과 같이 두 개의 출력 핀, 출력 A 및 출력 B가 있습니다.
출력 핀 A와 출력 B에서 생성 된 출력 파형은 각각 파란색과 녹색으로 표시됩니다. 전도성 패드가 핀 바로 아래에있을 때는 높이가되어 제 시간에, 전도성 패드가 멀어지면 핀이 낮아져 위에 표시된 파형의 꺼짐 시간이 발생합니다. 이제 펄스 수를 세면 인코더가 이동 한 단계 수를 확인할 수 있습니다.
이제 질문이 발생할 수 있습니다. 노브를 회전하는 동안 수행 한 단계 수를 계산하기에 충분할 때 두 개의 펄스 신호가 필요한 이유는 무엇입니까? 이는 노브가 어느 방향으로 회전되었는지 식별해야하기 때문입니다. 두 펄스를 살펴보면 두 펄스가 모두 90 ° 위상차라는 것을 알 수 있습니다. 따라서 노브를 시계 방향으로 돌리면 출력 A가 먼저 높아지고 노브를 시계 반대 방향으로 돌리면 출력 B가 먼저 높아집니다.
로터리 엔코더의 종류
설계자가 자신의 용도에 따라 선택할 수있는 로터리 엔코더 유형이 시장에 많이 나와 있습니다. 가장 일반적인 유형은 다음과 같습니다.
- 증분 인코더
- 앱솔루트 엔코더
- 자기 인코더
- 광학 인코더
- 레이저 인코더
이러한 인코더는 출력 신호 및 감지 기술을 기반으로 분류되며, 인크 리 멘탈 인코더와 절대 인코더는 출력 신호를 기준으로 분류되며 자기, 광학 및 레이저 인코더는 감지 기술을 기반으로 분류됩니다. 여기에 사용 된 인코더는 증분 형 인코더 입니다.
KY-040 로터리 엔코더 핀아웃 및 설명
KY-040 인크 리 멘탈 타입 로터리 엔코더의 핀아웃은 아래와 같습니다.
처음 두 핀 (Ground 및 Vcc)은 인코더에 전원을 공급하는 데 사용되며 일반적으로 + 5V 전원이 사용됩니다. 인코더에는 시계 방향 및 시계 반대 방향으로 노브를 돌리는 것 외에도 내부의 노브를 눌러 누를 수있는 스위치 (Active low)도 있습니다. 이 스위치의 신호는 핀 3 (Switch)을 통해 얻습니다. 마지막으로 위에서 이미 설명한 것처럼 파형을 생성하는 두 개의 출력 핀이 있습니다. 이제 Arduino와 인터페이스하는 방법을 알아 보겠습니다.
Arduino 로터리 엔코더 회로도
Arduino와 로터리 인코더 를 인터페이싱 하기위한 전체 회로도 가 아래 그림에 나와 있습니다.
로터리 인코더에는 위의 라벨에 표시된 순서대로 5 개의 핀이 있습니다. 처음 두 개의 핀은 Ground와 Vcc로 접지와 Arduino의 + 5V 핀에 연결되어 있습니다. 인코더의 스위치는 디지털 핀 D10에 연결되고 1k 저항을 통해 하이로 당겨집니다. 2 개의 출력 핀은 각각 D9 및 D8에 연결됩니다.
로터리 엔코더를 회전하여 증가 또는 감소 할 변수의 값을 표시하려면 디스플레이 모듈이 필요합니다. 여기에서 사용되는 것은 일반적으로 사용 가능한 16 * 2 영숫자 LCD 디스플레이입니다. 4 비트 모드로 작동 할 디스플레이를 연결하고 Arduino의 + 5V 핀을 사용하여 전원을 공급했습니다. 전위차계는 LCD 디스플레이의 대비를 조정하는 데 사용됩니다. Arduino와 LCD 디스플레이 인터페이스에 대해 자세히 알고 싶다면 링크를 따르십시오. 전체 회로는 브레드 보드 위에 구축 할 수 있습니다. 모든 연결이 완료되면 아래처럼 보였습니다.
로터리 인코더 용 Arduino 프로그래밍
로터리 엔코더의 작동 원리를 이해했다면 로터리 엔코더와 인터페이스하기 위해 Arduino 보드를 프로그래밍하는 것은 매우 쉽고 간단합니다. 인코더가 몇 번 회전했는지 확인하기 위해 펄스 수를 읽고 인코더가 어느 방향으로 회전했는지 찾기 위해 어떤 펄스가 먼저 높았는지 확인하면됩니다. 이 튜토리얼에서는 LCD의 첫 번째 행에 증가 또는 감소하는 숫자와 두 번째 행에 인코더의 방향을 표시합니다. 완전한 프로그램 같은 작업을 수행하는가이 페이지의 하단에서 찾을 수 있습니다 데모 비디오, 어떤 라이브러리를 필요로하지 않습니다. 이제 작업을 이해하기 위해 프로그램을 작은 덩어리로 분할 해 보겠습니다.
LCD 디스플레이를 사용했기 때문에 기본적으로 Arduino IDE에있는 액정 라이브러리를 포함합니다. 그런 다음 LCD와 Arduino를 연결하기위한 핀을 정의 합니다. 마지막으로 해당 핀의 LCD 디스플레이를 초기화합니다.
#포함
다음으로 설정 기능 내에서 LCD 화면에 소개 메시지를 표시 한 다음 해당 메시지가 사용자가 읽을 수 있도록 2 초 동안 기다립니다. 이는 LCD가 제대로 작동하는지 확인하기위한 것입니다.
lcd.print ("로터리 엔코더"); // Intro Message line 1 lcd.setCursor (0, 1); lcd.print ("Arduino 사용"); // Intro Message line 2 delay (2000); lcd.clear ();
로터리 엔코더에는 Arduino의 INPUT 핀이 될 3 개의 출력 핀이 있습니다. 이 세 핀은 각각 스위치, 출력 A 및 출력 B입니다. 이들은 아래와 같이 pinMode 함수 를 사용하여 입력 으로 선언됩니다.
// 핀 모드 선언 pinMode (Encoder_OuputA, INPUT); pinMode (Encoder_OuputB, INPUT); pinMode (Encoder_Switch, INPUT);
void 설정 기능 내에서 출력 A 핀의 상태를 읽어 핀의 마지막 상태를 확인합니다. 그런 다음이 정보를 사용하여 새 값과 비교하여 어느 핀 (출력 A 또는 출력 B)이 높았는지 확인합니다.
Previous_Output = digitalRead (Encoder_OuputA); // 출력 A의 초기 값 읽기
마지막으로 메인 루프 함수 내에서 출력 A와 출력 B의 값을 이전 출력과 비교하여 어느 것이 먼저 높아지는 지 확인해야합니다. A와 B의 전류 출력 값을 이전 출력과 비교하면 아래와 같습니다.
if (digitalRead (Encoder_OuputA)! = 이전 _ 출력 ) { if (digitalRead (Encoder_OuputB)! = 이전 _ 출력 ) { Encoder_Count ++; lcd.clear (); lcd.print (Encoder_Count); lcd.setCursor (0, 1); lcd.print ("시계 방향"); }
위 코드에서 두 번째 if 조건은 출력 B가 이전 출력에서 변경된 경우 실행됩니다. 이 경우 엔코더 변수의 값이 증가하고 LCD에 엔코더가 시계 방향으로 회전 한 것으로 표시됩니다. 유사하게 만약 조건이 실패 한다면 , 이후의 else 조건에서 우리는 변수를 감소시키고 엔코더가 반 시계 방향으로 회전한다는 것을 표시합니다. 동일한 코드는 다음과 같습니다.
else { Encoder_Count--; lcd.clear (); lcd.print (Encoder_Count); lcd.setCursor (0, 1); lcd.print ("Anti-시계 방향"); } }
마지막으로, 메인 루프 의 끝에서 루프 가 동일한 논리로 반복 될 수 있도록 이전 출력 값을 현재 출력 값으로 업데이트해야합니다. 다음 코드는 동일합니다.
Previous_Output = digitalRead (Encoder_OuputA);
또 다른 선택 사항은 인코더의 스위치를 눌렀는지 확인하는 것입니다. 이것은 로터리 코더의 스위치 핀을 확인하여 모니터링 할 수 있습니다. 이 핀은 활성 로우 핀으로, 버튼을 누르면 로우가됩니다. 누르지 않으면 핀이 하이 상태로 유지되며, 스위치를 누르지 않았을 때도 높은 상태를 유지하기 위해 풀업 저항을 사용하여 부동 소수점 상태를 방지합니다.
if (digitalRead (Encoder_Switch) == 0) {lcd.clear (); lcd.setCursor (0, 1); lcd.print ("스위치 누름"); }
Arduino와 함께 로터리 엔코더 작동
하드웨어와 코드가 준비되면 Arduino 보드에 코드를 업로드하고 Arduino 보드의 전원을 켭니다. USB 케이블을 통해 전원을 공급하거나 12V 어댑터를 사용할 수 있습니다. 전원이 공급되면 LCD에 소개 메시지가 표시되고 공백이됩니다. 이제 로터리 엔코더를 회전하면 회전하는 방향에 따라 값이 증가하거나 감소하는 것을 볼 수 있습니다. 두 번째 줄은 인코더가 시계 방향 또는 시계 반대 방향으로 회전하고 있는지를 보여줍니다. 아래 그림은 동일합니다.
또한 버튼을 누르면 두 번째 줄에 버튼이 눌려진 것으로 표시됩니다. 전체 작업은 아래 비디오 에서 찾을 수 있습니다. 이것은 인코더를 Arduino와 인터페이스하고 예상대로 작동하는지 확인하는 샘플 프로그램입니다. 여기에 도착하면 모든 프로젝트 및 프로그램에 인코더를 사용할 수 있습니다.
튜토리얼을 이해하고 예상대로 작동하기를 바랍니다. 문제가있는 경우 기술 지원을 위해 의견 섹션이나 포럼을 사용하십시오.