Construa um robô com desvio de obstáculos
Um robô que percorre o ambiente sozinho, detecta obstáculos, procura aberturas e vira para espaços livres, com componentes que você compreendeu e ajustou primeiro na simulação.
Um robô com desvio de obstáculos é a próxima construção natural depois de um robô seguidor de linha. Um robô seguidor de linha segue — acompanha uma linha que alguém desenhou para ele. Este robô decide: sem traçado nem mapa, ele detecta o espaço ao redor e escolhe para onde ir. Essa única diferença — reagir ao ambiente em vez de seguir um traçado — é o primeiro contato real com a autonomia, e ainda é simples o bastante para ser compreendido por completo.
O núcleo é um laço curto e repetitivo: detectar–varrer–decidir–virar. O sensor ultrassônico HC-SR04 emite um pulso à frente e mede o tempo do eco para estimar a distância; quando algo fica mais próximo do que um limite de segurança, o robô para, varre o sensor para a esquerda e para a direita com um servo SG90 e vira para a direção mais livre. Esse limite não é arbitrário — é uma distância de segurança calculada a partir da velocidade atual, da latência entre detecção, decisão e atuação, da distância de frenagem (que cresce com o quadrado da velocidade), do raio do robô e de uma margem, todos visíveis na curva de distância de parada do simulador.
Você acrescenta a um robô móvel os componentes de que ele precisa e aprende o que cada um faz: um Arduino Uno com lógica de 5 V que tolera erros de fiação, o sensor ultrassônico e sua zona cega (a distância mínima abaixo da qual ele não consegue informar), o servo que dá ao feixe um segundo ponto de vista, a ponte H L298N que comuta a corrente dos motores que os pinos lógicos não conseguem fornecer, dois motoresredutores TT em que o redutor troca velocidade por torque utilizável, um chassi 2WD com rodízio para direção diferencial e um pacote de bateria que precisa alimentar motores e lógica em trilhos separados. A árvore tecnológica também percorre dois caminhos de aprendizagem, controle de motores e navegação reativa; então as mesmas ideias de PWM, odometria e filtragem que você conheceu no robô seguidor de linha retornam aqui em um contexto de navegação.
Depois, antes de gastar dinheiro ou arriscar uma fiação errada, ajuste o comportamento de desvio no simulador do navegador até que o robô desvie com segurança em um ambiente obstruído. A área de trabalho lá é vista de cima e é bidimensional, com raios instantâneos e sem ruído; um feixe ultrassônico real se espalha por cerca de 15°, é bloqueado pelo próprio corpo do robô e é perturbado por superfícies moles ou inclinadas, então filtre as leituras com um filtro de mediana e adicione um pequeno atraso de estabilização depois que o servo se move antes de confiar em uma distância na montagem real. Encontrar uma distância de parada segura e uma regra que escolha a direção mais livre na simulação elimina a maior parte das suposições antes de o robô se mover.
Só então você conecta o robô real — trigger e echo na tensão correta, sinal do servo em um pino com capacidade PWM, PWM e direção dos motores no driver, bateria dos motores somente no terminal VM do driver e todos os terras unidos — e deixa o robô percorrer um piso com caixas ou cadeiras. As mesmas lições de medição e filtragem levam diretamente ao Micromouse em labirinto com paredes, caso você queira aprender mapeamento depois, ou à navegação ROS 2 se adicionar um Raspberry Pi.
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 ponto.
Lista de materiais
| Peça | Qtd. | Custo aproximado | Observações |
|---|---|---|---|
| Arduino Uno | 1 | US$ 5–8 | A lógica de 5 V realmente ajuda aqui — o echo do HC-SR04 é 5 V |
| HC-SR04 | 1 | US$ 2 | Um VL53L0X é um bom segundo sensor, não um substituto |
| Servo SG90 | 1 | US$ 2 | Para o conjunto de varredura. Use MG90S se ele precisar funcionar por horas |
| L298N | 1 | US$ 2–4 | Ou um TB6612FNG, que consome muito menos da bateria |
| Motorredutor TT | 2 | US$ 4 | |
| Chassi 2WD | 1 | US$ 6–10 | |
| Pacote de bateria | 1 | US$ 6 | 6×AA NiMH ou 2×18650 |
| Sensores de batida | 2 | US$ 1 | Adicione-os. Veja abaixo |
Total: aproximadamente US$ 30–40.
Os dois sensores de batida são os melhores quarenta centavos do robô, e são a parte que a maioria das construções deixa de fora. Todo sensor de distância tem superfícies que não consegue detectar: um sonar não detecta cortinas nem paredes vistas em ângulo muito inclinado. E um robô sem detecção de contato empurrará uma cortina até algo ceder. Dois sensores atrás de um para-choque envolvente transformam “geralmente evita as coisas” em “nunca fica preso em algo que não pôde detectar”.
Como tudo se conecta
| De | Para | Observação |
|---|---|---|
VCC, GND do HC-SR04 |
5 V, GND | ~15 mA, com picos durante um pulso |
Trig do HC-SR04 |
D9 | Qualquer pino digital |
Echo do HC-SR04 |
D10 | Saída de 5 V — funciona no Uno, exige divisor em uma placa de 3,3 V |
| Sinal do servo | D6 | A biblioteca Servo usa o Timer 1, que também gera PWM em D9/D10 |
| Alimentação do servo | 5 V separada, terra comum | 650 mA com o servo em travamento — não o pino de 5 V do Arduino |
ENA, ENB do driver |
D5, D3 | Pinos com capacidade PWM. Remova os jumpers de habilitação do L298N |
IN1–IN4 do driver |
D8, D7, D4, D2 | |
| Sensores de batida | D11, D12, INPUT_PULLUP |
COM ao terra, NO ao pino |
+ da bateria |
VM / +12V do driver |
Nunca o Arduino |
| Todos os terras | Um ponto | Arduino, driver, fonte do servo, negativo da bateria |
Preste atenção ao conflito de temporizador: a biblioteca Servo assume o Timer 1, que no Uno gera PWM nos pinos 9 e 10. Coloque o PWM dos motores em 3, 5, 6 ou 11 e o servo em qualquer pino, e o problema nunca acontece. Coloque a habilitação de um motor no pino 9 e seu controle de velocidade parará silenciosamente de funcionar no momento em que você conectar um servo.
A distância de parada, calculada em vez de adivinhada
O limite de parada é o número mais importante deste projeto, e ele não é arbitrário. É a soma de quatro distâncias:
stop_distance = (v x t_latency) + (v^2 / (2 x a_brake)) + robot_radius + margin
| Termo | De onde vem | Típico |
|---|---|---|
| Latência de detecção e decisão | Pulso (até 25 ms), estabilização do servo, período do laço | 60–100 ms |
| Distância de frenagem | Velocidade ao quadrado dividida pelo dobro da desaceleração | Cresce rapidamente |
| Raio do robô | Da frente do chassi ao centro de pivô | 80–100 mm |
| Margem | Porque o cone do sensor tem 15° de largura e pode fornecer leituras imprecisas em superfícies macias | 50 mm |
Calculado para um robô a 0,3 m/s com 80 ms de latência e desaceleração de 1,0 m/s²:
= (0.3 x 0.08) + (0.09 / 2.0) + 0.09 + 0.05
= 0.024 + 0.045 + 0.09 + 0.05 = 0.21 m
Então cerca de 21 cm. Agora aumente a velocidade para 0,6 m/s:
= 0.048 + 0.18 + 0.09 + 0.05 = 0.37 m
O limite não dobrou — ele cresceu 76%, porque o termo de desaceleração acompanha o quadrado da velocidade. É por isso que um robô que evita obstáculos com confiabilidade mesmo em baixa velocidade começa a bater nas coisas quando você acelera, e por isso a solução é um limite dependente da velocidade, e não um único número fixo grande que deixa o robô tímido em todo lugar.
Construa em marcos
| # | Marco | O teste | Um resultado aprovado |
|---|---|---|---|
| 1 | Os motores giram | Avançar, dar ré e girar para os dois lados sobre blocos | Os seis estados funcionam; você conhece a zona morta de cada roda |
| 2 | A distância é medida | Aponte para uma parede a 30 cm e imprima por um minuto | Leituras estáveis dentro de um ou dois centímetros, sem zeros |
| 3 | O tempo limite funciona | Aponte para o ar livre e para o teto | O laço mantém a taxa — ausência de eco não pode significar um robô congelado |
| 4 | Filtro de mediana | Agite uma mão repetidamente através do feixe | Leituras isoladas absurdas desaparecem; a aproximação real continua sendo registrada |
| 5 | O servo varre | Comande −60°, 0°, +60° e imprima a distância em cada um | Varredura repetível, com atraso de estabilização antes de cada pulso |
| 6 | Atraso de estabilização comprovado | Remova o atraso deliberadamente | As leituras ficam indefinidas entre os ângulos — agora você conhece essa falha |
| 7 | Limite de parada | Leve o robô contra uma parede e deixe-o parar | Ele para com a margem calculada, não por sorte |
| 8 | Decisão de virada | Coloque-o de frente para um canto com um lado livre | Ele vira para o lado livre, não aleatoriamente |
| 9 | Histerese | Deixe-o parado oscilando no limite | Ele toma uma decisão em vez de oscilar repetidamente |
| 10 | Recuperação após batida | Leve-o contra uma almofada | O sonar não a detecta, o sensor de batida detecta, e o robô recua e vira |
| 11 | Percurso livre | Cinco minutos em uma sala com obstáculos | Ele sobrevive; quando fica preso, você consegue identificar o estado |
O marco 10 é o que separa uma demonstração de um robô. Uma almofada absorve completamente o pulso ultrassônico, então o sensor informa espaço aberto e o robô entra nela em velocidade máxima. Sem uma chave de batida, ele empurra até os motores travarem.
Solução de problemas
| Sintoma | Causa provável | Correção |
|---|---|---|
| O robô congela em intervalos aleatórios | pulseIn sem tempo limite |
Passe um tempo limite de 25000 µs; trate “sem eco” explicitamente |
| Aciona a parada de emergência em uma sala vazia | Tratar um tempo limite como 0 cm | Um tempo limite significa longe, não perto. Retorne um valor sentinela |
| Entra em cortinas e almofadas | Som absorvido — física, não bug | Adicione sensores de batida |
| Bate nas paredes em ângulo | O pulso reflete para longe do receptor | Aplique a mesma correção; varra mais ângulos |
| Vira com convicção para uma parede | Leitura antes de o servo estabilizar | Adicione 100–200 ms depois de comandar o ângulo, antes de emitir o pulso |
| Oscila perto dos obstáculos | Um limite, sem histerese | Pare a 20 cm e não retome até 30 cm |
| O servo vibra e a placa reinicia | Corrente do servo fornecida pelo Arduino | Fonte separada de 5 V para o servo, com terra comum |
| O controle de velocidade dos motores parou | A biblioteca Servo assumiu o Timer 1 (pinos 9, 10) |
Mova o PWM dos motores para 3, 5, 6 ou 11 |
| Fica preso em um canto para sempre | Sem memória — inerente à navegação reativa | Adicione um componente aleatório e uma rotina de escape para detectar travamento |
| Desvia bem em baixa velocidade, mas colide em alta velocidade | Limite fixo e termo de desaceleração quadrático | Torne o limite dependente da velocidade |
| Leituras absurdas quando dois robôs passam juntos | Eles ouvem as emissões de pulso um do outro | Espaçar os pulsos no tempo |
Para onde seguir
Adicione seguimento de parede. Um robô que mantém uma distância fixa de uma parede em um lado atravessa uma sala de forma determinística, em vez de vagar, e é o primeiro comportamento que começa a parecer um plano. É uma pequena mudança de código e uma grande mudança conceitual.
Adicione um segundo tipo de sensor. Um VL53L0X falha em superfícies quase exatamente opostas às problemáticas para o sonar — foscas escuras e espelhos, em vez de macias e inclinadas. Juntos, eles cobrem muito mais da sala do que qualquer um sozinho.
Aceite o limite e siga em frente. Um robô reativo não pode ser enviado a um destino, não pode garantir que cobriu o piso e pode percorrer indefinidamente um contorno em uma sala em forma de ferradura. Essas propriedades decorrem da ausência de mapa, não são bugs. Quando começarem a importar, o micromouse acrescenta mapeamento e planejamento, e o robô de cobertura enfrenta diretamente a pergunta “eu já passei por todo lugar?”.
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 / 18 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.
- SensorSensor ultrassônico HC-SR04Um pulso de sonar em um pacote de dois dólares—como um robô sente os obstáculos.
- AtuadorServomotor SG90O servomotor de nove gramas presente na maioria dos braços, garras e direções de robôs.
- DriverDriver de motor L298NA ponte H dupla que transforma pinos lógicos fracos em potência para motores.
- 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 · 22 minO algoritmo de desvio de obstáculos: sinta, varra, decida, vireO laço sinta–varra–decida–vire que permite que um robô desvie de obstáculos sozinho.
- Iniciante · 20 minLer um sensor ultrassônico HC-SR04: distância confiável em códigoTransforme o envio e o retorno do pulso em uma distância estável em cm — com tempo limite e filtro de mediana.
- Iniciante · 18 minVarredura ultrassônica com servo para encontrar espaço livreVarra um HC-SR04 montado em um servo para encontrar a direção mais livre antes de girar.
- Iniciante · 18 min de leituraControle de motores CC com PWM e uma ponte HLigue e controle com segurança um motor CC com escovas usando PWM, uma ponte H e limites de corrente realistas.
- Intermediário · 20 min de leituraOdometria de acionamento diferencial a partir de encoders de rodaIntegre o movimento das rodas esquerda e direita na pose de um robô móvel e identifique e calibre a deriva.
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 funciona um robô com desvio de obstáculos?
Ele avança enquanto um sensor ultrassônico monitora a distância à frente. Quando algo fica mais próximo do que um limite definido, o robô para, gira o sensor para a esquerda e para a direita com um servo para medir a distância em cada direção e vira para o lado mais livre — depois retoma a marcha. Tudo isso é um laço curto detectar–varrer–decidir–virar executado muitas vezes por segundo.
Qual é o melhor sensor para um robô com desvio de obstáculos?
O sensor ultrassônico HC-SR04 é o padrão: é barato, fácil de conectar e confiável a alguns metros. Um sensor de tempo de voo oferece uma leitura mais rápida e precisa, com um feixe mais estreito, se você precisar; mas, para um primeiro robô com desvio de obstáculos, o ultrassônico oferece o melhor equilíbrio entre custo e simplicidade.
Preciso comprar peças antes de começar este projeto?
Não. A medição e a lógica de desvio rodam no simulador do navegador, então você pode entender e ajustar o comportamento antes de comprar qualquer coisa. Somente as etapas finais — fiação e montagem — precisam do Arduino físico, do HC-SR04, do servo, do driver, dos motores, do chassi e da bateria.
Por que meu robô com desvio de obstáculos não está funcionando?
Os três culpados habituais são uma leitura ultrassônica ruidosa ou bloqueada (adicione um filtro de mediana e mantenha o sensor desobstruído), uma leitura feita antes de o servo terminar de se mover (adicione um pequeno atraso de estabilização) e a alimentação dos motores diretamente pelo Arduino em vez do driver (o que causa queda de tensão e reinicia a placa).
Como isso difere de um robô seguidor de linha?
Um robô seguidor de linha percorre um traçado destinado a ele; um robô com desvio de obstáculos não tem traçado e precisa decidir para onde ir. Ele acrescenta um sensor de varredura e um laço de decisão real, o que faz dele o segundo robô natural para construir depois de um seguidor de linha.