Construa seu robô que desvia de obstáculos com Arduino - MakerHero

Construa seu robô que desvia de obstáculos com Arduino 5

Robôs chamam muito a atenção, afinal são um dos poucos “adereços tecnológicos” que parecem ganhar vida quando em operação. E se o robô fosse capaz de desviar sozinho de obstáculos? Legal, né? É justamente o que você aprenderá a fazer aqui neste post!

Você aprenderá a fazer seu próprio robô autônomo, capaz de desviar sozinho de obstáculos e sair de labirintos.

Material necessário

Para fazer este projeto, você precisará de:

Visão geral do robô que desvia de obstáculos

Este projeto consiste de um robô de duas rodas capaz de, sozinho, desviar de obstáculos localizados a sua frente. Ou seja, o robô move-se e desvia de obstáculos por conta própria.

Os obstáculos são detectados a partir de um sensor de distância ultrassônico, capaz de informar a distância entre o robô e obstáculos à frente do mesmo, detectando quaisquer objetos em um range de 2 centímetros até 4 metros de distância do robô.

Desta forma, quando o robô está muito próximo de um obstáculo (neste projeto, muito próximo significa estar a 10 centímetros de distância do robô), este gira para esquerda ou direita até encontrar um caminho livre. Um caminho livre é um caminho sem obstáculos ou com obstáculos localizados a mais de 10 centímetros de distância. Uma vez encontrado um caminho livre, o robô segue em frente.

Para que lado girar quando localizar um obstáculo?

Em caso de o robô encontrar um obstáculo à frente, localizado a 10 ou menos centímetros de distância, este vai girar buscando um caminho livre, conforme já descrito neste post. Porém, como o robô pode decidir para que sentido deve girar (horário ou anti-horário)?

Neste caso, há duas estratégias possíveis:

  1. Girar sempre em um só sentido (horário ou anti-horário): esta estratégia é a mais simples e intuitiva possível.
    Porém, se o robô se encontra em um labirinto, por exemplo, ele pode demorar mais para desviar dos obstáculos, uma vez que achar o caminho livre girando somente para um dos sentidos (horário ou anti-horário) pode fazê-lo girar bastante até encontrá-lo.
    Ainda, dependendo da situação em que se encontra e dos obstáculos encontrados, nesta estratégia o robô pode achar como caminho livre o caminho de onde acabou de vir, causando assim uma espécie de “regressão”, como se o robô desse um passo atrás na solução do labirinto, por exemplo.
  2. Girar em sentido horário ou anti-horário, de forma alternada: aqui, a cada obstáculo encontrado, o robô alterna o sentido de giro. Por exemplo: se no obstáculo anterior ele girou em sentido horário, no próximo obstáculo girará no sentido anti-horário, e vice-versa. Desta forma, a chance do robô regredir na solução de um labirinto é minimizada e a chance de perder tempo girando para o lado errado também é menor.

Considerando as estratégias acima e consequências das mesmas, o robô deste projeto seguirá a estratégia de girar em sentidos alternados (estratégia 2).

Circuito esquemático

O circuito esquemático do robô pode ser visto na figura 1.

Circuito do robô
Figura 1 – Circuito esquemático do projeto

Importante: pelo fato dos motores exigirem muita corrente elétrica para funcionarem (em comparação a corrente exigida pelo Arduino Nano apenas), não se esqueça de remover o fio que liga +5 V ao Vin do Arduino Nano antes da programação do mesmo. Assim, não há o risco de um ou ambos motores ligarem e utilizarem a alimentação da USB do computador, o que pode levar a sérios danos ao computador.
Após a programação do Arduino Nano, pode-se ligar o fio que liga +5 V ao Vin do Arduino Nano novamente.

Além disso, como estamos alimentando o módulo de ponte H L298N com os 5 V fornecidos pelo powerbank e, ainda, este projeto não possui controle de velocidade de giro dos motores, é fundamental que:

  • Os jumpers ATIVA MA e ATIVA MB estejam presentes (colocar jumpers)
  • O jumper ATIVA 5 V esteja ausente (retirar jumper)

Para referências de quais são estes jumpers e onde se localizam no módulo, veja a figura 2.

Ponte H usada para o projeto
Figura 2 – Jumpers e pinos da Ponte H L298N

Montagem do robô que desvia de obstáculos

Para te ajudar a organizar os componentes e fios, segue abaixo algumas fotos do robô deste post já montado.

Parte da frente do robô que desvia de obstáculos
Figura 3 – Foto frontal do robô
Parte superior do robô que desvia de obstáculos
Figura 4 – Foto superior do robô
Parte superior com destaque nas ligações do robô que desvia de obstáculos
Figura 5 – Foto superior com destaque para as ligações
Robô que desvia de obstáculos montado
Figura 6 – Foto do robô montado

Código-fonte do robô que desvia de obstáculos

Segue abaixo o código-fonte do projeto. Leia atentamente seus comentários para total compreensão do mesmo.

Recapitulando: o robô vai em frente até encontrar um obstáculo, localizado a 10 ou menos centímetros a sua frente. Após isso, gira em sentido horário ou anti-horário (sentidos alternados, conforme estratégia adotada) até que consiga um caminho livre (sem obstáculos ou com obstáculo a mais de 10 centímetros a frente). Os giros em sentidos alternados visam aumenta a eficiência nos desvios de obstáculos.

Gostou deste post sobre como construir seu próprio robô que desvia de obstáculos? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

5 Comments

  1. Esse projeto serve para arduíno uno

    1. Olá Valdinei.

      Funciona, porém, será necessário efetuar algumas mudanças tanto no código quanto no esquema elétrico.

      Att.
      Vitor Mattos.
      Suporte Técnico MakerHero.

  2. ola pessoal, estou tendo esse erro ao compilsr
    slgum pode me ajudar ?

    exit status 1
    ‘unsigned int Ultrasonic::timing()’ is private within this context

  3. Outra forma de programação interessante, pois tenho uma versão com uso de servo, na qual realiza a leitura de distânçia.

  4. microsec = ultrasonic.timing();
    nessa linha de programação esta dando este erro

    unsigned int Ultrasonic::timing()’ is private within this context