- Codificador Rotativo e seus Tipos
- Pinagem e descrição do codificador giratório KY-040
- Como funciona o codificador rotativo
- Componentes necessários
- Diagrama do circuito de interface do codificador giratório PIC16F877A
- Explicação do código
Um codificador rotativo é um dispositivo de entrada que ajuda o usuário a interagir com um sistema. Ele se parece mais com um potenciômetro de rádio, mas emite uma seqüência de pulsos que torna sua aplicação única. Quando o botão do Encoder é girado ele gira em forma de pequenos passos que o ajudam a ser usado para controle de motor de passo / servo, navegando por uma seqüência do menu e Aumentando / diminuindo o valor de um número e muito mais.
Neste artigo, aprenderemos sobre os diferentes tipos de codificadores rotários e como eles funcionam. Também faremos a interface com o microcontrolador PIC PIC16F877A e controlaremos o valor de um inteiro girando o codificador e exibiremos seu valor em uma tela LCD 16 * 2. Ao final deste tutorial, você se sentirá confortável em usar um Rotary Encoder para seus projetos. Então vamos começar…
Codificador Rotativo e seus Tipos
Codificador rotativo frequentemente denominado codificador de eixo. É um transdutor eletromecânico, o que significa que converte movimentos mecânicos em pulsos eletrônicos ou, em outras palavras, converte a posição angular ou o movimento ou a posição do eixo em um sinal digital ou analógico. Consiste em um botão que ao girar se moverá passo a passo e produzirá uma sequência de trens de pulsos com largura pré-definida para cada passo.
Existem muitos tipos de codificadores rotativos no mercado que o projetista pode escolher de acordo com sua aplicação. Os tipos mais comuns estão listados abaixo
- Codificador incremental
- Codificador Absoluto
- Codificador Magnético
- Codificador Ótico
- Codificador de Laser
Esses codificadores são classificados com base no sinal de saída e na tecnologia de detecção, o codificador incremental e os codificadores absolutos são classificados com base no sinal de saída e os codificadores magnético, óptico e laser são classificados com base na tecnologia de detecção. O codificador usado aqui é um codificador de tipo incremental.
O codificador absoluto armazena as informações de posição mesmo depois que a alimentação é removida, e as informações de posição estarão disponíveis quando voltarmos a aplicá-lo.
O outro tipo básico, o codificador incremental, fornece dados quando o codificador muda de posição. Não foi possível armazenar as informações de posição.
Pinagem e descrição do codificador giratório KY-040
A pinagem do codificador rotativo do tipo incremental KY-040 é mostrada abaixo. Neste projeto, faremos a interface deste Codificador Rotativo com o microcontrolador PIC16F877A de microchip.
Os primeiros dois pinos (terra e Vcc) são usados para alimentar o codificador, normalmente é usada uma fonte de + 5 V. Além de girar o botão no sentido horário e anti-horário, o codificador também possui uma chave (Ativo baixo) que pode ser pressionado pressionando o botão interno. O sinal desta chave é obtido através do pino 3 (SW). Finalmente, ele possui os dois pinos de saída (DT e CLK) que produzem as formas de onda conforme já discutido abaixo. Estabelecemos a interface deste Codificador Rotativo anteriormente com o Arduino.
Como funciona o codificador rotativo
A saída depende inteiramente das almofadas de cobre internas que fornecem a conexão com GND e VCC com o eixo.
Existem duas partes do Rotary Encoder. Roda do eixo que está conectada ao eixo e gira no sentido horário ou anti-horário dependendo da rotação do eixo e a base onde é feita a conexão elétrica. A base possui portas ou pontos que são conectados ao DT ou CLK de forma que quando a roda do eixo girar, ela conectará os pontos da base e fornecerá onda quadrada nas portas DT e CLK.
A saída será como quando o eixo gira -
Duas portas fornecem a onda quadrada, mas há uma ligeira diferença no tempo. Devido a isso, se aceitarmos a saída como 1 e 0, pode haver apenas quatro estados, 0 0, 1 0, 1 1, 0 1. A seqüência da saída binária determina o giro no sentido horário ou anti-horário. Como, por exemplo, se o Codificador Rotativo fornece 1 0 em condição ociosa e fornece 1 1 depois disso, isso significa que o codificador muda sua posição em uma única etapa no sentido horário, mas se ele está fornecendo 0 0 após a ociosidade 1 0 significa que o eixo está mudando suas posições no sentido anti-horário com um passo.
Componentes necessários
É hora de identificar o que precisamos para fazer a interface do Codificador Rotativo com o Microcontrolador PIC,
- PIC16F877A
- Resistor de 4,7k
- Resistor 1k
- Pote de 10k
- Capacitor de disco de cerâmica 33pF - 2pcs
- Cristal de 20 MHz
- Display 16x2
- Codificador rotativo
- Adaptador 5V.
- Tábua de pão
- Fios de conexão.
Diagrama do circuito de interface do codificador giratório PIC16F877A
Abaixo está a imagem da configuração final após conectar os componentes de acordo com o Diagrama de Circuito:
Usamos um único resistor de 1K para o contraste do LCD em vez de usar um potenciômetro. Além disso, verifique o vídeo de trabalho completo fornecido no final.
Explicação do código
O código PIC completo é fornecido no final deste projeto com um vídeo de demonstração, aqui estamos explicando algumas partes importantes do código. Se você é novo no microcontrolador PIC, siga nossos tutoriais PIC desde o início.
Como discutimos antes, precisamos verificar a saída e diferenciar a saída binária para DT e CLK, portanto, criamos uma parte if-else para a operação.
if (Encoder_CLK! = posição) { if (Encoder_DT! = posição) { // lcd_com (0x01); contador ++; // Aumenta o contador que será impresso no lcd lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, contador); } else { // lcd_com (0x01); lcd_com (0xC0); contador--; // diminui o contador lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, contador); // lcd_puts ("Left"); } }
Também precisamos armazenar a posição em cada etapa. Para fazer isso, usamos uma variável “posição” que armazena a posição atual.
posição = Encoder_CLK; // É para armazenar a posição do relógio do codificador na variável. Pode ser 0 ou 1.
Além disso, uma opção é fornecida para notificar sobre o pressionamento do botão no LCD.
if (Encoder_SW == 0) { sw_delayms (20); // atraso de debounce if (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("interruptor pressionado"); // itoa (contador, valor, 10); // lcd_puts (valor);
A função system_init é usada para inicializar a operação de E / S do pino, LCD e para armazenar a posição do Codificador Rotativo.
void system_init () { TRISB = 0x00; // PORTA B como saída, esta porta é usada para LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Isso irá inicializar a posição LCD = Encoder_CLK; // Sotred a posição CLK na inicialização do sistema, antes do loop while iniciar. }
A função LCD é escrita nas bibliotecas lcd.c e lcd.h onde lcd_puts (), lcd_cmd () são declarados.
Para a declaração da variável, bits de configuração e outros trechos de código, encontre o código completo abaixo.