Tutorial · Iniciante · 17 min de leitura

Leia encoders de quadratura para medir distância e velocidade

Decodifique um encoder de quadratura, converta contagens em distância e velocidade, trate sentido e transbordo e calibre o conjunto motriz.

Um encoder de roda transforma rotação em pulsos digitais. Conte esses pulsos e poderá medir a distância percorrida pelo robô; conte-os ao longo do tempo e poderá estimar a velocidade. Um encoder de quadratura fornece dois canais de pulsos, A e B, desfasados em um quarto de ciclo. O canal que muda primeiro revela o sentido de rotação.

Encoders medem movimento relativo, não posição absoluta. A contagem só ganha significado depois da inicialização ou de uma redefinição intencional, e só se torna útil depois de definir quantas contagens representam exatamente uma volta da roda.

Leia o padrão de dois canais

Os estados válidos de quadratura são 00, 01, 11 e 10. Girar em um sentido percorre essa sequência; girar no sentido oposto a percorre na ordem inversa. Apenas um bit deve mudar por vez. Uma transição como 00 diretamente para 11 significa que uma borda foi perdida ou que ruído corrompeu o sinal.

Existem três modos de contagem comuns:

  • Decodificação 1×: conte uma borda no canal A por ciclo.
  • Decodificação 2×: conte as duas bordas no canal A.
  • Decodificação 4×: conte todas as bordas nos dois canais.

Um datasheet que informa 12 pulsos por volta pode, portanto, produzir 12, 24 ou 48 contagens de software por volta do eixo do encoder. Some a relação de redução da caixa de engrenagens se o encoder estiver montado no motor, e não na roda. Escreva a convenção completa ao lado da constante; fatores de dois e quatro inexplicados são um defeito frequente de odometria.

Diagrama de tempo dos dois canais de saída de um encoder de quadratura. O canal A é desenhado acima do canal B como ondas quadradas da mesma frequência, com B defasado um quarto de ciclo atrás de A. Quatro linhas verticais tracejadas marcam as quatro transições que ocorrem em um ciclo elétrico, numeradas de um a quatro, anotando que contar todas as quatro dá 1200 contagens por volta em um encoder de 300 CPR. Uma nota aponta para o deslocamento de fase e explica que B atrasado em relação a A significa deslocamento para a frente, enquanto B à frente de A significa que a roda está girando para trás.
Um ciclo, quatro bordas contáveis. O canal que lidera indica o sentido de rotação; quantas bordas você conta determina se as distâncias estão corretas ou erradas por um fator de quatro. Baixar SVG

Conecte os sinais corretamente

Determine se as saídas são push-pull, de coletor aberto ou de dreno aberto. Saídas abertas precisam de resistores de pull-up, que podem ser internos ou externos, dependendo da taxa de bordas e da fiação. Confirme se a tensão do sinal é segura para o controlador — uma saída de encoder de 5 V pode danificar uma entrada de 3,3 V.

Mantenha o cabo longe dos fios dos motores. Em percursos mais longos, siga as orientações do fabricante para cabo e terminação. Uma borda digital limpa vale mais do que tentar corrigir contagens falsas em software.

Gire a roda lentamente com a mão antes de ligar o motor. Os dois canais devem alternar entre níveis lógicos válidos. Se um deles ficar travado, corrija a fiação antes de depurar o código.

Decodifique o sentido sem perder contagens

Para velocidades moderadas, configure o disparo de uma interrupção sempre que o canal A mudar e leia B para determinar o sentido de rotação:

volatile long encoderCount = 0;

void onEncoderA() {
  bool a = digitalRead(ENCODER_A);
  bool b = digitalRead(ENCODER_B);
  encoderCount += (a == b) ? 1 : -1;
}

O sinal depende da ordem dos canais e da montagem física. Troque A e B ou negue o resultado para que o movimento para a frente da roda produza uma contagem positiva. Faça isso uma vez na interface com o hardware, em vez de espalhar mudanças de sinal pelo código de odometria.

Em taxas de bordas altas, chamadas repetidas a digitalRead() podem ser lentas demais. Use um periférico de quadratura por hardware, uma biblioteca de encoder consolidada da plataforma ou acesso direto às portas, de acordo com o controlador. Estime o pior caso antes de escolher: edges per second = counts per wheel revolution × maximum wheel revolutions per second.

Mantenha curta a rotina de interrupção. Atualize a contagem e retorne. Impressões, conversões de ponto flutuante e cálculos de controle pertencem ao laço principal.

Converta as contagens em distância da roda

Seja N o número de contagens decodificadas por volta da roda e D o diâmetro efetivo da roda. A circunferência é πD, portanto:

distance = count × πD / N

Para uma roda de 65 mm e 1.440 contagens decodificadas por volta, cada contagem representa cerca de 0,142 mm. Essa resolução matemática não equivale à precisão real: a compressão do pneu, o escorregamento da roda e o erro de diâmetro normalmente produzem efeitos ainda maiores.

Leia um contador de vários bytes com segurança. Em um microcontrolador pequeno, uma interrupção pode atualizá-lo no meio da leitura realizada pelo laço principal. Desative brevemente as interrupções ou use o mecanismo atômico da plataforma:

noInterrupts();
long snapshot = encoderCount;
interrupts();

float distanceM = snapshot * (PI * wheelDiameterM) / countsPerWheelRev;

Use um contador com sinal e capacidade suficiente e calcule as diferenças entre instantâneos. A subtração modular sem sinal pode lidar com transbordo, mas somente se os tipos e o intervalo de amostragem forem escolhidos conscientemente.

Estime a velocidade sem amplificar o ruído

Em um intervalo fixo de amostragem, calcule a diferença de contagens:

velocity = (newCount - oldCount) × distancePerCount / elapsedTime

Intervalos curtos respondem rapidamente, mas quantizam velocidades baixas em zero e em saltos de uma contagem. Intervalos longos são mais suaves, mas acrescentam atraso. Comece próximo ao período do laço de controle e faça a média de algumas amostras somente se o controlador realmente precisar disso.

Para movimentos muito lentos, medir o tempo entre bordas pode ser melhor do que contar bordas em uma janela fixa. Seja qual for o método, registre os instantes com um relógio monotônico e meça o tempo decorrido, em vez de assumir que cada laço é executado perfeitamente no intervalo previsto.

Calibre no conjunto motriz completo

Marque a roda e gire exatamente dez voltas enquanto registra as contagens. Dividir por dez reduz o efeito de parar entre bordas individuais. Depois comande o robô ao longo de uma reta medida, compare a distância do encoder com a distância percorrida no piso e ajuste o diâmetro efetivo da roda.

Calibre as rodas esquerda e direita separadamente. Se o robô relatar distâncias iguais, mas curvar, os diâmetros efetivos ou os ganhos do conjunto motriz são diferentes. Preserve fatores de escala separados; pneus e caixas de engrenagens reais precisam desse fator de calibração.

Repita o teste em uma segunda velocidade. Uma grande variação sugere escorregamento, cubos soltos, bordas perdidas ou um problema de temporização, em vez de um simples erro de diâmetro.

Diagnose leituras ruins

  • A contagem muda enquanto o robô está parado: ruído elétrico ou entradas sem referência definida; inspecione os sinais e os pull-ups.
  • A magnitude da contagem está exatamente 2× ou 4× errada: o modo de decodificação do software não coincide com a definição de pulsos do datasheet.
  • O sentido de rotação muda aleatoriamente: um canal está ruidoso ou é amostrado tarde demais; verifique a qualidade das bordas e o método de decodificação.
  • As contagens congelam durante o movimento: o controlador não consegue atender à taxa de bordas; use decodificação por hardware ou reduza a sobrecarga das interrupções.
  • A distância é repetível, mas errada: calibre o diâmetro efetivo da roda e a relação de redução.
  • A distância varia conforme a superfície: o encoder mede a rotação da roda, não a verdade de campo; o escorregamento das rodas é uma incerteza real sobre o movimento.

Contagens confiáveis são a entrada da odometria de acionamento diferencial, enquanto a realimentação de velocidade pode fechar o laço de controle dos motores explorado no simulador de controlador PID. A pose resultante também é a entrada que todo controlador de seguimento de trajetória pressupõe, e é por isso que o erro de um se torna o erro do outro.

A seguir

Contar é apenas metade do trabalho. Medir a velocidade é útil porque você pode mantê-la — veja o controle de velocidade das rodas em laço fechado, que converte um PWM correspondente a uma tensão em velocidade e evita que o robô vire porque um motor está cansado. Em uma base holonômica, isso deixa de ser um detalhe: as quatro razões de velocidade das rodas determinam a direção, e, sem realimentação, não há como mantê-las.

Explore o grafo

Faz parte destas montagens

Projetos e caminhos de aprendizagem que incluem este tutorial.

Leitura complementar

Referências