Robô Autônomo SR 1: o robô autônomo Simples com arduino

Leonardo Campbell
Faça o Seu Robô Autônomo com arduino sozinho, um robô que se locomove sozinho pelo ambiente, ao encontrar um obstáculo ele para e da uma ré e verifica automaticamente qual e o lado que é o que tem mais espaço para ele girar e ir sozinho, bem simples de fazer e de compreender o código fonte, muito útil para vários outros projetos e trabalhos de escolas e faculdades. A montagem dele fica pronta em menos de meia hora!

Compartilhe esse post

O que você precisa para montar o Seu Robô Autônomo SR 1

1 – Arduino UNO
1 – Micro Servo 9g sg90 Towerpro
1 – Placa UNO R3 com cabo usb, Arduino
1 – Motor Shield L293D Driver Ponte H para Arduino
1 – Mini Protoboard 170 Pontos
1 – Sensor de Distância Ultrassônico HC-SR04 para Arduino
1 – Kit Chassi 2WD (2 rodas) Robô para Arduino
6 – Jumper 20cm (1 fio Macho-Macho)
1 – Barra de Pinos 1×40 Fêmea 180 Graus
1 – Buzzer/Speaker (som) 5v
1 – Clip de Bateria 9V [Horizontal], Conector de Bateria
2 – Abraçadeira de Nylon 15cm
5 cm – Cabo Flexível Remoto de Cobre 1mm Preto
1 cm – Fita dupla face colada no servo motor
1 – Bateria de 9v Alcalina

Veja como soldar a ponte h

Montar e Soldar os componentes do kit chassi 2wd

Veja o esquematico de ligações

Codigo fonte:

Baixe e instale as bibliotecas primeiramente 

Servo.h – Essa biblioteca já vem inclusa no arduino versão 1.6 ou superior
AFMotor.h – Download Afmotor

Como afazer a instalação da biblioteca:

Após baixar a biblioteca, abra o programa do arduino e Instale a biblioteca no menu:

 Sketch Incluir Biblioteca (Include Library) Adicionar Biblioteca .ZIP (Add .ZIP Library…) 

Selecione o arquivo que você baixou e salvou em uma pasta (Afmotor.zip) , e clique em OK

após isso aparecerá a mensagem “Biblioteca adicionada às suas bibliotecas.” ,

pronto, biblioteca instalada.

Copiei o código fonte abaixo

/*
------------------------------------------Robô Autonomo SR 1------------------------------------------------
Versão do Software: 1.0 SR 1 //não apague essa linha, para futuras consultas
Software open source, favor citar o autor: Seu Robô https://SeuRobo.com.br/
*/
  // inclusão de bibliotecas.    
  #include <Servo.h>    // inclui biblioteca de manipulação de servos motores.    
  #include <AFMotor.h>   // inclui biblioteca de manipulação de motores DCs.  
    
  //Definindo os pinos  
  #define trigPin A0 //Pino TRIG do sensor no pino analógico A0
  #define echoPin A1 //Pino ECHO do sensor no pino analógico A1
  #define BUZZER A2  // Define o pino do buzzer (Som) no pino ANALÓGICO A0  
  AF_DCMotor motor1(1);    // Define o motor1 ligado ao M1  
  AF_DCMotor motor2(2);    // Define o motor2 ligado ao M2  

  int TempoGirar = 1;//esse é o tempo para o robô girar em 45º com uma bateria de 9v.
  int distanciaObstaculo = 30; //distância para o robô parar e recalcular o melhor caminho
  int velocidadeMotores = 80; // velocidade que os motores funcionarão na bateria 9v. Para a bateria 9v a velocidade 80 é ideal
  Servo servo_ultra_sonico; // nomeando o servo motor    
  //variáveis  para o sensor ultrassonico
  long duracao;
  long distancia_cm=0;
  int minimumRange=5; //tempo de resposta do sensor
  int maximumRange=200;
    
  // executado na inicialização do Arduino    
  void setup(){    
    Serial.begin(9600); // inicializa a comunicação serial para mostrar dados     
    servo_ultra_sonico.attach(10);  // Define o mini servo motor ligado no pino digital 10.    
    pinMode(trigPin, OUTPUT); //define o pino TRIG como saída
    pinMode(echoPin, INPUT);  //define o pino ECHO como entrada 
    pinMode(BUZZER,OUTPUT);   // Define o pino do buzzer como saída   
    motor1.setSpeed(velocidadeMotores);     // Define a velocidade para os motores. A velocidade máxima é 255. 
    motor2.setSpeed(velocidadeMotores);     //Usamos uma bateria de 9v 450mAh, com ela a velocidade ficou boa. Mas dependendo da bateria utilizada a velocidade deverá ser utilizada. Não use pilhas, pois são fracas
    servo_ultra_sonico.write(90);   // O servo do sensor se inicia a 90 graus (meio)    
    rotacao_Parado;  //inica com os motores parados     
  }    
    
  // Função principal do Arduino    
  void loop(){    
    pensar(); //inicia a função pensar  
    //Seu Robô http://SeuRobo.com.br/
  }    
    
  // Função para chamar outras funções e definir o que o robô fará  
  void pensar(){    
   reposicionaServoSonar(); //Coloca o servo para olhar a frente    
   int distancia = lerSonar(); // Ler o sensor de distância  
   Serial.print("distancia em cm: "); 
   Serial.println(distancia);   // Exibe no serial monitor 
   if (distancia > distanciaObstaculo) {  // Se a distância for maior que 20 cm  
     rotacao_Frente(); //robô anda para frente   
   }else{   
     rotacao_Parado();  //para o robô  
     posicionaCarroMelhorCaminho(); //calcula o melhor caminho    
     pensar();    
   }   
  }  
    
  // Função para ler e calcular a distância do sensor ultrassônico    
  int lerSonar(){    
   digitalWrite(trigPin, LOW); //não envia som
   delayMicroseconds(2);
   digitalWrite(trigPin,HIGH); //envia som 
   delayMicroseconds(10);
   digitalWrite(trigPin,LOW); //não envia o som e espera o retorno do som enviado
   duracao = pulseIn(echoPin,HIGH); //Captura a duração em tempo do retorno do som.
   distancia_cm = duracao/56; //Calcula a distância
   delay(30);  
   return distancia_cm;             // Retorna a distância  
  }   
    
  // Função para calcular a distância do centro    
  int calcularDistanciaCentro(){    
   servo_ultra_sonico.write(90);    
   delay(20);   
   int leituraDoSonar = lerSonar();  // Ler sensor de distância  
   delay(500);   
   leituraDoSonar = lerSonar();   
   delay(500);   
   Serial.print("Distancia do Centro: "); // Exibe no serial  
   Serial.println(leituraDoSonar);   
   return leituraDoSonar;       // Retorna a distância  
  }    
    
  // Função para calcular a distância da direita    
  int calcularDistanciaDireita(){    
   servo_ultra_sonico.write(0);   
   delay(200);  
   int leituraDoSonar = lerSonar();   
   delay(500);   
   leituraDoSonar = lerSonar();   
   delay(500);   
   Serial.print("Distancia da Direita: ");  
   Serial.println(leituraDoSonar);   
   return leituraDoSonar;    
  }    
    
  // Função para calcular a distância da esquerda    
  int calcularDistanciaEsquerda(){    
   servo_ultra_sonico.write(180);   
   delay(200);  
   int leituraDoSonar = lerSonar();   
   delay(500);   
   leituraDoSonar = lerSonar();   
   delay(500);   
   Serial.print("Distancia Esquerda: ");  
   Serial.println(leituraDoSonar);   
   return leituraDoSonar;    
  }    
    
  // Função para captar as distâncias lidas e calcular a melhor distância. Acesse: Seu Robô https://SeuRobo.com.br/    
  char calculaMelhorDistancia(){    
   int esquerda = calcularDistanciaEsquerda();    
   int centro = calcularDistanciaCentro();    
   int direita = calcularDistanciaDireita();    
   reposicionaServoSonar();    
   int maiorDistancia = 0;   
   char melhorDistancia = '0';     
     
   if (centro > direita && centro > esquerda){    
     melhorDistancia = 'c';    
     maiorDistancia = centro;    
   }else   
   if (direita > centro && direita > esquerda){    
     melhorDistancia = 'd';    
     maiorDistancia = direita;    
   }else  
   if (esquerda > centro && esquerda > direita){    
     melhorDistancia = 'e';    
     maiorDistancia = esquerda;    
   }    
   if (maiorDistancia <= distanciaObstaculo) { //distância limite para parar o robô   
     rotacao_Re();    
     posicionaCarroMelhorCaminho();    
   }    
   reposicionaServoSonar();  
   return melhorDistancia;    
  }    
    
  // Função para colocar o carrinho na melhor distância, isto é, girá-lo para a melhor distância    
  void posicionaCarroMelhorCaminho(){    
   char melhorDist = calculaMelhorDistancia();     
   Serial.print("melhor Distancia em cm: ");  
   Serial.println(melhorDist);  
   if (melhorDist == 'c'){    
     pensar();    
   }else if (melhorDist == 'd'){    
     rotacao_Direita();    
   }else if (melhorDist == 'e'){    
     rotacao_Esquerda();     
   }else{    
     rotacao_Re();    
   }    
   reposicionaServoSonar();    
  }    
    
  // Função para deixar o sensor "olho" do robô no centro    
  void reposicionaServoSonar(){    
   servo_ultra_sonico.write(90);   
   delay(200);   
  }    
    
  // Função para fazer o carro parar    
  void rotacao_Parado()    
  {    
   Serial.println(" Motor: Parar ");
   motor1.run(RELEASE); // Motor para  
   motor2.run(RELEASE);  
  }    
    
  // Função para fazer o robô andar para frente    
  void rotacao_Frente()    
  {    
   Serial.println("Motor: Frente ");   
   motor1.run(FORWARD); // Roda vai para frente  
   motor2.run(FORWARD);   
   delay(50);    
  }    
    
  // Função que faz o robô andar para trás e emite som quando ele dá ré    
  void rotacao_Re()    
  {    
   Serial.println("Motor: ré ");  
   for (int i=0; i <= 3; i++){
      digitalWrite(BUZZER, HIGH); // Liga o som
      delay(100);
      motor1.run(BACKWARD);    // Roda vai para trás  
      motor2.run(BACKWARD);    // Roda vai para trás  
      delay(100);  
      digitalWrite(BUZZER, LOW); // Desliga o som  
      delay(100);
   } 
   rotacao_Parado();    
  }    
    
  // Função que faz o robô virar à direita, https://SeuRobo.com.br/    
  void rotacao_Direita()    
  {    
   digitalWrite(BUZZER, HIGH); // Liga o som
   delay(100);
   motor1.run(BACKWARD);    //o robô dá uma ré para não colidir ao girar 
   motor2.run(BACKWARD);      
   delay(50);  
   digitalWrite(BUZZER, LOW); // Desliga o som  
   delay(100);
   Serial.println(" Para a direita ");  
   motor1.run(FORWARD); // Roda vai para frente  
   motor2.run(BACKWARD); // Roda vai para trás   
   delay(TempoGirar);    
  }    
    
  // Função que faz o robô virar à esquerda    
  void rotacao_Esquerda()    
  {    
   digitalWrite(BUZZER, HIGH); // Liga o som
   delay(100);
   motor1.run(BACKWARD);    // // O robô dá uma ré para não colidir ao girar 
   motor2.run(BACKWARD);   
   delay(50);  
   digitalWrite(BUZZER, LOW); // Desliga o som  
   delay(100);
   Serial.println(" Para a esquerda ");  
   motor1.run(BACKWARD); // Roda vai para trás  
   motor2.run(FORWARD); // Roda vai para frente  
   delay(TempoGirar);    
  } 
 //Fim 
 //Versão do Software: 1.0 SR 1 //não apague essa linha, para futuras consultas

Parabéns! o robô esta pronto, agora é só colocar a bateria e ligar o robô no botão liga/desliga

Amantes de robótica, encontra-se abaixo a lista dos componentes do robô, clique no item e veja-o em nossa loja.

Observações

  •  Usamos uma bateria recarregável de 9v 450mAh (bateria não está inclusa do kit).
  •  Não utilize pilhas, pois os motores consumem muita energia e com isso o robô ficaria muito instável.
  •  O robô é simples, apresenta falhas. Dessa forma, pode acontecer de ele colidir a 45º de um obstáculo. Além disso, o robô não detecta obstáculos com mais de 10 cm de altura, porque possui um único sensor.
  • O código fonte usá lógica booleana, para facilitar o compreendimento a todos os usuários.
  •  O robô não anda em linha reta. Algo muito comum é a diferença de performance para motores do mesmo modelo. No caso dos motores que acompanharam o chassi, essa situação pode ser resolvida a partir de testes de velocidades de cada motor até conseguir fazê-lo andar em linha reta. Essa modificação de valores referentes à velocidade pode ser realizada alterando a seguinte linha de código:
motor1.setSpeed(A);    
motor2.setSpeed(B);

Onde a letra A representa a velocidade do motor 1 e a letra B a velocidade do motor 2, as velocidades são de 0 a 254.
Não realizamos essa calibração, porque será diferente em cada robô e por isso deixamos um valor único para os dois.
Mostrar mensagem original.

Qualquer duvida, deixe um comentário ou entre em contato!

Deixe seu comentário no final da pagina!

Compartilhe esse post

Receba avisos de novos posts e novidades

Conteúdo extra e contato mas próximo com você

Outros Posts que talvez você goste

Que Saber Mais Sobre Robótica?

Venha Fazer Um Curso Online E Aprender Muito Mais