Componente · Atuador
Motorredutor com encoder N20
O N20 é um motorredutor compacto com encoder magnético integrado, comum em robôs autoequilibrados que precisam de torque e posição das rodas.
O que é
O N20 é o pequeno motorredutor de engrenagens metálicas que aparece sempre que um robô precisa de torque real em muito pouco espaço. O motor sem redutor tem aproximadamente o tamanho de uma bateria AA; a caixa na frente troca sua velocidade muito alta por torque utilizável e, na versão com encoder, um disco magnético no eixo traseiro informa até onde ele girou.
Essa última parte é o que garante um lugar ao componente em um robô autoequilibrado. Sem realimentação das rodas, um robô autoequilibrado pode permanecer ereto, mas não sabe onde está—mantém a vertical perfeitamente enquanto percorre a sala. O encoder fecha essa lacuna.
Por que a caixa de engrenagens metálicas importa aqui
Um motorredutor com caixa plástica, como o motorredutor TT, é perfeitamente adequado a um seguidor de linha, que quase sempre avança. Um robô autoequilibrado representa uma carga diferente: inverte de direção continuamente, centenas de vezes por segundo e em incrementos pequenos.
Toda caixa de engrenagens tem folga—uma pequena zona morta em que as engrenagens se desencaixam e a saída não se move até os dentes voltarem a se encaixar do outro lado. Em uma caixa plástica, essa zona morta é grande; em um robô autoequilibrado, ela fica exatamente onde a correção mais importa: no instante da inversão, quando as rodas precisam responder agora. O resultado é um robô que oscila em torno da vertical e nunca se estabiliza completamente, por mais cuidadosamente que os ganhos sejam ajustados.
Engrenagens metálicas não eliminam a folga, mas a reduzem o suficiente para que a malha consiga cumprir sua função. A folga restante pode ser medida em cerca de dez minutos—veja como.
Lendo o encoder
O encoder produz duas ondas quadradas defasadas em 90°—quadratura padrão. A relação de fase informa a direção; contar as bordas informa a distância.
| Fio (típico) | Conecta-se a | Observações |
|---|---|---|
M1, M2 |
Saídas do driver de motor | O motor propriamente dito; a polaridade define a direção |
VCC |
3,3 V ou 5 V | Alimentação do encoder, não a do motor |
GND |
Massa | Comum ao controlador |
C1 |
Pino compatível com interrupções | Canal A do encoder |
C2 |
Qualquer pino digital | Canal B do encoder |
As cores dos fios variam entre fornecedores; portanto, consulte a ficha do produto em vez de presumir. O erro mais traiçoeiro é alimentar o encoder pela trilha dos motores: o encoder precisa de uma alimentação lógica limpa, e alimentá-lo com a tensão do motor pode danificá-lo ou preencher as contagens com ruído toda vez que o motor comuta.
Conecte o canal A a um pino compatível com interrupções. Consultar um encoder em loop() em um robô autoequilibrado perde contagens, e contagens perdidas fazem a malha externa perder lentamente o rastreamento da posição do robô.
Escolhendo uma relação
A relação de redução define o equilíbrio entre torque e velocidade, e um robô autoequilibrado precisa dos dois:
- Relação alta demais (1:250 ou mais) oferece torque suficiente, mas as rodas não giram rápido o bastante para recuperar um corpo em queda.
- Relação baixa demais (1:30 ou menos) gira rápido, mas não consegue mover a massa do robô com força suficiente.
Cerca de 1:100 a 12 V—aproximadamente 200 RPM—é um ponto de partida confiável para um robô pequeno. Se o seu se recupera de pequenas perturbações, mas perde as maiores, você provavelmente precisa de mais velocidade, não de mais ganho.
Acionando-o
Combine o N20 com um TB6612FNG, não com um L298N. O motivo é a queda de tensão: o L298N perde cerca de 2 V em seu estágio de saída, portanto uma parte grande da potência da bateria nunca chega ao motor, e pequenos comandos de correção ficam abaixo da tensão mínima necessária para movimentá-lo. Em um robô autoequilibrado, essa zona morta fica exatamente onde existem as correções finas.
Alimente-o com um conjunto de baterias capaz de fornecer a corrente de travamento dos dois motores ao mesmo tempo sem que a tensão caia—uma queda de tensão reinicia o microcontrolador no meio de uma correção, e o robô cai por motivos que não têm relação com a malha de controle.
Calculando as contagens por volta da roda
Este é o número de que depende todo cálculo de distância, e também aquele que as pessoas erram com mais frequência—normalmente por um fator de quatro.
contagens por volta da roda = PPR x 4 x relação de redução
O encoder magnético fornece 7 pulsos por volta do motor em cada canal. Quadratura significa dois canais defasados em 90°, o que produz quatro bordas contáveis por ciclo de pulso. E a caixa de engrenagens faz o motor girar várias vezes a cada volta da roda.
| Relação de redução | Contagens por volta da roda (×4) | Resolução em uma roda de 43 mm |
|---|---|---|
| 1:30 | 840 | 0,16 mm |
| 1:50 | 1400 | 0,10 mm |
| 1:100 | 2800 | 0,048 mm |
| 1:150 | 4200 | 0,032 mm |
| 1:298 | 8344 | 0,016 mm |
A distância é calculada diretamente:
mm por contagem = (pi x wheel_diameter_mm) / counts_per_revolution
Há duas armadilhas nessa primeira fórmula. O ×4 só é correto se você realmente contar quatro bordas—as duas bordas de cada canal. Muitos códigos de exemplo contam apenas bordas de subida no canal A, o que equivale a ×1; usar uma constante ×4 com contagem ×1 torna toda distância incorreta exatamente por um fator de quatro. E a relação de redução impressa no motor muitas vezes é aproximada: um N20 “1:100” frequentemente é 1:99,5 ou 1:100,37. Para odometria em qualquer distância, calibre empiricamente: empurre o robô exatamente 2 m e divida.
Contando as bordas sem perder nenhuma
A 200 RPM através de uma caixa 1:100, o eixo do motor gira a 20.000 RPM, fornecendo
20000/60 × 7 × 4 ≈ 9300 edges per second per motor. Dois motores somam quase 19.000 interrupções por
segundo, e isso é em velocidade máxima, sem carga.
O manipulador da interrupção precisa ser realmente pequeno:
volatile long countL = 0;
// Full x4 decoding, table-driven. Both channels, both edges.
const int8_t QUAD_TABLE[16] = {0,-1,1,0, 1,0,0,-1, -1,0,0,1, 0,1,-1,0};
volatile uint8_t prevL = 0;
void isrLeft() {
uint8_t now = (digitalRead(ENC_L_A) << 1) | digitalRead(ENC_L_B);
countL += QUAD_TABLE[(prevL << 2) | now];
prevL = now;
}
void setup() {
pinMode(ENC_L_A, INPUT_PULLUP);
pinMode(ENC_L_B, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENC_L_A), isrLeft, CHANGE);
attachInterrupt(digitalPinToInterrupt(ENC_L_B), isrLeft, CHANGE);
}
long readCount() { // long is not atomic on an 8-bit AVR
noInterrupts();
long v = countL;
interrupts();
return v;
}
Três detalhes importam:
volatile e uma leitura atômica. Um long ocupa quatro bytes em um AVR e é lido um byte por vez. Uma interrupção no meio da leitura fornece um valor com metade do dado antigo e metade do novo—o que produz um salto enorme ocasional na odometria, aleatoriamente, aproximadamente uma vez a cada alguns milhares de leituras.
A tabela de consulta decodifica a transição em vez de adivinhar a direção a partir de um único canal. Ela também rejeita naturalmente transições inválidas (os dois bits mudando simultaneamente, o que indica que uma borda foi perdida) e contribui com zero.
Pressão sobre os pinos. A decodificação completa ×4 em dois motores precisa de quatro pinos compatíveis com interrupções, e um Arduino Uno tem exatamente dois. As opções são: usar decodificação ×2 (um canal por motor, CHANGE), o que reduz a resolução à metade e ainda fornece a direção; mudar para uma placa com mais pinos de interrupção, como um Mega ou ESP32; ou usar interrupções por alteração de pino, suportadas por todos os pinos AVR, mas que exigem tratar uma porta inteira de uma vez.
Velocidade a partir das contagens
Posição é uma contagem. Velocidade exige uma diferença ao longo do tempo, e a forma de calculá-la determina se a malha de controle é utilizável.
long lastCount = 0;
unsigned long lastMicros = 0;
float speedMmPerSec() {
long c = readCount();
unsigned long t = micros();
float dt = (t - lastMicros) * 1e-6f;
if (dt < 0.005f) return lastSpeed; // too short: quantisation dominates
float mm = (c - lastCount) * MM_PER_COUNT;
lastCount = c; lastMicros = t;
lastSpeed = mm / dt;
return lastSpeed;
}
A proteção dt é a linha importante. Amostrar rápido demais significa dividir uma diferença de uma ou duas contagens por um intervalo minúsculo; o erro de quantização domina e a “velocidade” é principalmente ruído—um termo derivativo em uma malha PID ampliará esse ruído.
Existem duas maneiras honestas de medir a velocidade com um encoder, adequadas a extremos diferentes da faixa. Contar bordas em uma janela fixa (o código acima) funciona bem em alta velocidade e mal em baixa, quando chegam poucas bordas por janela. Cronometrar o intervalo entre bordas faz o contrário: é excelente em baixa velocidade e ruidoso em alta. Um robô que precisa das duas extremidades normalmente alterna entre os métodos a partir de um limiar.
Solução de problemas
| Sintoma | Causa provável | Solução |
|---|---|---|
| As contagens são 4× menores do que deveriam | Você está contando uma borda e usando uma constante ×4 | Decodifique as quatro bordas ou corrija a constante |
| As contagens aumentam nas duas direções | Apenas um canal está sendo lido | A quadratura precisa dos dois canais — use o decodificador por tabela |
| Ocorre um salto enorme ocasional na posição | Leitura não atômica de um long |
Proteja a leitura com noInterrupts() |
| As contagens derivam com o motor parado | Ruído elétrico nas linhas do encoder | Alimente o encoder com uma fonte limpa, não pela trilha do motor; torça o par de fios |
| Contagens são perdidas em alta velocidade | Manipulador de interrupção lento ou consulta periódica | Mantenha a ISR mínima; nunca faça consultas periódicas |
| As distâncias ficam consistentemente 2–3% erradas | Relação de redução e diâmetro nominais da roda | Calibre ao longo de 2 m e derive os milímetros por contagem |
| Uma roda faz contagens e a outra não | O canal do encoder não está conectado a um pino de interrupção | Verifique a capacidade do pino; um Uno só tem D2 e D3 |
| O encoder parou de funcionar após a ligação | A tensão do motor foi aplicada ao VCC do encoder | O encoder precisa de lógica de 3,3–5 V, nunca da trilha do motor |
| A posição do robô deriva ao longo de uma execução longa | A odometria não tem limite por natureza | Esperado — corrija-a com uma referência absoluta |
N20 ou motorredutor TT?
| Motorredutor TT | Motorredutor N20 de engrenagens metálicas | |
|---|---|---|
| Caixa | Plástica | Metálica |
| Folga | Grande — vários graus na saída | Pequena |
| Tamanho | Volumoso | Do tamanho de uma bateria AA |
| Tensão | 3–6 V | Variantes de 6–12 V |
| Relações disponíveis | Essencialmente uma (~1:48) | 1:30 a 1:298 |
| Encoder | Acessório vendido separadamente, difícil de instalar | Magnético integrado, padrão |
| Custo | ~US$ 2 | ~US$ 8 |
| Melhor para | Seguidores de linha, primeiros robôs | Robôs autoequilibrados, odometria precisa, espaços apertados |
O fator decisivo raramente é o torque; quase sempre são a folga e a realimentação. Um seguidor de linha avança quase sempre e é orientado por um sensor que observa o piso—nunca percebe a folga da caixa, e um motor TT é a resposta certa e barata. Um robô autoequilibrado inverte de direção centenas de vezes por segundo em incrementos minúsculos; portanto, a zona morta de cada inversão é exatamente onde sua correção precisa atuar, e engrenagens plásticas tornam a malha instável, qualquer que seja o ajuste.
A mesma lógica vale para um solucionador de labirinto: ele navega contando a distância percorrida, portanto a perda de movimento em cada curva se acumula diretamente em um erro de posição.
Onde é usado
- Robô autoequilibrado — os motores de tração, com os encoders alimentando a malha externa de posição
Explore o grafo
Usado nestas montagens
Projetos, caminhos de aprendizagem e simuladores que incluem Motorredutor com encoder N20.
- ProjetoConstrua um micromouse para resolver labirintos
- ProjetoConstrua um robô autoequilibrador com MPU6050 e PID
- ProjetoConstrua um robô de cobertura que percorre todo o ambiente
- ProjetoConstrua um robô Mecanum que se desloca lateralmente
- ProjetoConstrua um robô mini sumo: preensão, cunha e detecção de borda
- ProjetoConstrua um robô ROS 2 que vê e segue até um marcador
- ProjetoConstrua um rover GPS de pontos de passagem que dirige sozinho
- Caminho de aprendizagemAcionamento holonômico: mover-se de lado sem girar
Comparar
Alternativas
Perguntas
Perguntas frequentes sobre Motorredutor com encoder N20
O que é um motorredutor com encoder N20?
Um N20 é um micro motorredutor de aproximadamente 12 por 10 por 26 mm com caixa de engrenagens metálicas; a versão com encoder acrescenta um pequeno disco magnético e um sensor na parte traseira do eixo do motor. A caixa oferece muito mais torque do que o tamanho sugere, e o encoder informa até onde o eixo realmente girou, não até onde você pediu que ele girasse.
Por que robôs autoequilibrados usam motores N20 em vez de motores TT?
Por dois motivos. A caixa metálica tem muito menos folga do que a caixa plástica de um motor TT, e a folga é prejudicial a um robô autoequilibrado—toda vez que o motor inverte, a folga da caixa gasta os primeiros poucos graus de correção sem produzir efeito. O encoder também fornece à malha externa a posição real das rodas, o que permite ao robô permanecer no lugar em vez de derivar.
Quantas contagens um N20 fornece por volta da roda?
Multiplique os pulsos do eixo do motor pela relação de redução. Um encoder típico fornece 7 pulsos por volta do motor em cada canal; em uma caixa 1:100, isso equivale a 700 pulsos por volta da saída, ou 2800 contagens se você decodificar as quatro bordas de quadratura. Confirme sempre o valor do seu motor específico, pois a contagem de pulsos e a relação exata variam entre fornecedores.
Posso acionar um N20 diretamente por um pino do Arduino?
Não. Um N20 consome várias centenas de miliamperes em funcionamento e cerca de 700 mA em travamento, muito acima do que um pino pode fornecer, e a tensão induzida pela desenergização pode danificá-lo. Use um driver de motor como o TB6612FNG, cuja queda de tensão é suficientemente baixa para que pequenos comandos de correção ainda movimentem o motor.
Que relação de redução devo escolher para um robô autoequilibrado?
Algo na faixa de 1:50 a 1:150 costuma ser o melhor equilíbrio. Uma relação alta demais oferece bastante torque, mas as rodas não conseguem acelerar rápido o bastante para recuperar uma queda; uma relação baixa demais gira rapidamente, mas não tem força suficiente para mover a massa do robô. Cerca de 1:100 a 12 V, fornecendo aproximadamente 200 RPM, atende a um pequeno robô autoequilibrado típico.
Leitura complementar