Introducción: el CNC que volvía a home cada vez que se iba la luz
Tenía un router CNC casero con motor paso a paso NEMA 17 y un encoder incremental de 600 PPR en el eje X. Funcionaba bien hasta que hubo un corte de luz en Santiago. Al volver la energía, el Arduino no sabía dónde estaba la mesa: el encoder incremental solo cuenta pulsos, no guarda posición.
Tuve que mover manualmente el carro al interruptor de fin de carrera, hacer homing y perder la pieza que estaba mecanizando. Eso no pasa con un encoder absoluto: alimenta sus 12 o 13 cables de datos, lee el ángulo por SPI y sabe exactamente dónde está, aunque haya pasado una semana sin energía.
La elección entre incremental y absoluto no es “el absoluto es mejor”. Es entender qué necesitas: velocidad, precisión, retención de posición, protocolo de comunicación y presupuesto. En este artículo te explico las diferencias técnicas con números reales y precios en CLP.

Encoder incremental: pulsos, cuadratura y el problema del cero
Un encoder incremental genera una secuencia de pulsos digitales a medida que gira. La resolución se mide en PPR (Pulses Per Revolution) o CPR (Counts Per Revolution). Un encoder de 600 PPR con salida en cuadratura (canal A y B desfasados 90°) da 2.400 CPR si usas los 4 flancos (rising/falling de A y B).
Eso significa una resolución angular de 360° / 2.400 = 0,15° por count. Para un eje con tornillo de avance 2 mm por vuelta, la resolución lineal es 2 mm / 2.400 = 0,83 µm. Suficiente para la mayoría de CNCs caseros.
Señales de salida: A, B y Z
- Canal A: tren de pulsos cuadrado. Frecuencia proporcional a la velocidad de giro.
- Canal B: idéntico a A pero desfasado 90°. La secuencia A-B (00→01→11→10) indica sentido horario; la inversa indica antihorario.
- Canal Z (o Index): un pulso por vuelta completa. Sirve para homing y referencia de posición.
El problema: si pierdes alimentación, pierdes el conteo. Al encender, el sistema debe hacer homing (buscar el switch de referencia o el pulso Z) para saber dónde está. En un robot móvil o un brazo articulado, eso puede ser imposible o peligroso.
Encoder absoluto: ángulo único en cada posición
Un encoder absoluto tiene un disco codificado con patrones únicos para cada posición angular. Un encoder de 12 bits tiene 2¹² = 4.096 posiciones distintas, dando una resolución de 360° / 4.096 = 0,088°. Uno de 14 bits tiene 16.384 posiciones y 0,022° de resolución.
La salida no es pulsos: es un código digital paralelo o serie. Los más comunes en electrónica y robótica son:
| Protocolo | Tipo | Hilos necesarios | Velocidad máxima | Uso típico |
|---|---|---|---|---|
| Paralelo (binario/Gray) | Sincrónico | N bits + VCC + GND (ej: 14 bits = 16 hilos) | Instantáneo | PLC industrial, sistemas antiguos |
| SPI | Síncrono serie | 4 (MOSI, MISO, SCK, CS) + VCC + GND | Hasta 10 MHz | Arduino, Raspberry Pi, microcontroladores |
| SSI (Synchronous Serial Interface) | Síncrono serie | 2 (CLK, DATA) + VCC + GND | Hasta 2 MHz | Automatización industrial, servomotores |
| I²C | Síncrono serie | 2 (SDA, SCL) + VCC + GND | 400 kHz (Fast mode) | Sensores magnéticos AS5600, TLE5012 |
| RS-485 / Modbus | Asíncrono diferencial | 2 (A, B) + VCC + GND | Hasta 10 Mbps | Redes industriales, larga distancia |
Para proyectos con Arduino, el AS5600 (I²C, 12 bits, magnético) y el AMT232B (SPI, 12 bits, optomecánico) son los más accesibles. Ambos retienen la posición sin alimentación gracias a que el código está grabado en el disco.
Comparativa técnica y precios en Chile
| Parámetro | Encoder incremental | Encoder absoluto |
|---|---|---|
| Resolución típica | 100 – 2.500 PPR (400 – 10.000 CPR) | 8 – 17 bits (256 – 131.072 posiciones/vuelta) |
| Resolución angular | 0,036° – 0,9° (a 1.000 CPR) | 0,088° (12 bits) a 0,0027° (17 bits) |
| Retención de posición | No. Requiere homing al arrancar | Sí. Posición única sin alimentación |
| Velocidad máxima | Hasta 10.000 RPM (depende del modelo) | Hasta 15.000 RPM (magnéticos) |
| Interfaz con Arduino | 2 pines + interrupciones (A, B) | I²C, SPI o SSI (2-4 pines) |
| Precio CLP (hobby) | $4.500 – $18.000 | $12.000 – $45.000 |
| Precio CLP (industrial) | $35.000 – $120.000 | $85.000 – $350.000 |
¿Buscas encoders para tu proyecto de robótica o CNC?
En ukrabot.cl tenemos encoders incrementales de 600 PPR, encoders absolutos magnéticos AS5600 con I²C, y motores paso a paso NEMA 17 con acoplamientos. Envío a todo Chile.
Código Arduino: incremental con cuadratura completa
El código original del artículo tenía un error grave: solo leía el canal A con interrupción y comparaba con B. Eso funciona a baja velocidad, pero a más de 100 RPM con 600 PPR, el Arduino Nano (16 MHz) pierde pulsos porque digitalRead() dentro de una ISR es lento.
La solución es usar interrupciones en A y B y leer ambos pines con registros directos (PORTD) para velocidad. O usar la librería Encoder de Paul Stoffregen, que optimiza esto automáticamente.
#include <Encoder.h>
Encoder miEncoder(2, 3); // Pines A y B con interrupciones
long posicion = 0;
long posicionAnterior = 0;
void setup() {
Serial.begin(115200);
Serial.println("Encoder incremental - lectura de posicion");
}
void loop() {
posicion = miEncoder.read();
if (posicion != posicionAnterior) {
Serial.print("Posicion: ");
Serial.print(posicion);
Serial.print(" | Angulo: ");
Serial.print(posicion * 0.15, 2); // 0.15° por count (600 PPR x4)
Serial.println("°");
posicionAnterior = posicion;
}
}
Para un encoder absoluto AS5600 por I²C, el código es aún más simple porque no necesitas interrupciones:
#include <Wire.h>
#include <AS5600.h>
AS5600 encoder;
void setup() {
Serial.begin(115200);
Wire.begin();
if (encoder.begin()) {
Serial.println("AS5600 detectado");
} else {
Serial.println("Error: AS5600 no responde");
}
}
void loop() {
uint16_t raw = encoder.getRawAngle();
float angulo = raw * 360.0 / 4096.0; // 12 bits = 4096 posiciones
Serial.print("Raw: ");
Serial.print(raw);
Serial.print(" | Angulo: ");
Serial.print(angulo, 2);
Serial.println("°");
delay(100);
}
Errores costosos que arruinan el posicionamiento
- Usar solo el canal A sin cuadratura: sin el canal B no sabes el sentido de giro. El contador sube cuando debería bajar. Siempre conecta A y B, y usa ambos flancos para máxima resolución.
- No poner pull-ups en salidas open-drain: muchos encoders incrementales industriales tienen salida open-drain (NPN). Sin resistencias pull-up de 4,7 kΩ a 3,3 V o 5 V, los pines flotan y el Arduino lee ruido. El contador avanza solo, sin mover el eje.
- Encoder incremental en un brazo robótico sin finales de carrera: si el robot pierde alimentación en medio del movimiento, al encender no sabe dónde están las articulaciones. Moverlo “a ciegas” puede chocar con el entorno. Los brazos robóticos industriales usan encoders absolutos en cada junta o una combinación de incremental + batería de respaldo para el contador.
- Confundir PPR con CPR: un encoder de 600 PPR genera 600 ciclos de A por vuelta. En cuadratura x4, eso son 2.400 CPR. Si tu software cuenta PPR en vez de CPR, la resolución es 4 veces peor de lo que crees. Un error de 0,6° en vez de 0,15° puede ser la diferencia entre un corte preciso y una pieza botada.
- Encoder absoluto de un solo turno (single-turn) para eje que gira múltiples vueltas: un encoder de 12 bits single-turn sabe el ángulo dentro de 0-360°, pero no cuántas vueltas completas ha dado. Si tu tornillo de avance mueve 100 mm por vuelta y necesitas 500 mm de carrera, necesitas un multi-turn o un contador externo que guarde las vueltas en EEPROM.
⚠️ Advertencia: no uses un encoder incremental sin homing en una aplicación de seguridad
En una puerta automática, un elevador casero o una prensa CNC, perder la posición por corte de luz puede ser peligroso. Si el sistema arranca y asume que está en una posición que no es, puede moverse hacia un obstáculo o aplastar un operador. En aplicaciones donde la posición inicial es crítica para la seguridad, usa encoder absoluto o un sistema de homing forzado con bloqueo mecánico antes de permitir movimiento.
Conclusión
Elegir entre encoder incremental y absoluto no es una cuestión de “calidad”: es una decisión de ingeniería. Si tu sistema puede hacer homing en cada arranque y el costo importa, un incremental de 600 PPR ($8.000-$15.000 CLP) es perfecto para CNCs, impresoras 3D y robots móviles con sensores de proximidad.
Si necesitas saber la posición al instante sin referencia, si el eje no puede girar libremente para buscar home, o si la seguridad lo exige, un absoluto como el AS5600 ($12.000-$18.000 CLP) o un AMT232B ($25.000-$35.000 CLP) son la inversión correcta.
Y recuerda: un encoder absoluto single-turn no cuenta vueltas. Para ejes de carrera larga, combínalo con un contador en EEPROM o usa un modelo multi-turn con batería interna. La diferencia entre un proyecto que funciona y uno que falla está en entender estos límites antes de comprar.
Encoders, motores y electrónica para robótica
Encuentra encoders incrementales de 600 PPR, encoders absolutos AS5600, motores paso a paso NEMA 17, drivers A4988 y accesorios CNC en ukrabot.cl. Enviamos a todo Chile con soporte técnico.
Preguntas frecuentes
¿Puedo usar un potenciómetro en vez de un encoder para medir posición angular?
Solo para ángulos menores a 270° y sin giros continuos. Un potenciómetro tiene desgaste mecánico, ruido en el contacto del cursor y no soporta rotación ilimitada. Para ejes que giran múltiples vueltas o necesitan precisión <1°, el encoder es obligatorio. Un potenciómetro de precisión cuesta $3.000-$8.000 CLP; un encoder incremental de 600 PPR cuesta $8.000-$15.000 CLP y dura años sin desgaste.
¿Qué es el código Gray y por qué lo usan los encoders absolutos?
El código Gray es un sistema numérico donde dos valores consecutivos difieren en un solo bit. En un encoder absoluto con salida paralela, si el disco está en una posición de transición entre 0111 y 1000 (binario), los bits pueden cambiar en momentos ligeramente distintos, generando lecturas erróneas como 0101 o 1010. Con código Gray, la transición entre posiciones adyacentes solo cambia 1 bit, eliminando esos errores de lectura. Los encoders modernos con interfaz serie (SPI, I²C) ya no necesitan Gray porque la lectura es atómica.
¿Cuántas interrupciones puede manejar un Arduino Nano con encoder incremental?
El Arduino Nano (ATmega328P) tiene 2 interrupciones externas (pines 2 y 3). Un encoder incremental necesita ambas para cuadratura. Si tienes 2 ejes (X e Y), necesitas 4 interrupciones. Eso excede la capacidad del Nano. Soluciones: usa un Arduino Mega (6 interrupciones), un ESP32 (interrupciones en cualquier pin GPIO) o un chip contador dedicado como el LS7166 que se comunica por SPI. A velocidades altas (>5.000 RPM con 1.000 PPR), incluso las interrupciones pueden saturar el CPU.
¿Puedo convertir un encoder incremental en absoluto con batería de respaldo?
Sí, y es una solución industrial común. El contador (generalmente un microcontrolador de bajo consumo) se alimenta con una batería de litio CR2032 o un supercapacitor cuando falla la alimentación principal. El contador sigue escuchando los pulsos del encoder y guarda la posición en EEPROM o FRAM periódicamente. Al restaurar la energía, el sistema lee la última posición guardada. El costo de esta electrónica adicional es de $8.000-$15.000 CLP, acercándose al precio de un encoder absoluto básico. Evalúa si no te conviene directamente el absoluto.