Categories: ,

ENCODER PARA ARDUINO KY-040

2.20$

Un encoder rotativo es un elemento que indica mediante posiciones codificadas su posición. El utilizado en este proyecto es un encoder rotativo con 12 posiciones (cada 30º) e infinito, es decir, que podemos dar vueltas hacia ambos lados sin límite. Cuando pasamos por cada paso se nota un pequeño resalte que indica que se ha llegado a la nueva posición. Estos codificadores constan de dos pines para el pulsador (funciona como un pulsador normal) y tres pines para el codificador. Los tres pines del codificador van conectados uno a masa y los otros dos a las respectivas entradas que designemos en la placa Arduino. Estas dos señales que salen del encoder nos dan un total de 4 combinaciones. 00, 01, 10, y 11. Esto se conoce como 2 bits de código Grey.  

5 disponibles

Si tratamos a los pines en código binario, las leemos como 00, 01, 10, o 11. Lasecuencia de las salidas del codificador mientras giramos en sentido de las agujas del reloj es 00, 01, 11, 10. Así que si se tiene una lectura de 01, la siguiente lectura puede ser 00 o 11 dependiendo de la dirección en que se gira. Así que, mediante la adición del valor codificado anteriormente se botiene se obtiene 1 de 8 posibles números (0001, 0010, 0100, 0111, 1000, 1011, 1110 y 1101). Estas cuatro combinaciones 1101, 0100, 0010 y 1011 indican un movimiento horario y 1110, 0111, 0001 y 1000 un movimiento antihorario.

 

Así que ahora podemos decir lo siguiente: (suma es igual a la última lectura + lectura actual)

 

 

if (suma == 0b1101 | | == suma 0b0100 | | == suma 0b0010 | | == suma 0b1011) ValorEncoder + +;

/ / movimiento las agujas del reloj

if (suma == 0b1110 | | == suma 0b0111 | | == suma 0b0001 | | == suma 0b1000) ValorEncoder –;

/ / movimiento hacia la izquierda

Si quisiéramos tratarlo con números decimales tendríamos:

 

if (suma == 13 | | == suma 4 | | suma == 2 | | == suma 11) ValorEncoder + +;

if (suma == 14 | | == suma 7 | | suma == 1 | | == suma 8) ValorEncoder –;

 

 

Las variables globales que se utilizan dentro de estas funciones tienen un nombre especial. Se llaman variables volátiles (volatile), y se utilizan porque sus valores pueden cambiar en cualquier momento. Así que si se utilizan dos variables volátiles, ya que puede no ser el mismo valor de estas varialbes si se produce el cambio en ellas durante una función de interrupción.

 

Necesitamos una libreria que realize lo explicado anteriormente, aunque se puede hacer sin una, pero fue de la manera en que obtuvimos mejores resultados. Libreria: Encoder.zip.

El programa de ejemplo es el siguiente, esta incluido en la libreria:

 

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
// Best Performance: both pins have interrupt capability
// Good Performance: only the first pin has interrupt capability
// Low Performance: neither pin has interrupt capability
Encoder myEnc(5, 6);
// avoid using pins with LEDs attached

void setup() {
Serial.begin(9600);
Serial.println(“Basic Encoder Test:”);
}

long oldPosition = -999;

void loop() {
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
}
}

 

Conctamos los pines CLK al pin 6 y el pin DT al 5 del arduino. GND va a GND del arduino y el pin (+) del enconder a 5V del micro.

Cuando giramos hacia un lado empezara a subir los numeros y hacia el lado contrario disminuira la cuenta.