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: