CarAut v1. Criando um carrinho autônomo (robô) com Arduíno, parte 4/4 (Código fonte)

Olá, amantes de robótica!

ROBÔ ATUALIZADO!

MELHORADO O CODIGO FONTE!

MELHORADO O DESEMPENHO!

VIDEO DE MONTAGEM DO ROBÔ!

ACESSE O NOVO TUTORIAL: SEUROBO.COM.BR

Veja como ficou o novo robô:

Nesta etapa, disponibilizaremos o código fonte do robô CarAut v1.
Lembre-se, se copiar o código, não se esqueça de passar a referência do site.



Veja o vídeo do CarAut v1 em funcionamento:





Veja a outra versão do robô: CarAut v2, usa poucas peças, fácil de montar!

O mais importante, o código fonte:


Agora é só abrir o programa arduino, copiar o código abaixo, colá-lo e enviá-lo para o arduino.

Não sabe programar? Então acesse: Como programar em Arduíno, fazer robôs e projetos diversos
Se você é iniciante veja:Como enviar (upload) o programa pronto para a placa do arduino uno, mega entre outros



Atenção:
Para o código fonte funcionar é necessário baixar as bibliotecas: Baixar Library.
 /*   
  >>>>> Criando Robô Com Arduino <<<<<   
  ##### Robôs, Projetos e Tutoriais! #####  
  .:: Site principal: http://www.CriandoRoboComArduino.com/     
  .:: Site secundário: http://www.TestCriandoRoboComArduino.com/  
  ========== IMPORTANTE ==========   
  O código está livre para usar, citar, alterar e compartilhar,  
  desde que mantenha o site como referência.   
  Obrigado.  
  --------------------------------------------------------------------------------------------------  
  Projeto: CarAut v1. Criando um carrinho autônomo (robô) com Arduíno    
  ---------------------------------------------------------------------------------------------------  
 */   
  // inclusão de bibliotecas.   
  #include <Servo.h>   // inclui biblioteca de manipulação de servos motores.   
  #include <Ultrasonic.h>  // inclui biblioteca de manipulação do sensor ultrassónico.   
  #include <LiquidCrystal.h> // inclui biblioteca de manipulação do monitor LCD 16x2   
  #define echoPin 8 //Pino 8 será o Echo do sensor   
  #define trigPin 12 //Pino 12 será o TRig do sensor   
  Servo servo_ultra_sonico, motorDireita, motorEsquerda; // nomeando os servos motores   
  Ultrasonic ultrasonic(12,8); // nomeando o sensor   
  int BUZZER = 10; // Ligar o buzzer (Som) no pino 10   
  //variáveis para uso da função do LCD   
  LiquidCrystal lcd(9, 11, 5, 4, 3, 2); // ligando o display no arduino   
  int pinoPotenciometro = 0;    // controle do brilho do LCD   
  long valorPotenciometro = 0;   // controle do brilho do LCD   
  boolean dist = true;     // Variável para saber se é para exibir a distância ou não   
  String lado = "";      //Variável para escrever qual o lado da medição   
  String frase = "";      //Variável para escrever uma frase na parte de cima   
  String frase2 = "";     //Variável para escrever uma frase na parte de baixo   
  int valor = 0;       //Variável para colocar o valor da distancia    
  // executado na inicialização do Arduino   
  void setup(){   
  lcd.begin(16, 2); // inicia o LCD   
  Serial.begin(9600); // inicializa a comunicação serial para mostrar dados em um display LCD   
  escrever_LCD(dist = false, lado = "",valor = 0, frase = ">> CarAut v1 <<" , frase2 = "Iniciando..." );   
  delay(500);   
  //configurações do servos motores   
  servo_ultra_sonico.attach(13); // anexa o servo motor lógico ao físico no pino 13.   
  pinMode(trigPin, OUTPUT);  // define o pino triger como saída.   
  pinMode(echoPin, INPUT);  // define o pino echo como entrada.   
  pinMode(BUZZER,OUTPUT);   // define o pino do buzzer como saída.   
  servo_ultra_sonico.write(90); // inicialmente servo do sensor à 90 graus   
  iniciar_Motor;   
  rotacao_Parado;         
  escrever_LCD(dist = false, lado = "",valor = 0, frase = "** Criado por **" , frase2 = "CRCA");   
  delay(2000);          
  escrever_LCD(dist = false, lado = "",valor = 0, frase = "www.CriandoRobo" , frase2 = "ComArduino.com" );   
  delay(2000);   
  }   
  // função principal do Arduino   
  void loop(){   
  escrever_LCD(dist = false, lado = "",valor = 0, frase = "Pensando..." , frase2 = ">> CarAut v1 <<");    
  //seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0   
  digitalWrite(trigPin, LOW);   
  delayMicroseconds(2);   
  //seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1   
  digitalWrite(trigPin, HIGH);   
  delayMicroseconds(10);   
  //seta o pino 12 com pulso baixo novamente   
  digitalWrite(trigPin, LOW);   
  andar();    
  }   
  //função para unir outras funções para poder andar com o robô   
  void andar(){   
  reposicionaServoSonar();   
  int distancia = lerSonar();   
  if (distancia > 25) {   
   rotacao_Frente();   
  }else{    
   posicionaCarroMelhorCaminho();   
   andar();   
  }    
  }   
  //função para ler o sensor ultrassónico   
  int lerSonar(){   
   return ultrasonic.Ranging(CM);   
  }   
  //função para calcular a distancia do centro   
  int calcularDistanciaCentro(){   
   servo_ultra_sonico.write(90);    
   int leituraDoSonar = lerSonar();   
   return leituraDoSonar;    
  }   
  //função para calcular a distancia da direita   
  int calcularDistanciaDireita(){   
   servo_ultra_sonico.write(10);    
   int leituraDoSonar = lerSonar();   
   return leituraDoSonar;    
  }   
  //função para calcular a distancia da esquerda   
  int calcularDistanciaEsquerda(){   
   servo_ultra_sonico.write(180);    
   int leituraDoSonar = lerSonar();   
   return leituraDoSonar;    
  }   
  //função para pegar as distancia lidas e calcular qual a melhor distancia   
  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 <= 25) {   
   rotacao_Re();   
   posicionaCarroMelhorCaminho();   
  }   
  reposicionaServoSonar();   
  return melhorDistancia;   
  }   
  // função para colocar o carrinho na melhor distancia, ou seja girar ele para a melhor distancia   
  void posicionaCarroMelhorCaminho(){   
  char melhorDist = calculaMelhorDistancia();     
  if (melhorDist == 'c'){   
   escrever_LCD(dist = false, lado = "",valor = 0, frase = "Melhor Distancia....: " , frase2 = "Frente" );    
   andar();   
  }else if (melhorDist == 'd'){   
   escrever_LCD(dist = false, lado = "",valor = 0, frase = "Melhor Distancia....: " , frase2 = "Direita" );    
   rotacao_Direita();   
   rotacao_Direita();   
  }else if (melhorDist == 'e'){   
   escrever_LCD(dist = false, lado = "",valor = 0, frase = "Melhor Distancia....: " , frase2 = "Esquerta" );    
   rotacao_Esquerda();   
   rotacao_Esquerda();   
  }else{   
   rotacao_Re();   
  }   
  reposicionaServoSonar();   
  }   
  //função para deixar o sensor "olho" do robô no centro   
  void reposicionaServoSonar(){   
  servo_ultra_sonico.write(90);   
  }   
  //função para escrever no LCD    
  void escrever_LCD(boolean dist, String lado, int valor, String frase, String frase2 )   
  {   
   lcd.clear();   
   valorPotenciometro = analogRead(pinoPotenciometro); // brilho do lcd   
   if (dist == true ) {    
   lcd.setCursor(0,0);   
   lcd.print("Distancia ");   
   lcd.print(lado+" : ");   
   lcd.setCursor(0,1);   
   lcd.print(valor);   
   }   
   if (dist == false){   
   lcd.setCursor(0,0);   
   lcd.print(frase);   
   lcd.setCursor(0,1);   
   lcd.print(frase2);   
   }   
  }   
  // função que faz o carro (servo motor) parar    
  void rotacao_Parado()   
  {   
   motorDireita.detach();    // para os motores   
   motorEsquerda.detach();   
  }   
  // função que faz o carro (servo motor) andar para frente    
  void rotacao_Frente()   
  {   
   escrever_LCD(dist = false, lado = "",valor = 0, frase = "Indo para:" , frase2 = "Frente");    
   iniciar_Motor();     // usa a função inicia motor   
   motorDireita.write(0);    // motor da direita gira para frente   
   motorEsquerda.write(180);   // motor da esquerda gira para a frente   
   delay(600);   
   rotacao_Parado();   
  }   
  // função que faz o carro (servo motor) andar para traz    
  void rotacao_Re()   
  {   
   tone(10,300,300);    
   escrever_LCD(dist = false, lado = "",valor = 0, frase = "Indo para:" , frase2 = "Tras");    
   tone(10,300,300);    
   iniciar_Motor();      //praticamente a mesma coisa que a função a cima   
   tone(10,300,300);    
   motorDireita.write(180);   
   motorEsquerda.write(0);   
   delay(600);   
   tone(10,300,300);    
   rotacao_Parado();   
  }   
  // função que faz o carro (servo motor) vira a direita   
  void rotacao_Direita()   
  {   
   escrever_LCD(dist = false, lado = "",valor = 0, frase = "Virando para:" , frase2 = "Direita");    
   iniciar_Motor();   
   motorDireita.write(180);   
   motorEsquerda.write(180);   
   delay(250);   
   rotacao_Parado();   
  }   
  // função que faz o carro (servo motor) vira a esquerda   
  void rotacao_Esquerda()   
  {   
   escrever_LCD(dist = false, lado = "",valor = 0, frase = "Virando para:" , frase2 = "Esquerta");    
   iniciar_Motor();   
   motorDireita.write(0);   
   motorEsquerda.write(0);   
   delay(250);   
   rotacao_Parado();   
  }   
  //função para iniciar os motores    
  void iniciar_Motor()   
  {   
   motorDireita.attach(7);   
   motorEsquerda.attach(6);   
  }  
 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  
   >>>>> Acesse os sites: <<<<<  
   .:: Robôs, Projetos e Tutoriais  
     http://www.CriandoRoboComArduino.com/     
   .:: Testes dos robôs, noticias sobre robótica e muito mais  
     http://www.TestCriandoRoboComArduino.com/  
   >>>>> Inscreva-se nos canais no Youtube: <<<<<  
   .:: Vídeos dos robôs, projetos e tutoriais  
     Criando Robô Com Arduino  
     https://www.youtube.com/CriandoRoboComArduin  
   .:: Mostrando os testes dos robôs e projetos  
     Test Criando Robô Com Arduino  
     https://www.youtube.com/TestCriandoRoboComAr  
   :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/  



Veja as outras etapas: 
=> CarAut v1. Criando um carrinho autônomo (robô) com Arduíno, parte 1/4 (componentes)
=> CarAut v1. Criando um carrinho autônomo (robô) com Arduíno, parte 2/4 (hackeando servo motor)
=> CarAut v1. Criando um carrinho autônomo (robô) com Arduíno, parte 3/4 (montagem)



Pronto, qualquer duvida é só deixar nos comentários ou entrar em Contato 

Quer ajuda ou quer ajudar? Clique em Ajuda e veja como você pode ajudar ou ser ajudado.

ROBÔ ATUALIZADO!

MELHORADO O CODIGO FONTE!

MELHORADO O DESEMPENHO!

VIDEO DE MONTAGEM DO ROBÔ!

ACESSE O NOVO TUTORIAL: SEUROBO.COM.BR

Veja como ficou o novo robô:



21 comentários:

  1. Amigo goste muito desse projeto só estou tendo uns problemas com o código fonte ele da dois erros ( Ultrasonic ultrasonic(12,8); // nomeando o sensor ) e no ( return ultrasonic.Ranging(CM); ) se alguem poderia me ajudar ficaria muito grato

    ResponderExcluir
    Respostas
    1. Olá Kelm, este erro acontece pois a biblioteca do ultrassônico não esta instalada, instale a biblioteca ultrasonic nesse link: http://www.criandorobocomarduino.com/p/bibliotecas-do-arduino.html
      Abraço

      Excluir
  2. Bem, esse robô você fez ele com o arduino uno ... No caso aqui eu fiz um microcontrolador com um atmega8 (conhecido como druduino) e queria saber como posso fazer esse mesmo robô utilizando minha druduino ...

    ResponderExcluir
    Respostas
    1. Cara, e quase a mesma coisa, porém você vai ter que tem mais atenção com os pinos.

      Excluir
    2. Dei uma olhada aqui e tudo mais .... ok .... Porém quando vou gravar o Código fonte dá o seguinte erro:
      Erreur de Compilation.
      c:/users/lucas gabriel de j.l/desktop/druduino/arduino-1.0.5-r2/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: sketch_may07a.cpp.elf section .text will not fit in region text
      c:/users/lucas gabriel de j.l/desktop/druduino/arduino-1.0.5-r2/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: region text overflowed by 2954 bytes

      Excluir
    3. Jonh, no programa arduino você selecionou o tipo do arduino? se não faça o seguinte caminho: Clique em "Tool" depois em "Board" e agora procure e clique no "Arduino NG or older w/ atmega8", veja se isso ira resolver.

      Excluir
    4. Sim... eu já gravei muitos programas nele, uso muito o arduino no curso de mecatrônica e posso dizer com toda certeza que está tudo ok aqui.... Porém seu código fonte na está gravando e nem passando na verificação... Por isso pergunto qual seria o tipo de problema... O que está havendo aqui...

      Excluir
    5. Você, instalou as bibliotecas: Servo.h, Ultrasonic.h e LiquidCrystal.h se se encontram no link: http://www.criandorobocomarduino.com/p/bibliotecas-do-arduino.html
      se sim, desinstale o arduino e instale novamente com as bibliotecas.

      Excluir
    6. Sim... sim .... Mas continua n funcionando até reinstalei o arduino e nada .... :/

      Excluir
    7. Jonh, eu copie esse código e compilei normalmente aqui no meu note.
      Clica em "contato" no site e me passe seu e-mail, pra gente se falar melhor.

      Excluir
  3. Cara nao consegui intender onde quais pinos digitais ou analogicos ligo os 3 servo motores se puder ajudar fico grato!

    ResponderExcluir
    Respostas
    1. Olá, o motor do ultrassônico você liga no pino digital 13.
      o motor da direita você liga no pino digital 7.
      o motor da esquerda você liga no pino digital 6.
      Igual nessa imagem: http://2.bp.blogspot.com/-CCeBOy5ke44/U4_Cm5LwWlI/AAAAAAAAAWQ/tsHhWAgN5L8/s1600/Robo+com+arduino+autonomo+caraut+v1+esquema.jpg
      abraço

      Excluir
  4. Eu consigo fazer ele ter um caminho pré programado e parar quando encontrar um obstáculo?

    ResponderExcluir
    Respostas
    1. Olá, consegue sim, porem tem que alterar muita coisa no código fonte.
      Abraço

      Excluir
  5. Olá amigo, parabéns pelo projeto.
    Estou montando um, porém não está aparecendo no display a parte do "Melhor distância" e estou com alguns problemas com o servo do sensor ultra sônico, pois o mesmo não se move para calcular a distância, somente algumas vezes na hora de ligar ele se reposiciona no centro, caso esteja fora.
    Já conferi as ligações, mas o problema persiste. Você teria alguma ideia do que pode ser o problema ?
    Muito Obrigado !

    ResponderExcluir
    Respostas
    1. Olá, Felipe, obrigado!
      Isso tudo pode acontecer por dois motivos:
      ligamento de cabos errados e tenta colocar uma fonte externa com 1A para testar.
      Abraço

      Excluir
  6. Eu posso usa (( Chassis Acrilico Duplo Robotica / Smart Car 2 Motores 2wd )) nesse projeto ??

    ResponderExcluir
  7. qual a numeração dos pinos do LCD que ligou? tem como fazer o esboço tipo pino 1 do LCD ---- pino 9 do Arduino

    ResponderExcluir
  8. Estou com um probleminha na programação, o erro é o seguinte : ''sketch_sep15a.ino: 10: 90: erro fatal: Ultrasonic.h: Nenhum tal lima ou diretório
    compilação terminada.
    Erro Compilando.'' . Como posso resolve-lo . Abraços! Desde já agradeço.

    ResponderExcluir
    Respostas
    1. amigo esse erro é por que vc não instalou a biblioteca ultrassonic

      Excluir

O seu comentário estará aguardando aprovação.