Un encoder rotativo es un tipo de sensor que convierte la posición angular (o rotacion) de una perilla en una señal de salida que es usada para determinar qué dirección la perilla giró. 

Debido a su robustez y control digital preciso, estos encoders son usados en muchas aplicaciones incluyendo robótica, máquinas CNC, e impresoras.

Hay dos tipos de encoders rotativos, absolutos e incrementales. El encoder absoluto nos da la posición exacta de la perilla en grados mientras que el encoder incremental reporta cuántos incrementos la perilla ha sido movida. 

El encoder rotativo que se usará en este tutorial es el tipo incremental. Se explicará el principio de funcionamiento y se dará un ejemplo de conexión y código de funcionamiento. 

 

Dificultad: Media

 

Encoder Rotativo vs potenciómetros

 

El encoder rotativo es el equivalente moderno digital del potenciómetro. Mientras que solo se puede rotar alrededor de ¾ de un potenciómetro, un encoder puede rotar sin tener topes. 

Los potenciómetros son ideales para situaciones en donde se necesita saber la posición exacta de la perilla, mientras que los encoder son ideales para las situaciones en donde se necesite saber el cambio de posición en lugar de la posición exacta. 

 

Cómo funcionan los encoders

Dentro del encoder hay un disco con ranuras conectado a la masa o GND (Pin C) y dos pines con contactos (pines A y B) como se ilustra debajo: 

Cuando se gira la perilla, los pines A y B entran en contacto con el pin de masa C en un orden en particular de acuerdo a la dirección en la que se giró la perilla. 

Cuando los pines A y B entran en contacto con la masa, estos producen señales y estas señales están desfasadas 90º entre sí ya que un pin entra en contacto luego del otro. Esto se llama codificación de cuadratura. 

Cuando se gira la perilla en sentido horario, el pin A entra en contacto primero, seguido por el pin B. Cuando se gira la perilla en sentido antihorario, el pin B entra en contacto primero, seguido por el pin A. 

Este es el principio básico de funcionamiento del encoder rotativo. 

 

Pinout: 

1- GND : Conexión de alimentacion masa.

2- +: Conexión de alimentación positiva 5V 

3- SW: Conexión de botón a masa. Cuando la perilla es presionada, el voltaje toma el estado LOW, es decir entra en contacto con masa. 

4- DT: Salida A, esta salida está desfasada 90º con respecto a CLK y puede ser utilizada para determinar la dirección de rotación. 

4- CLK: Salida B, es el pulso principal para determinar la dirección de rotación.   

 

Circuito. Conectando el encoder al Arduino

 

Ahora que tenemos un conocimiento más avanzado acerca del encoder rotativo es momento de comenzar a utilizarlo! 

Vamos a conectar el encoder rotativo al Arduino. Primero conectaremos los pines (+) del módulo a los 5V en el arduino y el pin GND a la masa del Arduino. 

Luego conectaremos los pines CLK y DT a los pines digitales #2 y #3 del Arduino respectivamente. Finalmente conectamos el pin SW al pin digital #4 del arduino. 

En esta ilustración podemos ver el diagrama de conexiones: 

Código Arduino. Leyendo el encoder Rotativo: 

 

Ahora que tenemos el encoder conectado al arduino necesitaremos un código para hacerlo funcionar. 

El siguiente sketch detecta cuando el encoder está siendo rotado, determina en qué dirección está siendo rotada y si el botón ha sido presionado. 

// Entradas del encoder rotativo

#define CLK 2

#define DT 3

#define SW 4

 

int counter = 0;

int currentStateCLK;

int lastStateCLK;

String currentDir =“”;

unsigned long lastButtonPress = 0;

 

void setup() {

//configurar pines de encoder como entradas

pinMode(CLK,INPUT);

pinMode(DT,INPUT);

pinMode(SW, INPUT_PULLUP);

 

// Configurar Monitor Serial 

Serial.begin(9600);

 

// leer el estado inicial de CLK 

lastStateCLK = digitalRead(CLK);

}

 

void loop() {

// Leer el siguiente estado de CLK

currentStateCLK = digitalRead(CLK);

 

// Si el último y el actual estado de CLK son diferentes son diferentes, entonces ocurrió un pulso

// Reaccionar a solo 1 cambio de estado para evitar conteo doble. 

if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){

 

// Si el estado de DT es diferente que el estado de CLK entonces

// el encoder esta rotando en sentido contrario a las agujas del reloj, por lo que se decrementa 

if (digitalRead(DT) != currentStateCLK) {

counter –;

currentDir =“CCW”;

} else {

// El encodes esta rotando en sentido a las agujas del reloj, por lo que incrementa. 

counter ++;

currentDir =“CW”;

}

 

Serial.print(“Direction: “);

Serial.print(currentDir);

Serial.print(” | Counter: “);

Serial.println(counter);

}

 

// Recuerda el ultimo estado de CLK 

lastStateCLK = currentStateCLK;

 

// Lee el estado del boton 

int btnState = digitalRead(SW);

 

// Si detectamos una señal baja (LOW), el boton fue presionado 

if (btnState == LOW) {

//Si pasaron 50ms desde el ultimo pulso bajo, significa

//que el boton ha sido presionado, liberado y presionado nuevamente 

if (millis() – lastButtonPress > 50) {

Serial.println(“Button pressed!”);

}

 

// Recordar el último evento de presion de boton.

lastButtonPress = millis();

}

// Poner un pequeño delay para ayudar a eliminar lecturas erroneas.

delay(1);

}

 

Si todo está correcto, abriendo el monitor serial del arduino IDE podremos ver lo siguiente: 

 

Este proyecto es una demostración de lo que el encoder rotativo es capaz de hacer. Se puede implementar en muchos proyectos como una perilla de selección de un menú como en una impresora 3D, subir y bajar volumen en un proyecto de audio, control de movimiento de un motor y mucho más! 

 

Fuentes: 

https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/