Cómo usar Arduino para leer valores de encoder

D

Daniel Zhang

Última actualización el Jul 12, 2026

La forma de leer el valor de un encoder depende del tipo de encoder. A continuación se describen los métodos de lectura para encoders incrementales y absolutos.

Encoder incremental

Los encoders incrementales proporcionan dos canales de señal de salida: el canal A y el canal B. Se trata de señales de pulsos desfasadas 90 grados eléctricos entre sí. Detectando los cambios de estado en el canal A y el canal B, es posible determinar tanto el sentido como el ángulo de giro. A continuación se indican los pasos básicos para leer un encoder incremental con Arduino.

  1. Conecte el canal A y el canal B del encoder a pines con capacidad de interrupción en el Arduino (por ejemplo, los pines 2 y 3).
  2. Defina una variable global en el código de Arduino para almacenar el recuento del encoder.
  3. Escriba una rutina de servicio de interrupción (ISR) para gestionar los cambios de estado en el canal A y el canal B. En esta rutina, determine el sentido de giro comparando el estado actual de un canal con el estado anterior del otro, y actualice en consecuencia el recuento del encoder.
volatile long encoderCount = 0;
int lastB = 0;

void encoderInterrupt() {
  int A = digitalRead(2);
  int B = digitalRead(3);
  // Decodificación en cuadratura simplificada: comparar A actual con B anterior
  if (A == lastB) {
    encoderCount++;
  } else {
    encoderCount--;
  }
  lastB = B;
}
  1. En la función setup(), configure los modos de los pines y asocie las interrupciones para que la ISR se active cada vez que cambie el estado del canal A o del canal B.
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  lastB = digitalRead(3);
  attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
  1. En el loop() principal, lea la variable encoderCount para obtener la posición relativa y el sentido de giro del eje del motor.

Nota: El ejemplo anterior utiliza un método de decodificación en cuadratura simplificado. Para encoders de alta velocidad o alta resolución, considere la posibilidad de utilizar una máquina de estados de cuadratura completa o una biblioteca específica de interfaz de encoder para evitar pérdidas de recuento provocadas por fluctuaciones de la señal o rebotes de contacto.

Encoder absoluto

Los encoders absolutos generan una señal digital que representa la posición absoluta del eje del motor. El siguiente ejemplo se aplica específicamente a encoders absolutos con salida paralela, en los que cada bit del valor de posición se presenta en un cable de datos independiente.

Nota: La mayoría de los encoders absolutos industriales utilizan interfaces de comunicación serie como SSI, SPI o RS-485 en lugar de salidas paralelas. Estas interfaces requieren métodos de lectura distintos y, en algunos casos, bibliotecas de protocolo específicas. Consulte siempre la hoja de datos de su encoder para obtener la interfaz y los detalles de cableado correctos.

  1. Conecte cada pin de datos del encoder a un pin de entrada digital del Arduino.
  2. En la función setup(), configure cada pin de datos en modo entrada.
void setup() {
  pinMode(dataPin1, INPUT);
  pinMode(dataPin2, INPUT);
  // ... Pines de datos adicionales, según el número de bits del encoder
}
  1. Escriba una función para leer el valor del encoder. En esta función, lea el estado de cada pin de datos mediante digitalRead() y combine los resultados en un único valor entero.
int readEncoder() {
  int value = 0;
  value |= digitalRead(dataPin1) << 0;
  value |= digitalRead(dataPin2) << 1;
  // ... Pines de datos adicionales, según el número de bits del encoder
  return value;
}
  1. En el loop() principal, llame a la función readEncoder() para obtener la posición absoluta del eje del motor.

Nota: Estos ejemplos cubren los tipos básicos de encoder. Los encoders en aplicaciones reales pueden requerir un procesamiento más avanzado, como la implementación de filtrado de rebotes de señal o el uso de un circuito integrado de interfaz de encoder específico. Consulte siempre la hoja de datos del encoder para garantizar un cableado y un tratamiento de señal adecuados.