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.

Diagrama de tiempos de los dos canales de salida de un codificador en cuadratura. El canal A se dibuja encima del canal B como ondas cuadradas de la misma frecuencia, con B desfasado un cuarto de ciclo por detras de A. Cuatro lineas verticales discontinuas marcan las cuatro transiciones que ocurren dentro de un ciclo electrico, numeradas de uno a cuatro, con la anotacion de que contarlas todas da 1200 cuentas por revolucion a partir de un codificador de 300 CPR. Una nota senala el desfase de fase explicando que B por detras de A significa avance y B por delante de A significa que la rueda va marcha atras.
Un ciclo, cuatro flancos contables. El canal que va por delante te dice la direccion; cuantos flancos cuentas decide si tus distancias son correctas o estan equivocadas por un factor de cuatro. Descargar SVG

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.

Lecturas adicionales

Referencias