Caminho de construçãoIntermediárioUm fim de semana

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.

Esquema técnico de Solucionador de labirintos de linhas com memória de rota LSRBJUNCTIONS → L S R B → ROUTEBB

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

100%
Componente

Adicione a matriz de refletância

Componente

Ver componente
Componente

Adicione os motores de tração

Componente

Ver componente
Caminho de aprendizagem

Controle PID

Caminho de aprendizagem

Abrir caminho
Simulador

Ajuste a camada de seguimento de linha

Interativo

Abrir simulador
Caminho de aprendizagem

Controle de motores

Caminho de aprendizagem

Abrir caminho
Montagem

Conecte o robô

45 min

Montagem

Calibre na sua própria pista

20 min

Montagem

Estabilize o seguimento de linha sem labirinto

60 min

Montagem

Execute a passagem de exploração

45 min

Montagem

Repita a rota simplificada

30 min

Objetivo

Robô solucionador de labirintos de linhas concluído

Você construiu

Componentes

Tutoriais deste caminho

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.