1. El Octavo Bit
  2. / Arduino
  3. / Modulos y sensores
  4. / Codificador rotatorio KY-040 (rotary encoder)

Codificador rotatorio KY-040 (rotary encoder)

| Actualizado:
Comentarios: 0

Codificador rotatorio KY-040 (rotary encoder)
Codificador rotatorio KY-040 (rotary encoder)

El Módulo KY-040 es un codificador incremental con dos salidas levemente desfasadas, gracias a esto, veremos que se puede saber en que dirección estamos girando el eje.

Pines del codificador rotatorio KY-040

Un encoder rotativo tiene un número fijo de posiciones por revolución. El KY-40 tiene treinta, estas posiciones son marcadas por clicks conforme se va girando el encoder. Además, posee un pulsador interno.

En los codificadores incrementales (o de cuadratura) como este dispositivo, para saber en qué posición se encuentra, es necesario recurrir al software.

Su funcionamiento es más sencillo de lo que parece: el módulo genera señales digitales sobre los pines A y B. Señales que estarán en nivel alto y que conforme vayamos girando el eje,y en función de hacia qué lado lo giremos, una de esas señales cambiará de estado antes que la otra. Arduino es capaz de detectar estas señales.

Representación gráfica de las señales del codificador rotatorio según la dirección de giro.

Como se puede ver en la figura anterior, partiendo de una señal HIGH, conforme vamos girando el eje, se puede observar en el caso de que giraremos hacia la derecha, cómo primero la salida A cambia a LOW, y la salida B se mantiene en HIGH; en t2, ambas estan en LOW. En t3, la salida A cambia a HIGH y B se mantien en LOW. Esto es lo que nos posibilita determinar el sentido de giro, la posición y la velocidad.

En la imagen inferior, está representado el giro hacia la derecha. A y B son los pines de salida, mientras que C es el común, conectado a un plato dentado. En la primera figura, A y B se encuentran en un nivel HIGH, al rotar el eje del codificador, el pin A hace contacto con C y A pasa a un nivel LOW, mientras que B se mantiene en HIGH.

Representación del giro hacia la derecha (CW)

Características:

  • Tipo: Encoder rotatorio incremental
  • Voltaje de alimentación: 5v
  • Corriente: 10 mA
  • Ciclos por revolución 30
  • Pulsos por revolución: 20
  • Dimensiones: 20 x 30 x 30 mm
  • Peso: 10g

Conexión con Arduino

Esquema

Esquema de conexión con Arduino

Código:

En este ejemplo veremos como al girar el encoder hacia la derecha aumenta hasta un máximo de 50 y al girar a la izquierda disminuye hasta -50.

Comenzando en 0. Comencemos creando las variables que vamos a necesitar:

int A = 2;
int B = 3;
int ANTERIOR = 0;
volatile int POSICION = 0;

Se declaran dos variable enteras A y B asignándoles los pines digitales 2 y 3 respectivamente. A corresponde con la señal A (CLK) y B a la señal B (DT).

Tendremos una variable anterior para guardar la posición anterior y otra variable denominada posicion, de tipo global y se declara como volatile para poder utilizarla en la función ISR.

En la función setup() establecemos el pin A y B como entrada, inicializamos la comunicación serial y por último, añadimos la interrupción con la función attachInterrupt(), que se producirá en el pin A; la función asociada codificador y el modo LOW.

void setup() {
  pinMode(A, INPUT);
  pinMode(B, INPUT);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(A), codificador, LOW);
}

En la función loop() solamente escribimos por el monitor serial la posición si es diferente a la anterior.

void loop() {
  if (POSICION != ANTERIOR) {
    Serial.println(POSICION);
    ANTERIOR = POSICION;
  }
}

La función codificador(), esta función se comprobará cada vez que A, llega a un estado bajo. Comprobamos si B esta HIGH, en este caso significa que giramos hacia la derecha, por lo tanto sumamos una posición. Si B esta en LOW, giramos hacia la izquierda, restamos una posición.

void codificador(){
    if (digitalRead(B) == HIGH){
      POSICION++;
    }else{
      POSICION--;
    }
}

Si probamos el código que llevamos desarrollado, veremos que nos daría resultados erráticos porque la señal no es totalmente limpia debido a contactos mecánicos. Hay una serie de rebotes producidos por el roce de las partes mecánicas y las conexiones. Por lo que aplicaremos un sistema antirrebote comprobando que el tiempo entre interrupciones es mayor a 5 milisegundos.

void codificador()  {
  static unsigned long ultimaInterrupcion = 0;
  unsigned long tiempoInterrupcion = millis();
  if (tiempoInterrupcion - ultimaInterrupcion > 5) {
    if (digitalRead(B) == HIGH){
      POSICION++;
    }else{
      POSICION--;
    }
    POSICION = min(50, max(-50, POSICION));
    ultimaInterrupcion = tiempoInterrupcion;
  }
}

Código completo:

int A = 2;
int B = 3;

int ANTERIOR = 0;

volatile int POSICION = 0;

void setup() {
  pinMode(A, INPUT);
  pinMode(B, INPUT);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(A), codificador, LOW);
}


void loop() {
  if (POSICION != ANTERIOR) {
    Serial.println(POSICION);
    ANTERIOR = POSICION;
  }
}

void codificador()  {
  static unsigned long ultimaInterrupcion = 0;
  unsigned long tiempoInterrupcion = millis();

  if (tiempoInterrupcion - ultimaInterrupcion > 5) {
    if (digitalRead(B) == HIGH){
      POSICION++;
    }else{
      POSICION--;
    }

    POSICION = min(50, max(-50, POSICION));
    ultimaInterrupcion = tiempoInterrupcion;
  }
}

Artículos que te pueden interesar

TM1637, display digital de 4 dígitos
TM1637: módulo display digital de 4 dígitos.

TM1637: módulo display digital de 4 dígitos.

| Actualizado:
Comentarios: 0

El módulo de pantalla LED de 4 dígitos con TM1637 se puede controlar con sólo dos líneas de control DIO y CLK. Característica de Módulo Display Digital TM1637 4 Dígitos: Tensión de alimentación de 3V-5V Consumo de corriente 250 mA…

Real-Time-Clock (RTC) DS1302
Real-Time-Clock (RTC) DS1302, módulo reloj

Real-Time-Clock (RTC) DS1302, módulo reloj

| Actualizado:
Comentarios: 0

El módulo reloj DS1302 RTC permite ajustar la fecha y la hora, contiene un reloj-calendario en tiempo real con 31 bytes de RAM estática. El módulo reloj proporciona información de segundos, minutos, días, semanas, meses y años. El número de…

Teclados matriciales

Teclados matriciales

| Actualizado:
Comentarios: 0

Los teclados son una excelente manera de permitir que los usuarios interactúen con sus proyectos. Se pueden usar para navegar por los menús, introducir contraseñas o controlar los juegos y robots. Básicamente un teclado matricial está compuesto por pulsadores organizados…

Receptor infrarrojo universal VS1838B y el módulo KY-022 para Arduino
Receptor infrarrojo VS1838B y KY-022

Receptor infrarrojo universal VS1838B y el módulo KY-022

| Actualizado:
Comentarios: 0

El VS1838B es un receptor de infrarrojos en miniatura para control remoto y otras aplicaciones. El módulo KY-22 consta de un receptor infrarrojo VS 1838B, una resistencia de 1kΩ y un LED, montado sobre una placa de circuito impreso. Contenido…

Comentarios - 0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *