Autonomous Arduino Rover with 3 Ping Sensors

User avatar
Magdalo
Posts: 12
Joined: Fri Mar 17, 2017 2:17 pm

Autonomous Arduino Rover with 3 Ping Sensors

Tue Mar 21, 2017 6:54 pm

We just made some little experiment and come up successful. However, the code is not that flawless, please share us your modds',. and Sorry for the Portuguese Language he is not english person. Just use google translate to understand the code.

Here is the Diagram
autonomous-schematic.jpg
The Code (ino file)

Code: Select all

     /* 
    Created by: Freitas
    Course: Computer Science
    */

    // Definitions and declarations of variables of the robot code maze resolver;
    
    #define vel_motor_esq 10  // Controls left motor speed;
    #define vel_motor_dir 11  // Controls right motor speed;         
    #define e1 8  // Controls the direction of rotation of the left motor;
    #define e2 9  // Controls the direction of rotation of the left motor;
    #define d1 12  // Controls the direction of rotation of the right motor;
    #define d2 7  // Controls the direction of rotation of the right motor;
 
    int trigger_frente = A4; // controls the pulse sent from the front sensor
    int echo_frente = A5; // controls the pulse received from the front sensor
    
    int trigger_esq = A2;// controla o impulso enviado do sensor da frente
    int echo_esq = A3;// controla o impulso recebido do sensor da frente
    
    int trigger_dir = A0;// controla o impulso enviado do sensor da frente
    int echo_dir = A1;// controla o impulso recebido do sensor da frente
    
    // Configuration of input types of declared variables;    
    void setup()
    {
        pinMode(trigger_frente, OUTPUT); // saída de sinal do arduino do trigger_frente
        pinMode(echo_frente, INPUT);// entrada de sinal do arduino do echo_frente
        
        pinMode(trigger_esq, OUTPUT);// saída de sinal do arduino do trigger_frente
        pinMode(echo_esq, INPUT);// entrada de sinal do arduino do echo_frente        
        
        pinMode(trigger_dir, OUTPUT);// saída de sinal do arduino do trigger_frente
        pinMode(echo_dir, INPUT);// entrada de sinal do arduino do echo_frente
       
        pinMode(vel_motor_esq, OUTPUT);// saída de sinal do arduino da velocidade do motor esquerdo
        pinMode(vel_motor_dir, OUTPUT);// saída de sinal do arduino da velocidade do motor direito
     
        pinMode(e1, OUTPUT);// saída de sinal do arduino do controle do sentido de rotação do motor esquerdo
        pinMode(e2, OUTPUT);// saída de sinal do arduino do controle do sentido de rotação do motor esquerdo
        pinMode(d1, OUTPUT);// saída de sinal do arduino do controle do sentido de rotação do motor direito
        pinMode(d2, OUTPUT);// saída de sinal do arduino do controle do sentido de rotação do motor direito       
        delay(5000);
    }
    
    // code in infinite repetition of the project;
    void loop()
    {
     // declaração de variáveis utilizadas para controle do projeto;
     long duracao_frente, duracao_esq, duracao_dir, direita, esquerda, frente; 
     
     
     digitalWrite(trigger_frente, LOW);  // é declarada as respectivas entradas e saídas de sinal do
     delayMicroseconds(2);               // sensor ultrassônico e armazenada pela variável do sensor
     digitalWrite(trigger_frente, HIGH); // que converte a velocidade do som que é de 340 m/s ou  
     delayMicroseconds(5);               // 29 microsegundos por centímetro, como o sinal vai e volta
     digitalWrite(trigger_frente, LOW);  // esse tempo é a metade sendo sensor= tempo/29/2 ;
     duracao_frente = pulseIn(echo_frente, HIGH); // assim segue também nos outros dois sensores .
     frente = duracao_frente/29/2;
    
     digitalWrite(trigger_esq, LOW);
     delayMicroseconds(2);
     digitalWrite(trigger_esq, HIGH);
     delayMicroseconds(5);
     digitalWrite(trigger_esq, LOW); 
     duracao_esq = pulseIn(echo_esq, HIGH);
     esquerda = duracao_esq/29/2;
    
     digitalWrite(trigger_dir, LOW);
     delayMicroseconds(2);
     digitalWrite(trigger_dir, HIGH);
     delayMicroseconds(5);
     digitalWrite(trigger_dir, LOW); 
     duracao_dir = pulseIn(echo_dir, HIGH);
     direita = duracao_dir/29/2; 
     
     analogWrite(vel_motor_esq, 0);  //bloco para inicializar as entradas com pulso 0 ou desligado;
     analogWrite(vel_motor_dir, 0); //
     analogWrite(e1, 0);            //
     analogWrite(e2, 0);            //  
     analogWrite(d1, 0);            //
     analogWrite(d2, 0);            //
     
       if(frente >8) // se caso houver caminho livre a frente ele segue esta lógica abaixo:
         {  
           // o uso dos quatro if´s abaixo dentro deste if são para o controle da dirigibilidade do robô,
           // a fim de mantê-lo seguindo a parede direita em linha reta;  
           
           if(direita >7 && direita< 13) // se caso a distância da parede a direita estiver entre 9 e 12 cm, o robô se
                                         // mantém em linha reta;
             {               
               analogWrite(vel_motor_esq, 120);
               analogWrite(vel_motor_dir, 150);
           
               analogWrite(e1, 255);
               analogWrite(e2, 0);
               analogWrite(d1, 0);
               analogWrite(d2, 255);                                                        
             }
         
           if(direita >=13)  // se caso a distância da parede a direita estiver maior ou igual a 13 cm, o robô aumenta
                             // sua velocidade do motor esquerdo para se aproximar da parede direita;
             {
               analogWrite(vel_motor_esq, 255);
               analogWrite(vel_motor_dir, 60);
           
               analogWrite(e1, 255);
               analogWrite(e2, 0);
               analogWrite(d1, 0);
               analogWrite(d2, 255);                               
             }
             
                 
           if(direita <=7)   // se caso a distância da parede a direita estiver menor ou igual a 8 cm, o robô aumenta
                             // sua velocidade do motor direito para se distanciar da parede direita;
             {
               analogWrite(vel_motor_esq, 60);
               analogWrite(vel_motor_dir, 255);
           
               analogWrite(e1, 255);
               analogWrite(e2, 0);
               analogWrite(d1, 0);
               analogWrite(d2, 255);                   
             }
         }
         
              
       if(esquerda <=20 && direita>20 && frente <=8) dir(); //se caso a distância a frente for menor ou igual a 8 cm,
                                                            //a distancia a direita for maior que 20 cm e a distância
                                                            //a esquerda for menor ou igual a 20 cm ele chama a função dir();   
            
       if(esquerda >20 && direita>20 && frente <=8) dir(); //se caso a distância a frente for menor ou igual a 8 cm,
                                                            //a distancia a direita for maior que 20 cm e a distância
                                                            //a esquerda for maior que 20 cm ele chama a função dir(); 
       
       if(direita <=20 && esquerda>20 && frente <=8) esq(); //se caso a distância a frente for menor ou igual a 8 cm,
                                                            //a distancia a direita for menor ou igual a 20 cm e a distância
                                                            //a esquerda for maior a 20 cm ele chama a função esq(); 
       
       if(direita<=20 && esquerda<=20 && frente<=8) voltar(); //se caso a distância a frente for menor ou igual a 8 cm,
                                                            //a distancia a direita for menor ou igual a 20 cm e a distância
                                                            //a esquerda for menor ou igual a 20 cm ele chama a função voltar();                              
    
    }
       
    void esq() // função para fazer com que o robô gire 90º a esquerda se caso não tiver saída a frente e a direita;
      {
       
        analogWrite(vel_motor_esq, 120);
        analogWrite(vel_motor_dir, 120);
           
        analogWrite(e1, 0);
        analogWrite(e2, 255);
        analogWrite(d1, 0);
        analogWrite(d2, 255);
        delay(700);      
        
      }
    
    void dir() // função para fazer com que o robô gire 90º a direita se caso não tiver saída a frente ou a esquerda;
      {
        
      
        analogWrite(vel_motor_esq, 120);
        analogWrite(vel_motor_dir, 120);
        
        analogWrite(e1, 255);
        analogWrite(e2, 0);
        analogWrite(d1, 255);
        analogWrite(d2, 0);             
        delay(800);
               
      }
    
    void voltar() // função para fazer com que o robô gire 180º se caso não tiver saída a frente, a direita e a esquerda;
      {
       
        analogWrite(vel_motor_esq, 120);
        analogWrite(vel_motor_dir, 120);
           
        analogWrite(e1, 255);
        analogWrite(e2, 0);
        analogWrite(d1, 255);
        analogWrite(d2, 0);
        delay(1200); 
         
      }   
  
    
    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            



Return to “Rovers”

Links