terça-feira, 16 de junho de 2015

Teste do Encoder Rotativo KY-040

Neste artigo vamos mostrar um pequeno teste do uso do Encoder Rotativo KY-040.
Encoder Rotativo KY-040

Novamente, a Placa Base utilizada como controladora é a Arduino Uno, que foi utilizada em conjunto com o Protoshield compatível com a mesma. Todos os itens utilizados podem ser adquiridos em nossa loja.

Este encoder trabalha com um disco óptico. Ele tem dois sinais de saída chamados de Clock (CLK) e Data (DT). Além de um sinal que vem do botão (SW) embutido no encoder.

O objetivo deste teste é ler estas saídas e fazer o programa identificar se o encoder está girando no sentido horário ou anti-horário, e quantos degraus ele se deslocou.

Este é um encoder que identifica 20 passos/360°. Ou seja, a cada 18° temos a identificação de um passo.

As duas saídas (CLK e DT) estão defasadas entre si em 90° o que permite a detecção do sentido de rotação. E estão ativas quando em nível baixo.

Para os testes utilizamos:

Arduino Uno
Shield Placa Expansora para Arduino UNO
Módulo Encoder Rotativo KY-040
Capacitor de poliéster 100nF
Resistor 10kΩ
Fios para ligação (Sugestão: Cabo Jumper MACHO/FÊMEA 20cm 40 vias);


Os capacitores de 100nF são usados para efeitos de "debounce" (um artifício para que o Arduino identifique corretamente cada passo do encoder, de maneira que seja contabilizado um único pulso a cada passo) para os três pinos de saída do módulo (DT, CLK e SW).

No módulo já está incluso 2 resistores (SMD) de pull-up que garantem sinal alto (+5V) nas saídas, que vão abaixo (0V) quando estão ativas. Exceto na saída do push button (SW) que tem o espaço mas não tem o resistor instalado (porém, esse resistor pode ser adquirido na nossa loja). Confira na imagem abaixo.



Após realizada as conexões dos capacitores e resistor, podemos ligar o módulo ao Arduino. Lembrando que o Arduino utilizado foi o modelo Arduino Uno.

As Conexões devem ser feitas da seguinte forma:

Encoder KY-040 Arduino
GND GND
+ 5v
SW D4
DT D3
CLK D2








Além disso, foram conectados dois LED's (com os resistores apropriados) aos pinos D5 e D6 do Arduino, para facilitar a indicação da direção do giro.

Segue abaixo uma imagem com o circuito montado.


Confira abaixo um vídeo com o funcionamento do projeto.


Baixe aqui o sketch com a programação do Arduino para esse projeto.
Segue abaixo o código fonte utilizado nesse projeto.
 //############### ELETRODEX ELETRÔNICA ###############  
 // Programa de teste do Módulo Encoder KY-040  
 //   
 // As Conexões devem ser feitas da seguinte forma:  
 // Módulo Encoder |  Arduino  
 //    GND   |   GND  
 //     +    |   5v  
 //    SW    |   D4  
 //    DT    |   D3  
 //    CLK   |   D2  
 //    LED 1  |   D5  
 //    LED 2  |   D6  
 //  
 // Lembrando que devem ser inseridos os capacitores de 100nF entre   
 // os pinos SW, DT e CLK do Encoder e o pino GND do Arduino, e um resistor de 10K Ohms   
 // entre o pino SW do Encoder e o pino 5v do Arduino  
 const int interruptA = 0; // Interrupt 0 (pin 2)  
 const int interruptB = 1; // Interrupt 1 (pin 3)  
 int CLK = 2; // PIN2  
 int DAT = 3; // PIN3  
 int BUTTON = 4; // PIN4  
 int LED1 = 5; // PIN5  
 int LED2 = 6; // PIN6  
 int COUNT = 0;  
 void setup ()  
 {  
 attachInterrupt (interruptA, RoteStateChanged, FALLING);  
 //attachInterrupt (interruptB, buttonState, FALLING);  
 pinMode (CLK, INPUT);  
 digitalWrite (2, HIGH); // Pull High Restance  
 pinMode (DAT, INPUT);  
 digitalWrite (3, HIGH); // Pull High Restance  
 pinMode (BUTTON, INPUT);  
 digitalWrite (4, HIGH); // Pull High Restance  
 pinMode (LED1, OUTPUT);  
 pinMode (LED2, OUTPUT);  
 Serial.begin (9600);  
 }  
 void loop ()  
 {  
 if (! (digitalRead (BUTTON)))  
 {  
 COUNT = 0;  
 Serial.println ("STOP COUNT = 0");  
 digitalWrite (LED1, LOW);  
 digitalWrite (LED2, LOW);  
 delay (2000);  
 }  
 Serial.println (COUNT);  
 }  
 // -------------------------------------------  
 void RoteStateChanged () // When CLK FALLING READ DAT  
 {  
 if (digitalRead (DAT)) // When DAT = HIGH IS FORWARD  
 {  
 COUNT++;  
 digitalWrite (LED1, HIGH);  
 digitalWrite (LED2, LOW);  
 delay (200);  
 }  
 else // When DAT = LOW IS BackRote  
 {  
 COUNT --;  
 digitalWrite (LED2, HIGH);  
 digitalWrite (LED1, LOW);  
 delay (200);  
 }  
 }  

Conte-nos suas experiências utilizando os produtos adquiridos em  nossa loja!
Até o próximo artigo!

3 comentários:

  1. BOM DIA.
    ONDE COMPRAR UM SISTEM DESTE PRONTO PARA USAR?

    ResponderExcluir
  2. BOM DIA.
    ONDE COMPRAR UM SISTEM DESTE PRONTO PARA USAR?

    ResponderExcluir
  3. Os produtos que foram testados você pode adquiri-los em nosso site.

    ResponderExcluir