Tutorial · Principiante · 17 min de lectura
Leer codificadores en cuadratura para distancia y velocidad
Decodifica un codificador en cuadratura, convierte cuentas en distancia y velocidad, maneja la direccion y el desbordamiento, y calibra en un robot real.
Un codificador de rueda convierte la rotacion en pulsos digitales. Cuenta esos pulsos y podras medir cuanto ha recorrido un robot; cuentalos a lo largo del tiempo y podras estimar la velocidad. Un codificador en cuadratura proporciona dos canales de pulsos, A y B, desfasados un cuarto de ciclo. El canal que cambia primero revela la direccion.
Los codificadores miden movimiento relativo, no una posicion absoluta. La cuenta solo adquiere significado despues del arranque o de un reinicio intencionado, y solo resulta util despues de que definas exactamente cuantas cuentas representan una vuelta de rueda.
Lee el patron de dos canales
Los estados validos en cuadratura son 00, 01, 11 y 10. Girar en un sentido recorre esa secuencia; girar en el otro la invierte. Cada vez deberia cambiar solo un bit. Una transicion como pasar de 00 directamente a 11 significa que se perdio un flanco o que el ruido corrompio la senal.
Hay tres modos de conteo habituales:
- Decodificacion 1x: cuenta un flanco del canal A por ciclo.
- Decodificacion 2x: cuenta ambos flancos del canal A.
- Decodificacion 4x: cuenta cada flanco de ambos canales.
Una hoja de datos que dice 12 pulsos por revolucion puede por tanto producir 12, 24 o 48 cuentas de software por vuelta del eje del codificador. Anade la relacion del reductor si el codificador va montado en el motor en lugar de la rueda. Escribe la convencion completa junto a la constante; los factores de dos y de cuatro sin explicar son un error de odometria frecuente.
Conecta las senales correctamente
Determina si las salidas son push-pull, colector abierto o drenador abierto. Las salidas abiertas necesitan resistencias de pull-up, que pueden ser internas o externas segun la frecuencia de flancos y el cableado. Confirma que la tension de la senal es segura para el controlador: una salida de codificador a 5 V puede danar una entrada de 3,3 V.
Manten el cable lejos de los cables del motor. Para tiradas largas, usa las indicaciones de cable y terminacion del fabricante del codificador. Un flanco digital limpio vale mas que intentar reparar cuentas falsas por software.
Gira la rueda despacio a mano antes de accionar el motor. Ambos canales deben alternar entre niveles logicos validos. Si uno esta clavado, arregla el cableado antes de depurar codigo.
Decodifica la direccion sin perder cuentas
Para velocidades modestas, dispara una interrupcion cada vez que cambie el canal A y muestrea B para determinar la direccion:
volatile long encoderCount = 0;
void onEncoderA() {
bool a = digitalRead(ENCODER_A);
bool b = digitalRead(ENCODER_B);
encoderCount += (a == b) ? 1 : -1;
}
El signo depende del orden de los canales y del montaje fisico. Intercambia A y B o invierte el signo hasta que avanxzar de verdad incremente la cuenta.
Manten los manejadores de interrupcion cortos: leer dos pines y actualizar una variable es todo lo que deberian hacer. Las copias de seguridad, el registro y los calculos de control pertenecen al bucle principal.
Convierte cuentas en distancia de rueda
Sea N el numero de cuentas decodificadas por vuelta de rueda y D el diametro efectivo de la rueda. La circunferencia es piD, asi que:
distancia = cuenta × piD / N
Para una rueda de 65 mm y 1440 cuentas decodificadas por vuelta de rueda, cada cuenta representa unos 0,142 mm. Esa resolucion matematica no es lo mismo que exactitud real: la compresion del neumatico, el deslizamiento de la rueda y el error de diametro suelen ser mayores.
Lee un contador de varios bytes de forma segura. En un microcontrolador pequeno, una interrupcion puede actualizarlo a mitad de la lectura del bucle principal. Desactiva brevemente las interrupciones o usa el mecanismo atomico de la plataforma:
noInterrupts();
long snapshot = encoderCount;
interrupts();
float distanceM = snapshot * (PI * wheelDiameterM) / countsPerWheelRev;
Usa un contador con signo lo bastante ancho y calcula diferencias entre instantaneas. La resta modular sin signo puede gestionar el desbordamiento, pero solo si los tipos y el intervalo de muestreo son intencionados.
Estima la velocidad sin amplificar el ruido
Con un intervalo de muestreo fijo, calcula la diferencia de cuentas:
velocidad = (cuentaNueva - cuentaVieja) × distanciaPorCuenta / tiempoTranscurrido
Los intervalos cortos responden rapido pero cuantizan las velocidades bajas en saltos de cero y una cuenta. Los intervalos largos son mas suaves pero anaden retardo. Empieza cerca del periodo del lazo de control y luego promedia unas pocas muestras solo si el controlador lo necesita de verdad.
Para movimientos muy lentos, medir el tiempo entre flancos puede ser mejor que contar flancos dentro de una ventana fija. Sea cual sea el metodo, marca el tiempo con un reloj monotono y usa el tiempo transcurrido medido en lugar de suponer que cada vuelta del bucle se ejecuta perfectamente a tiempo.
Calibra sobre la transmision completa
Marca la rueda y hazla girar exactamente diez revoluciones mientras registras las cuentas. Dividir entre diez reduce el efecto de parar entre flancos individuales. Despues ordena al robot recorrer una linea recta medida, compara la distancia del codificador con la distancia sobre el suelo y ajusta el diametro efectivo de la rueda.
Calibra las ruedas izquierda y derecha por separado. Si el robot informa distancias iguales pero se curva, los dos diametros efectivos o las ganancias de la transmision difieren. Conserva factores de escala separados; los neumaticos y reductores reales necesitan ese mando de calibracion.
Repite a una segunda velocidad. Un cambio grande sugiere deslizamiento, cubos flojos, flancos perdidos o un problema de temporizacion en lugar de un simple error de diametro.
Diagnostica lecturas malas
- La cuenta cambia estando quieto: ruido electrico o entradas flotantes; revisa las senales y los pull-ups.
- La magnitud de la cuenta esta mal por exactamente 2x o 4x: el modo de decodificacion del software y la definicion de pulsos de la hoja de datos no coinciden.
- La direccion cambia al azar: un canal tiene ruido o se muestrea demasiado tarde; verifica la calidad de los flancos y el metodo de decodificacion.
- Las cuentas se congelan a velocidad: el controlador no puede atender la frecuencia de flancos; usa decodificacion por hardware o reduce el coste de las interrupciones.
- La distancia se repite bien pero es erronea: calibra el diametro efectivo de rueda y la relacion del reductor.
- La distancia cambia segun la superficie: el codificador mide la rotacion de la rueda, no la verdad sobre el suelo; el deslizamiento de rueda es incertidumbre de movimiento real.
Las cuentas fiables son la entrada de la odometria de traccion diferencial, mientras que la realimentacion de velocidad puede cerrar el lazo del motor tratado en el simulador de controlador PID. Esa pose es tambien la entrada que asume todo seguidor de trayectoria, y por eso su error se convierte en el suyo.
Siguiente
Contar es solo la mitad. Una velocidad medida merece la pena porque puedes mantenerla: mira el control de velocidad de rueda en bucle cerrado, que convierte el PWM de una tension en una velocidad y es lo que evita que un robot se curve porque un motor esta cansado. En una base holonomica eso deja de ser un lujo: las relaciones entre las cuatro velocidades de rueda son la direccion, y en lazo abierto no hay nada con lo que mantenerlas.
Explora el grafo
Forma parte de estos montajes
Proyectos y rutas de aprendizaje que incluyen este tutorial.
- ProyectoConstrucción de un rover autónomo por waypoints GPS
- ProyectoConstruya un Micromouse: robot para laberintos con Flood Fill
- ProyectoConstruya un robot mecanum omnidireccional con ESP32
- ProyectoConstruye un robot de autoequilibrio con MPU6050 y PID
- ProyectoConstruye un robot de cobertura de área para limpiar suelos
- ProyectoConstruye un robot ROS 2 que localiza marcadores visuales
- Ruta de aprendizajeControl de motores en robótica: ruta de aprendizaje
- Ruta de aprendizajeSeguimiento de trayectorias en robótica: ruta guiada
- Ruta de aprendizajeTracción holonómica: desplazamiento omnidireccional
Lecturas adicionales