Robô Autônomo Básico com Arduino Nano e Sensor Ultrassônico HC-SR04

Já pensou em montar o seu próprio robô autônomo, mas acha algo muito complicado e caro? Este tutorial vai mostrar que essa tarefa não é nenhum bicho de sete cabeças. Desenvolvemos um projeto que simplifica ao máximo os conceitos de software e hardware, possibilitando que qualquer pessoa seja capaz de fazê-lo por um custo bastante reduzido.

Usaremos um kit de chassi básico para construir um robô capaz de se livrar de obstáculos. A eletrônica necessária será montada numa pequena protoboard, sem a necessidade de uma placa de circuito impresso. Para reduzirmos o tamanho do projeto, utilizaremos o Arduino Nano em conjunto com o sensor ultrassônico HC-SR04 e Módulo Driver Ponte H L298N para controle dos motores DC.

O grande barato é que utilizaremos um código reduzido e acessível para iniciantes no mundo da eletrônica embarcada. Além de pensarmos numa maneira de utilizar o mínimo possível de componentes. Sejam bem vindos e vamos começar a diversão.

Montagem do Projeto e Detalhamento de Hardware

Componentes Utilizados:

 

Você pode ver todos os componentes utilizados neste tutorial na lista acima, e praticamente todos eles são vendidos na loja de nosso patrocinador ArduinOmega,  mas este projeto  é especial pois inaugura uma nova etapa na tripla parceria entre Portal do Arduino, Curto e Circuito (realizador técnico do projeto) e a ArduinOmega, a loja terá um Kit exclusivo para este tutorial, chamado Kit Start Robô Autônomo que inclui todos os componentes citados na lista acima, mas com uma pequena diferença, o chassi incluso no kit é o Chassi 2WD retangular e não o chassi redondo. Ao comprar este Kit o preço final fica mais em conta do que comprando os componentes separadamente! E não é só isso, temos também um cupom que vale 10% de desconto na compra do Kit Start Robô Autônomo ou qualquer outro produto, para conseguir o desconto basta utilizar o seguinte cupom:

CURTOECIRCUITO

Agora sem mais delongas vamos iniciar a parte técnica do tutorial 🙂

A)  Preparativos Iniciais:

Precisamos preparar alguns detalhes antes de iniciar o projeto. Os motores DC não vem com os fios soldados. Para isso, é necessário soldar fios flexíveis de aproximadamente 12cm conforme figura abaixo.

 

Outro detalhe que facilitará muito a nossa vida é complementar os fios do adaptador da bateria de 9V com jumpers. O objetivo é possibilitar que a bateria seja conectada facilmente na protoboard. A figura abaixo mostra o efeito desejado. Moleza né?

 

B) Montagem do Chassi:

Agora é hora de montar o chassi do seu robô. A foto abaixo mostra um chassi redondo 2WD apenas com a base montada (sem o segundo andar). Aconselhamos usar para este projeto o chassi mais simples e barato possível. Pois teremos poucos componentes e o espaço utilizado será muito reduzido.

C) Fonte de Energia:

Utilizaremos uma bateria de 9V comum. Porém, nada impede que você use qualquer outra forma de energia que alcance tal valor.

Agora que sabemos que utilizaremos 9V como fonte, temos um desafio. O Arduino Nano precisa de 5V para funcionar e não podemos ultrapassar esse valor para não danificá-lo. Para isso, apresentaremos o conceito de circuito regulador de tensão.

Um circuito regulador de tensão é capaz de reduzir e regular uma tensão de entrada para uma tensão de saída desejada. Utilizaremos o famoso CI 7805 que disponibilizará 5V em sua saída e servirá perfeitamente para alimentar o Arduino. A figura abaixo propõe um circuito muito simples que servirá perfeitamente para o nosso projeto.

Outro desafio é isolar o circuito de alimentação dos motores e o circuito que alimenta o Arduino. Não entraremos em detalhes sobre esse tópico, mas basicamente é necessário saber que motores são cargas indutivas e podem retornar ruídos que podem afetar o funcionamento do Arduino. Sem entrar no mérito, usaremos um diodo na saída da bateria que alimentará os motores para evitar que qualquer tipo de corrente reversa atinja o regulador de tensão de 5V.

Assim, teremos uma divisão da energia fornecida pela bateria, onde isolaremos 5V para o circuito lógico e aproximadamente 8,3V para os motores (8,3V é o resultado de 9V da bateria com uma queda de 0,7V do diodo).

A figura abaixo mostra a montagem da fonte com o acréscimo de um interruptor para ligarmos e desligarmos o robô. Notem que tudo fica na protoboard e facilita muito a montagem do robô.

D) Montagem do Arduino Nano:

Essa etapa é muito simples. Devemos colocar o Arduino na protoboard e conectar a saída regulada de 5V no pino Vin do Arduino e o GND da fonte ao GND do Arduino, como pode ser visto na imagem abaixo:

E) Montagem do Sensor Ultrassônico:

Não iremos entrar no detalhe do funcionamento do sensor ultrassônico, pois já temos um tutorial exclusivo para este sensor: Medindo distâncias com o sensor ultrassônico, mas basicamente trata-se de um sensor que possui um emissor e receptor de ondas ultrassônicas de 40KHz. O mesmo emite a onda e a partir do tempo de ida e volta do sinal o mesmo calcula a distância de um obstáculo.

Apenas para título de conhecimento, a equação que o código da biblioteca do sensor utilizará para cálculo da distância ao obstáculo é simples. A distância (d) é obtida a partir da velocidade do som (v = 340m/s) multiplicado pelo tempo (t) de recepção do sinal dividido por 2 por conta da onda ir até o obstáculo e voltar.

d = (v * t)/2

Os pinos do Sensor ultrassônico HC-SR04 são:

  • VCC: Alimentação do sensor (5V);

  • GND: GND do sensor;

  • Trigger: Gatilho para disparo dos pulsos ultrassônicos. O Trigger é controlado pelo Arduino;

  • Echo: Dispara um pulso cuja largura de tempo em alta representa o tempo para retorno da onda recebida pelo sensor. O Arduino utilizará este sinal para realizar o cálculo da distância.

Para o nosso projeto ligaremos devidamente o VCC e GND aos pinos do Arduino Nano e o Trigger e Echo do sensor aos pinos digitais D4 e D5 do Arduino Nano conforme figura abaixo:

F) Montagem do Módulo Driver Ponte H L298N

Utilizaremos o Modulo Ponte H L298N para controlar não somente o sentido de rotação dos motores DC, como também sua velocidade.

  • MOTOR A (OUT1 e OUT2) e MOTOR B (OUT3 e OUT4): São os conectores para ligarmos no Motor A e no Motor B;

  • ATIVA MA (ENA) e ATIVA MB (ENB): Para o nosso projeto, devemos retirar os jumpers destes pinos, pois iremos controlar a velocidade dos motores com o Arduino. Caso não fossemos alterar a velocidade, deveríamos manter os jumpers;

  • ATIVA 5V: Devemos manter este jumper, pois iremos utilizar alimentação de aproximadamente 8V e o mesmo ativa um regulador de tensão interno do módulo que garante os 5V de alimentação para o circuito;

  • 6-35V e GND: Conectaremos a fonte dos motores nestes terminais, VCC e GND;

  • ENTRADA (IN1, IN2, IN3 e IN4): Pinos responsáveis pelo sentido de rotação do Motor A (IN1 e IN2) e Motor B (IN3 e IN4). Abaixo segue a tabela para entendermos a configuração necessária.

 

STATUS MOTOR

IN1 (ou IN3)

IN2 (ou IN4)

Rotação Sentido Horário

5V

GND

Rotação Sentido Anti-Horário

GND

5V

Ponto Morto

GND

GND

Freio

5V

5V

 

Agora que entendemos, resumidamente, como funciona o Módulo L298N, vamos iniciar sua conexão. Primeiramente, devemos conectar os motores nos conectores OUT1/OUT2 e OUT3 e OUT4.

Próximo passo é ligar a alimentação de energia nos conectores 6-35V e GND, conforme figura abaixo:

 

Iremos conectar os pinos IN1, IN2, IN3 e IN4 do Módulo aos pinos D6, D7, D8 e D9 do Arduino respectivamente. Finalmente, conectaremos os pinos ENA e ENB do Módulo aos pinos PWM D10 e D11 do Arduino respectivamente. Pronto! Tudo conectado!

A montagem final do projeto pode ser vista na imagem abaixo:

Mergulhando no projeto

Software

1 – Lógica de Decisão de desvio do Obstáculo

O objetivo é fazer a menor quantidade possível de movimento para simplificar o código e economizar o máximo de bateria. Ao se deparar com um obstáculo a menos de 20cm de distância frontal ao robô, o mesmo irá parar e desviar aproximadamente 90 graus à esquerda e verificará se há novo obstáculo, caso tenha, irá virar novamente à esquerda e caso contrário deve seguir em frente.

2 – Desenvolvendo o Código

O código final do projeto pode ser visto abaixo:

 

Você pode consultar, baixar, modificar e compartilhar o código deste tutorial em nosso repositório do GitHub! E lá você encontra todos os códigos já publicados aqui no blog! Venha compartilhar conhecimento com toda a comunidade maker!

 

3 – Detalhes do Código

  1. Instalando a Biblioteca do Sensor Ultrassônico
  • Abra a IDE do Arduino, clique em “Sketch” > “Incluir Biblioteca” > “Adicionar Biblioteca .ZIP” e selecione o arquivo “Ultrassonic.zip”.

  • Pronto, agora você já é capaz de visualizar os exemplos do código clicando em “Arquivo” > “Exemplos” > (Exemplos de Bibliotecas Personalizadas) “Ultrasonic-master” > “UltrasonicDemo”

  1. Detalhamento do Código

Primeiramente, precisamos carregar a biblioteca do sensor e definir os pinos que serão utilizados como Trigger e Echo:

Para finalizarmos as configurações do sensor ultrassônico, é preciso instanciar o objeto “ultrasonic” da biblioteca “Ultrasonic”, definindo também a nomenclatura que utilizaremos para nos referir aos pinos de Trigger e Echo:

Agora precisamos definir os pinos do 6, 7, 8 e 9 do Arduino para controlar a direção dos motores. Utilizaremos os mesmos nomes dos respectivos pinos do Módulo L298N (IN1 e IN2 para motor A e IN2 e IN3 para o motor B).

O próximo passo é definir os pinos 10 e 11 do Arduino para controle de velocidade dos motores. Novamente utilizaremos os mesmos nomes dos respectivos pinos do Módulo L298N (ENA para motor A e ENB para o motor B).

A função de inicialização irá declarar os pinos IN1, IN2, IN3, IN4, ENA e ENB como pinos de saída.

Estamos utilizando um controle de pulsos PWM para controlar a velocidade dos motores. É como se ligássemos e desligássemos muito rapidamente (alta freqüência) os motores. A relação entre o tempo que ele fica ligado em relação ao tempo que fica desligado define a tensão que estamos entregando ao motor e conseqüentemente é definindo a velocidade do mesmo.

A resolução do PWM do Arduino é de 8bits, podendo assumir valores de 0 (velocidade zero) a 255 (velocidade máxima).

Nesse ponto do projeto deve-se empiricamente regular a velocidade dos motores de forma distinta para compensar as diferenças de fabricação que podem fazer com que possuam velocidades diferentes para a mesma tensão aplicada, garantindo que o robô andará em linha reta quando desejado:

No loop principal iremos inicialmente “chamar” a função responsável por fazer o robô andar para a frente:

Iremos declarar a variável “dist_cm” do tipo “float” que armazenará o valor retornado pela função que calcula a distância do robô ao obstáculo:

Com a função IF, iremos acionar a função decisao() caso o obstáculo esteja numa distância menor do que 20 cm. Sinta-se a vontade para alterar este parâmetro:

Agora é hora de definir as funções auxiliares. São elas que foram utilizadas no loop principal. A função distancia() retornará o valor em cm da distância do robô ao obstáculo. Não se preocupe com o código, pois o mesmo é o padrão da biblioteca do sensor ultrassônico:

Função auxiliar para andar para frente, definindo os valores das variáveis IN1, IN2, IN3 e IN4:

Função auxiliar para andar para esquerda, definindo os valores das variáveis IN1, IN2, IN3 e IN4:

Função auxiliar para parar o robô, definindo os valores das variáveis IN1, IN2, IN3 e IN4:

A função auxiliar decisao() segue o fluxo que definimos para que o robô ultrapasse o obstáculo. No nosso projeto, para simplificar, ele sempre pára e vira para a esquerda e caso não tenha obstáculo, continua em frente:

Conclusão

O objetivo de simplificar o projeto foi mostrar que você é capaz de montar o seu próprio robô e certamente já deve estar pensando em melhorá-lo. Fique a vontade, que tal alterar o modelo de decisão do robô ao se deparar com um obstáculo?

Você perceberá que, para obter melhores resultados, o robô precisará de mais sensores. Por exemplo, apenas com o sensor ultrassônico você pode ter problemas com colisão em objetos com ângulo próximo a 45 graus do robô. Que tal incluirmos bumpers de colisão na parte frontal do robô. Bumpers de colisão são chaves (interruptores) que ao serem tocados podem ser usados para alterar a decisão de percurso do robô. Enfim, são inúmeras idéias possíveis e espero ter aberto esse mundo para a sua imaginação. Abraços e boa sorte neste desafio.

Referências

McRoberts, Michael Arduino básico / Michael McRoberts; [tradução Rafael Zanolli]. — São Paulo : Novatec Editora, 2011.

Datasheet: Sensor ultrassônico HC-SR04

Datasheet: Chip ST L298N

Alex da Rocha Mattos
Sobre Alex da Rocha Mattos 3 artigos
Engenheiro de Telecomunicações – Universidade do Estado do Rio de Janeiro UERJ Instagram: https://www.instagram.com/curtoecircuito/ Email:curtoeckt@gmail.com

6 Comentários

  1. Escrevi a programação e fui compilar, mas está dando erro logo na primeira linha, vocês poderiam dar uma olhada ?? Pois tentei arrumar mas não consegui 🙁

  2. Olá, lembrando que para competições utilizar baterias 9v é horrível, o robô não aguenta muito tempo andando pois a amperagem é super baixa, aconselho a utilizar pilhas AA de lítio ou baterias do tipo LiPO para melhor resultados.

    No mais muito boa sua postagem.

    • Oi Allef, exato. Porém o nosso objetivo é fazer um projeto básico e acessível a todos! E para os iniciantes terem contato com a tecnologia! Certamente, projetos mais elaborados exigem uma bateria melhor e mais cara. Abraços

Deixe uma resposta

O seu endereço de email não será publicado.


*