- 로터리 엔코더 및 그 유형
- KY-040 로터리 엔코더 핀아웃 및 설명
- 로터리 인코더의 작동 원리
- 필요한 구성 요소
- PIC16F877A 로터리 엔코더 인터페이싱 회로 다이어그램
- 코드 설명
로터리 인코더 시스템과 상호 작용하는 사용자 입력을 도와주는 장치이다. 라디오 전위차계처럼 보이지만 응용 프로그램을 고유하게 만드는 일련의 펄스를 출력합니다. 엔코더의 노브를 돌리면 작은 단계로 회전하여 스테퍼 / 서보 모터 제어, 메뉴 순서 탐색, 숫자 값 증가 / 감소 등에 사용할 수 있습니다.
이 기사에서는 다양한 유형의 로터리 인코더와 작동 방식에 대해 알아 봅니다. 또한 PIC 마이크로 컨트롤러 PIC16F877A 와 인터페이스 하고 인코더를 회전하여 정수 값을 제어하고 값을 16 * 2 LCD 화면에 표시합니다. 이 튜토리얼이 끝나면 프로젝트에 Rotary Encoder를 사용하는 데 익숙해 질 것입니다. 그럼 시작하겠습니다…
로터리 엔코더 및 그 유형
로터리 엔코더는 종종 샤프트 엔코더 라고합니다. 이것은 전기 기계식 변환기입니다. 즉, 기계적인 움직임을 전자 펄스로 변환하거나, 즉 각도 위치 나 동작 또는 샤프트 위치를 디지털 또는 아날로그 신호로 변환합니다. 회전 할 때 단계적으로 이동하고 각 단계에 대해 미리 정의 된 폭으로 일련의 펄스 트레인을 생성하는 노브로 구성됩니다.
설계자가 자신의 용도에 따라 선택할 수있는 로터리 엔코더 유형이 시장에 많이 나와 있습니다. 가장 일반적인 유형은 다음과 같습니다.
- 증분 인코더
- 앱솔루트 엔코더
- 자기 인코더
- 광학 인코더
- 레이저 인코더
이러한 인코더는 출력 신호 및 감지 기술을 기반으로 분류되며, 인크 리 멘탈 인코더와 절대 인코더는 출력 신호를 기준으로 분류되며 자기, 광학 및 레이저 인코더는 감지 기술을 기반으로 분류됩니다. 여기에 사용 된 인코더는 증분 형 인코더 입니다.
앱솔루트 엔코더 는 전원이 제거 된 후에도 위치 정보를 저장하며 다시 전원을 공급하면 위치 정보를 사용할 수 있습니다.
다른 기본 유형 인 증분 인코더 는 인코더가 위치를 변경할 때 데이터를 제공합니다. 위치 정보를 저장할 수 없습니다.
KY-040 로터리 엔코더 핀아웃 및 설명
KY-040 인크 리 멘탈 타입 로터리 엔코더 의 핀아웃은 아래와 같습니다. 이 프로젝트에서는이 로터리 인코더를 마이크로 칩의 인기있는 마이크로 컨트롤러 PIC16F877A와 인터페이스 할 것입니다.
처음 두 핀 (Ground 및 Vcc)은 인코더에 전원을 공급하는 데 사용되며 일반적으로 + 5V 전원이 사용됩니다. 인코더에는 시계 방향 및 시계 반대 방향으로 노브를 돌리는 것 외에도 내부의 노브를 눌러 누를 수있는 스위치 (Active low)도 있습니다. 이 스위치의 신호는 핀 3 (SW)을 통해 얻습니다. 마지막으로 아래에서 이미 설명한 것처럼 파형을 생성하는 두 개의 출력 핀 (DT 및 CLK)이 있습니다. 이 Rotary Encoder는 이전에 Arduino와 인터페이스했습니다.
로터리 인코더의 작동 원리
출력은 샤프트와 GND 및 VCC와의 연결을 제공하는 내부 구리 패드에 전적으로 의존합니다.
로터리 인코더에는 두 부분이 있습니다. 샤프트 와 연결되어 샤프트의 회전에 따라 시계 방향 또는 반 시계 방향으로 회전하는 샤프트 휠 과 전기 연결이 이루어지는 베이스 베이스에는 샤프트 휠이 회전 할 때베이스 포인트를 연결하고 DT 및 CLK 포트 모두에 사각 파를 제공하는 방식으로 DT 또는 CLK에 연결된 포트 또는 포인트가 있습니다.
출력은 샤프트가 회전 할 때와 같습니다.
두 개의 포트가 구형파를 제공하지만 타이밍에 약간의 차이가 있습니다. 이로 인해 출력을 1과 0으로 받아들이면 0 0, 1 0, 1 1, 0 1의 네 가지 상태 만있을 수 있습니다. 이진 출력의 시퀀스는 시계 방향 또는 반 시계 방향 회전을 결정합니다. 예를 들어 로터리 엔코더가 유휴 상태에서 10을 제공하고 그 후에 1 1을 제공하면 엔코더가 시계 방향으로 한 단계 위치를 변경하지만 유휴 상태에서 0을 제공하는 경우 1 0, 샤프트가 반 시계 방향으로 한 단계 씩 위치가 변경됨을 의미합니다.
필요한 구성 요소
회전식 인코더와 PIC 마이크로 컨트롤러를 연결하는 데 필요한 사항을 식별 할 때입니다.
- PIC16F877A
- 4.7k 저항
- 1k 저항
- 10k 냄비
- 33pF 세라믹 디스크 커패시터 – 2 개
- 20Mhz 크리스탈
- 16x2 디스플레이
- 로터리 엔코더
- 5V 어댑터.
- 브레드 보드
- 연결 전선.
PIC16F877A 로터리 엔코더 인터페이싱 회로 다이어그램
아래는 회로도에 따라 구성 요소를 연결 한 후 최종 설정 사진입니다.
우리는 전위차계를 사용하는 대신 LCD 대비를 위해 단일 1K 저항을 사용했습니다. 또한 마지막에 제공된 전체 작동 비디오를 확인하십시오.
코드 설명
전체 PIC 코드 는 데모 비디오 와 함께이 프로젝트의 끝에 제공되며 여기에서는 코드의 몇 가지 중요한 부분을 설명합니다. PIC Microcontroller를 처음 사용하는 경우 처음부터 PIC 자습서를 따르십시오.
이전에 논의했듯이 출력 을 확인하고 DT 및 CLK 모두에 대한 이진 출력을 구분해야 하므로 작업을위한 if-else 부분을 만들었습니다.
if (Encoder_CLK! = 위치) { if (Encoder_DT! = 위치) { // lcd_com (0x01); 카운터 ++; // LCD에 인쇄 될 카운터를 늘 립니다. lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, 카운터); } else { // lcd_com (0x01); lcd_com (0xC0); 카운터--; // 카운터를 줄입니다. lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, 카운터); // lcd_puts ("왼쪽"); } }
또한 각 단계의 위치 를 저장 해야합니다. 이를 위해 현재 위치를 저장 하는 변수 "위치" 를 사용했습니다.
위치 = Encoder_CLK; // 인코더 클럭 위치를 변수에 저장합니다. 0 또는 1 일 수 있습니다.
이 외에도 LCD의 스위치 누름 을 알리는 옵션이 제공됩니다.
if (Encoder_SW == 0) { sw_delayms (20); // 디 바운스 지연 if (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("스위치 누름"); // itoa (카운터, 값, 10); // lcd_puts (값);
system_init의 함수 핀 I / O 동작, LCD를 초기화하고, 로터리 인코더의 위치를 저장하는데 사용된다.
void system_init () { TRISB = 0x00; // PORT B를 출력으로,이 포트는 LCD TRISDbits에 사용됩니다 .TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // 이것은 LCD 위치 를 초기화합니다 = Encoder_CLK; // while 루프가 시작되기 전에 시스템 초기화의 CLK 위치를 기록합니다. }
LCD 함수는 lcd_puts (), lcd_cmd ()가 선언 된 lcd.c 및 lcd.h 라이브러리에 작성됩니다.
변수 선언, 구성 비트 및 기타 코드 스 니펫은 아래에서 전체 코드를 찾으십시오.