En la entrada de hoy introduzco la utilización de un Encoder rotativo. Estos encoders son ampliamente utilizados por ejemplo para el control de volumen en radios de automóviles. Mostraremos el resultado de accionar este encoder en un display LCD de Nokia 5110. Nos centraremos en la utilización del encoder rotativo, el manejo del display podéis verlo en este

El funcionamiento de este encoder rotativo es muy sencillo, al girarlo se envían dos señales cuadradas desfasadas 90 grados entre sí. La clave es detectar el el flanco de bajada de la señal A. En este momento, el sentido de la rotación vienen indicado por el valor de la señal B, tal y como se aprecia en la imagen.

Señales encoder rotativo

En caso de realizar un giro horario, el pin B tendrá un valor alto, mientras que con un giro antihorario el pin B tendrá valor bajo. El encoder se conectará siguiendo el siguiente esquema:

Esquema de conexión del encoder rotativo


Por otro lado, el código usado en Arduino es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "NokiaLCD.h"
 
// Setup del LCD
NokiaLCD NokiaLCD(3,4,5,6,7); // (SCK, MOSI, DC, RST, CS)
// Pines de lectura del encoder
int a = 9;
int b = 8;
// Valores de medida
int anterior = 1;
int contador;
char texto[10];
 
void setup()
{
  // Inicializamos el LCD
  NokiaLCD.init();
  NokiaLCD.clear();
 
  // Inicializamos la lectura del encoder
  pinMode(a, INPUT);
  pinMode(b, INPUT);
 
  // Inicializamos las variables
  anterior = 1;
  contador = 0;
  escribir();
}
 
void loop()
{
  // Lectura de A, si es 0, volvemos a medir para asegurar el valor
  int actual = digitalRead(a);
  if(actual == 0) {
    delay(10);
    actual = digitalRead(a);
  }
 
  // Actuamos únicamente en el flanco descendente
  if(anterior == 1 && actual == 0)
  {
    int valor_b = digitalRead(b);
    if(valor_b == 1) contador++;  // Si B = 1, aumentamos el contador
    else contador--;  // Si B = 0, reducimos el contador
    escribir();  // Escribimos el valor en pantalla
  }
  anterior = actual;
}
 
// Esta función escribe en el LCD el valor de
// la variable "contador"
void escribir()
{
  String s = String(contador);  // Convertimos el número en texto
  s.toCharArray(texto, 10);  // Convertimos el texto en un formato compatible
  NokiaLCD.clear();
  NokiaLCD.setCursor(3,2);
  NokiaLCD.print("Volumen:");
  NokiaLCD.setCursor(64,2);
  NokiaLCD.print(texto);
}

Finalmente, os dejo en breve vídeo del montaje realizado en funcionamiento.