Solucionador de labirintos de linhas com memória de rota LSRB
Um robô que explora sozinho um labirinto de linhas de fita, lembra cada junção encontrada e depois percorre a rota mais curta da partida ao fim sem um único desvio errado.
Um robô seguidor de linha segue. Um solucionador de labirintos de linhas decide. Esse é todo o salto que este projeto faz, e ele é maior do que parece: o robô deixa de ser um laço de controle com rodas e se torna algo que explora um ambiente que nunca viu, lembra do que encontrou e age com base nessa memória.
O truque é que nada disso substitui o robô seguidor de linha — ele fica por cima de um. Por baixo, a mesma matriz de refletância e o mesmo laço PID mantêm o robô centralizado na fita, sem saber nada sobre labirintos. Acima, uma camada fina de decisão observa os momentos em que a linha se ramifica, classifica o tipo de junção, escolhe uma direção e anota um caractere. Essa separação é o que torna o projeto tratável, e é a mesma divisão em duas camadas que robôs reais usam em todo lugar.
Por isso a ordem de construção importa mais do que o normal. Você obtém seguimento de linha realmente estável primeiro — ajustado no simulador e depois em um grande ovado de fita real — e só então adiciona junções. Pular essa disciplina faz cada problema mecânico, cada deriva de calibração e cada roda desalinhada em 2 mm aparecer disfarçado como erro do solucionador de labirintos.
Siga a árvore tecnológica abaixo de cima para baixo. Cada nó é liberado quando seus pré-requisitos são concluídos, e seu progresso é salvo neste dispositivo, para que você possa construir o robô durante um fim de semana sem perder o progresso.
Lista de materiais
| Peça | Qtd. | Custo aproximado | Observações |
|---|---|---|---|
| Arduino Nano | 1 | US$ 5 | A0–A7 fornece oito canais analógicos; os seis de um Uno não bastam |
| Matriz de refletância IR, 8 canais | 1 | US$ 8–12 | Oito e analógica. A detecção de junções precisa dos sensores externos |
| TB6612FNG | 1 | US$ 3 | Vale a pena aqui: a queda de ~2 V do L298N atrapalha os movimentos precisos em baixa velocidade |
| Motorredutor TT | 2 | US$ 4 | Versões com encoder são fortemente recomendadas para viradas repetíveis |
| Chassi 2WD | 1 | US$ 6–10 | |
| Pacote de bateria | 1 | US$ 6 | 2×18650, suporte protegido |
| Fita preta fosca, 19 mm | 1 rolo | US$ 3 | E um piso ou quadro claro grande para montar o labirinto |
Total: aproximadamente US$ 35–45. A matriz de 8 canais é a peça em que não vale economizar, e o motivo é específico: um robô detecta um ramo esquerdo notando que os sensores mais à esquerda escureceram enquanto o centro ainda está na linha. Uma matriz apenas um pouco mais larga que a fita não consegue ver isso fisicamente, então a detecção de junções vira tentativa e erro, por mais bom que seja o código.
Por que a matriz precisa ser mais larga que a linha
left branch array (8 channels, ~60 mm wide)
────────────────┐ [ x x x . . . . . ] outer left dark -> a branch
│
════════════════╪═══════ [ . . . x x . . . ] centre still on the line
│
Regra prática: a matriz deve ter pelo menos três vezes a largura da fita. Para fita de 19 mm, isso dá cerca de 60 mm, exatamente o que uma matriz de 8 canais com espaçamento de 8 mm oferece. Mais estreita, e o robô não consegue distinguir “a linha curvou fortemente” de “a linha fez um ramo”, que é a decisão central de todo o projeto.
Construa em marcos
A ordem de construção importa mais aqui do que em qualquer outro projeto deste site. Um solucionador de labirintos é um robô seguidor de linha com uma camada de decisão, e cada falha mecânica ou de calibração no seguidor reaparece disfarçada como erro do solucionador de labirintos.
| # | Marco | O teste | Uma aprovação parece |
|---|---|---|---|
| 1 | O seguimento de linha funciona | Dez voltas em um grande ovado simples | Zero perdas. Não “quase” — zero |
| 2 | Repetibilidade da virada | Comande um giro de 90° dez vezes e meça | Dentro de ±3° e repetível |
| 3 | Junção vista | Passe lentamente por um T e imprima a matriz | Sensores externos escurecem antes do centro |
| 4 | Junção classificada | Passe lentamente por cada tipo de junção | Esquerda / direita / T / cruz / beco sem saída nomeados corretamente |
| 5 | Uma virada executada | Encontre um ramo à esquerda, vire à esquerda e retome o seguimento | Ele reencontra a linha e continua |
| 6 | Rota registrada | Dirija um pequeno labirinto e imprima a sequência | Uma sequência como LSRB correspondente ao que você observou |
| 7 | Simplificação LSRB | Passe a rota registrada pelo simplificador | LBL vira S, e todas as regras funcionam corretamente |
| 8 | Segunda passagem | Percorra a rota simplificada | Chega ao objetivo sem viradas erradas e sem explorar |
| 9 | Labirinto completo | Um labirinto com vários becos sem saída | Explora, simplifica e então percorre a rota mais curta |
O marco 1 não é negociável. “Mais ou menos segue a linha” se transforma em “às vezes inventa uma junção”, e você passará uma noite depurando simplificação de caminho por uma falha que é realmente uma roda 2 mm fora de alinhamento.
O marco 2 é aquele que as pessoas pulam. Um solucionador de labirintos executa centenas de viradas por passagem, e uma virada que fica sistematicamente 5° curta se acumula até o robô deixar a linha completamente. É exatamente aqui que a folga do redutor aparece — erro que muda de sinal com a direção de giro é mecânico, não um problema de ajuste.
A divisão em duas camadas, no código
Vale ver explicitamente a separação que torna este projeto tratável:
┌─────────────────────────────────────┐
decision │ classify junction -> choose turn │ runs only at junctions
layer │ record a character -> simplify │ knows nothing about PWM
└──────────────────┬──────────────────┘
│ "turn left" / "keep going"
┌──────────────────▼──────────────────┐
following │ read array -> position -> PID │ runs every loop, ~200 Hz
layer │ -> left and right wheel speeds │ knows nothing about mazes
└─────────────────────────────────────┘
A camada inferior nunca aprende o que é um labirinto. A camada superior nunca toca em um motor. Quando algo dá errado, essa fronteira indica em qual metade procurar — e se você não consegue dizer em qual metade um erro vive, as camadas não estão corretamente separadas.
Como fica um bom resultado
| Medição | Típico |
|---|---|
| Velocidade de exploração | 0,15–0,25 m/s — lenta o bastante para classificar junções com confiabilidade |
| Velocidade da segunda passagem | 0,3–0,5 m/s — sem decisões a tomar, então pode acelerar |
| Precisão da classificação de junções | 100%. Qualquer coisa menos que isso torna a rota registrada errada |
| Repetibilidade das viradas | ±3° |
| Simplificação da rota | Uma rota de exploração de 30 caracteres normalmente reduz a 8–12 |
A precisão das junções é realmente tudo ou nada, e isso surpreende as pessoas. Uma junção mal interpretada corrompe a sequência registrada; o simplificador então produz uma rota com aparência válida, mas errada, e a segunda passagem avança com confiança contra uma parede. Não existe crédito parcial — por isso as passagens de exploração são lentas e a segunda passagem é onde você recupera o tempo.
Solução de problemas
| Sintoma | Causa provável | Correção |
|---|---|---|
| Vê junções que não existem | Curva fechada lida como ramo | Alargue a matriz; exija que os sensores externos permaneçam escuros por uma distância mínima |
| Perde junções | Dirige rápido demais, ou matriz estreita demais | Diminua a velocidade da exploração; verifique se a matriz tem largura ≥3× a da fita |
| Viradas inconsistentes | Folga ou ausência de encoders | Sempre se aproxime de uma virada da mesma maneira; meça a folga |
| A rota registrada tem caracteres extras | Junção detectada duas vezes | Adicione um tempo morto após uma junção antes de procurar a próxima |
| A simplificação produz uma rota errada | Regra aplicada na ordem errada | Teste LBL→S, LBR→B, SBL→R e similares isoladamente primeiro |
| A segunda passagem falha na primeira virada | Rota registrada em relação à orientação errada | A sequência é de viradas relativas — verifique a convenção |
| Funciona em um labirinto, não em outro | Espaçamento das junções curto demais para o tempo morto | Reduza o tempo morto ou diminua ainda mais a velocidade |
| Perde a linha depois de uma virada | A virada ultrapassa a nova linha | Vire até os sensores centrais reencontrarem a linha, em vez de usar um ângulo fixo |
| A deriva piora durante a passagem | Bateria caindo, alterando os ganhos efetivos | Feche um laço de velocidade com encoders |
Para onde seguir
Adicione encoders e vire por distância, não por tempo. Viradas cronometradas são a maior fonte de confiabilidade perdida em um primeiro solucionador de labirintos, porque o tempo necessário muda com a tensão da bateria e a superfície. Viradas baseadas em encoder não têm esse problema.
Migre para um labirinto com paredes — o micromouse — que troca a fita por paredes e a regra LSRB por flood fill. Esse é o salto realmente maior: LSRB é uma heurística de seguimento de parede que encontra um caminho, enquanto o flood fill calcula o caminho mais curto e replaneja quando novas paredes são descobertas.
Otimize a segunda passagem. Depois que a rota é conhecida, não restam decisões, então o robô pode acelerar nas retas e desacelerar somente nas viradas. Um perfil de movimento sobre a rota conhecida é onde vêm as grandes melhorias de tempo — muitas vezes cortando pela metade a segunda passagem.
Roteiro do projeto
O caminho de construção
Siga a árvore tecnológica das peças até um robô funcionando. Cada nó é desbloqueado quando seus pré-requisitos são concluídos, e seu progresso fica salvo neste dispositivo.
0 / 21 concluídos
Componentes
- ControladorArduino UnoA placa de 8 bits que tolera erros de ligação, pela qual a maioria das pessoas começa na robótica.
- SensorMatriz de sensores IRUma fileira de olhos infravermelhos que informa ao robô onde está a linha.
- DriverDriver de motor TB6612FNGUma ponte H com MOSFET que preserva a tensão que você realmente pagou.
- AtuadorMotorredutor CC (motor TT)O motorredutor amarelo que transforma um chassi nu em um carro robô móvel.
- ChassiChassi de robô 2WDA plataforma onde se fixam dois motores, uma rodinha livre e toda a eletrônica.
- AlimentaçãoBateria e fonte de alimentação do robôA diferença entre um robô que funciona e outro que fica reiniciando.
Tutoriais deste caminho
- Iniciante · 20 min de leituraConstrua um robô seguidor de linha: dos sensores ao controle PIDDos sensores de reflectância infravermelha ao erro ponderado e ao controle PID: como funciona de fato um robô seguidor de linha.
- Iniciante · 20 minMatriz de sensores infravermelhos para robô seguidor de linhaTransforme uma fileira de sensores infravermelhos em uma posição suave da linha para comandar a direção do robô.
- Iniciante · 18 min de leituraComo ajustar um controlador PID: guia práticoUma ordem prática para ajustar os ganhos P, I e D sem tentativas aleatórias — e como testar cada etapa ao vivo.
- Intermediário · 14 min de leituraDetecção de interseções em labirintos de linhas com um arranjo IRClassifique cruzamentos, curvas, becos sem saída e a chegada com um arranjo de reflexão, resolvendo os casos ambíguos.
- Intermediário · 15 min de leituraSimplificação de caminho LSRB para robôs de labirinto de linhasRegistre as curvas como L, S, R e B e depois colapse cada desvio de beco sem saída na rota ótima.
Pratique antes de fazer a fiação
Ajuste no simulador ao vivo
O caminho de construção passa por um laboratório no navegador. Acerte o comportamento aqui e depois transfira suas configurações para o robô real.
Perguntas frequentes
Como faço um robô solucionador de labirintos com Arduino?
Comece com um robô seguidor de linha funcional: uma matriz de refletância, um laço PID e um driver de motores. Depois adicione uma camada de decisão que percebe junções, escolhe um ramo pela regra da mão esquerda e registra cada decisão de rota como um de quatro caracteres — L, S, R ou B. Quando o robô chega ao fim, regras de substituição eliminam cada desvio de beco sem saída da sequência, e a segunda passagem segue a rota simplificada. Este caminho percorre toda a cadeia, e você ajusta primeiro a camada de seguimento em um simulador do navegador.
O que é o algoritmo LSRB em um robô seguidor de linha?
LSRB significa esquerda, reto, direita e voltar — as quatro decisões que um robô pode tomar em uma junção. O robô registra um caractere por junção durante a exploração, e cada B marca um beco sem saída do qual precisou sair de ré. Seis regras de substituição trocam cada janela de três caracteres centrada em um B pela única manobra que teria o mesmo efeito, removendo o desvio por completo. Repita até não restar nenhum B e você terá a rota mais curta.
Qual é a diferença entre um labirinto de linhas e um labirinto com paredes?
Um labirinto de linhas é feito de fita preta sobre um quadro claro e medido por uma matriz de refletância voltada para baixo; um labirinto com paredes — o formato Micromouse — tem paredes físicas medidas por sensores de distância. A medição é completamente diferente, mas a camada acima é a mesma: explore para construir conhecimento e depois percorra a melhor rota. Um labirinto de linhas é muito mais barato de construir, e por isso competições de escolas e colégios normalmente usam um.
Preciso comprar peças antes de começar este projeto?
Não. A camada de seguimento de linha, seus ganhos de PID e o comportamento de explorar e depois otimizar rodam nos simuladores do navegador, então você pode entender o robô inteiro antes de gastar qualquer coisa. Somente as últimas quatro etapas — fiação, calibração, a passagem de exploração e a repetição — precisam do Arduino físico, da matriz de sensores, do driver, dos motores, do chassi e da bateria.
Por que meu robô solucionador de labirintos vira nas junções erradas?
Quase sempre porque decide cedo demais. O padrão instantâneo dos sensores não consegue distinguir uma junção em T de um cruzamento — ambas são lidas como preto em toda a matriz. O robô precisa registrar quais ramos apareceram, avançar aproximadamente um comprimento de robô e ler novamente para descobrir se a linha também continuava em frente. Decidir na primeira leitura é a causa mais comum de viradas erradas com confiança.
O LSRB funciona em qualquer labirinto?
Somente em um labirinto perfeito — sem ciclos, em que exatamente um caminho conecta quaisquer dois pontos. Labirintos de linhas com fita quase sempre são assim. Se o labirinto contiver um ciclo, a regra da mão esquerda pode ficar dando voltas para sempre e não haverá beco sem saída para as regras simplificarem; nesse ponto você precisa de um mapa real e de uma busca em grafo, como flood fill.