Robô Autônomo SR 2 – Aprenda, de um jeito fácil, a robótica na prática

Leonardo Campbell
Faça você mesmo um robô autônomo com ponte h l298n e arduino na sua casa e aprenda muita robótica nesse tutorial! Nele, eu explico tudo quanto ao Robô Autônomo SR 2 com arduino, você vai aprender a fazer o seu robô! Ele se movimenta sozinho pela casa e sem colidir. Ao encontrar um obstáculo, o robô para e da uma ré e verifica automaticamente qual lado tem mais espaço para ele girar e ir sozinho. Com o Robô Autônomo SR 2 você praticará a robótica, poderá fazê-lo para trabalhos de escola e/ou de faculdade, poderá usá-lo como base na produção de um robô personalizado.

Compartilhe esse post

Lista dos materias necessarios

1 Kit Chassi 2WD (2 rodas) Robô para Arduino
1 arduino uno r3
1 Motor Driver Shield L298N Ponte H para Arduino
1 Micro Servo 9g SG90 TowerPro
1 Mini Protoboard 170 pontos
1 Sensor de Distância Ultrassônico HC-SR04 para arduino
1 Clip de Bateria 9V [Horizontal], conector de bateria ou suporte de bateria
1 Botão liga/desliga quadrado preto- Chave Gangorra
6 Jumper 20cm (1 fio Fêmea-Macho)
7 Jumper 20cm (1 fio machoMacho)
3 Abraçadeira de Nylon 15cm 1un
1 fiat dupla face

1 Bateria 9v alcalina ou recarregavel 

Esquemático de ligação

Código fonte

Baixe a biblioteca usada: Servo

/*
  ------------------------------------------Robô Autônomo SR 2------------------------------------------------
  Versão do Software: 1.0 SR 2 //não apague essa linha, para futuras consultas
  Software open source, favor citar o autor: Seu Robô https://SeuRobo.com.br/
  Criado por: Leonardo Campbell - Seu Robô  Uptades:  Erteza Tawsif Efaz
  Robô autonomo SR 2 é uma versão bem melhorada do Robô SR 1
*/
#include <Servo.h>     // Adiciona a biblitoeca Servo

//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
// motor um            // Ligação dos pinos da Ponte H L298N
#define enA  11        //pino enA na porta digital 10
#define in1  9         //pino in1 na porta digital 9
#define in2  8         //pino in2 na porta digital 8
// motor dois          // Ligação dos pinos da Ponte H L298N
#define enB  5         //pino enB na porta digital 5
#define in3  7         //pino in3 na porta digital 7
#define in4  6         //pino in4 na porta digital 6

Servo servoSensor;       // Crie um objeto Servo para controlar o Servo.

//função para procurar obtasculo a todo o tempo
int Procurar (void) {
  float duracao = 0.0;              // variavael para quartar a duração do retorno do som
  float CM = 0.0;                   // variavael para quartar a distancia
  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.
  CM = (duracao / 58.8);            //Calcula a distância em centimetros
  Serial.print("Distancia em CM: ");
  Serial.println(CM);               //Imprimi no monitor serial a distancia
  return CM;                        // Return to CM.
}

//Variaveis
int DistanciaDireita, DistanciaEsquerda;  // variavel de Distâncias de ambos os lados
float Distancia = 0.00;                   // variavel para guardar a distancia

//Velocidades dos motores (você pode calibrar cada motor colocando os valores de 0 a 254)
int velocidadeMotorUm = 80;
int velocidadeMotorDois = 95;

// Função que é executado na inicialização do Arduino
void setup() {
  Serial.begin(9600); // inicializa a comunicação serial para mostrar dados
  
  //Define o servo na porta 13
  servoSensor.attach(13); 
  
  // Definir todos os pinos de controle do motor como saídas
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
       
  //Configuraçõs do sensor ultrassonico
  pinMode(trigPin, OUTPUT);     //define o pino TRIG como saída
  pinMode(echoPin, INPUT);      //define o pino ECHO como entrada
}

// Função principal do Arduino
void loop() {
  servoSensor.write (90);                           // Gira o Servo com o sensor a 90 graus
  delay (100);                                      // Aguarda 100 milesugodos
  Distancia = Procurar ();                          // Medindo a Distancia em CM.
  if (Distancia < 40) {                             // Se há obstáculo encontrado a menos de 40cm.
   direcao ();                                      // Se Frente estiver bloqueado, mude de direção
  }
  else if (Distancia >= 40)  {                      // Se o obstáculo for encontrado entre a mais de 40cm 
    Frente ();                                      // Robô se move para a direção da Frente.
  }
  //Seu Robô http://SeuRobo.com.br/
}

// Função para pegar as distancias de cada direção
void direcao () {        
  Parar ();                                         // O robô Para
  ParaTras ();                                      // O robô vai para tras
  Parar ();                                         // O robô Para
  servoSensor.write (180);                          // Gira o Servo com o sensor a 180 graus
  delay (1000);              
  DistanciaEsquerda = Procurar ();                  // Defina a Distancia da Esquerda 
  delay (500);               
  servoSensor.write (0);                            // Gira o Servo com o sensor a 0 graus
  delay (500);               
  DistanciaDireita = Procurar ();                   // Defina a Distancia da Direita
  delay (500);               
  servoSensor.write (90);                           // Gira o Servo com o sensor a 90 graus
  delay (500);              
  CompareDistance ();                               // Encontre a distância mais longa.
}

// Função para calcular qual a distancia é melhor para o robô ir
void CompareDistance () {                   
  if (DistanciaDireita > DistanciaEsquerda) {       // Se a direita está menos obstruída.
    Vireadireita ();                                // O robô vai virar a direita 
  }
  else if (DistanciaEsquerda > DistanciaDireita) {  // Se Esquerda estiver menos obstruída.
    VireaEsquerda ();                               // Robô Vire na direção esquerda.
  }
  else {                                            // Se ambos estiverem igualmente obstruídos.
    Retorne ();                                     // Robô Vire-se.
  }
}

// Função para fazer o carro parar
void Parar()
{
  Serial.println("Robô: Parar ");
  digitalWrite(in1, LOW);                           //Configurar a ponte h 
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  delay(100);                                       //aguarda um tempo
}

// Função para fazer o robô andar para frente
void Frente()
{
  Serial.println("Robô: Frente ");
  digitalWrite(in1, HIGH);                          //Configurar a ponte h 
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, velocidadeMotorUm);              // Defina a velocidade do motor Um
  analogWrite(enB, velocidadeMotorDois);            // Defina a velocidade do motor Dois                         
}

// Função que faz o robô andar para trás e emite som quando ele dá ré
void ParaTras()
{
  Serial.println("Robô: Ré ");
  digitalWrite(in1, LOW);                           //Configurar a ponte h 
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  delay(300);                                       //aguarda um tempo
  analogWrite(enA, velocidadeMotorUm);              // Defina a velocidade do motor Um
  analogWrite(enB, velocidadeMotorDois);            // Defina a velocidade do motor Dois                         
}

// Função que faz o robô virar à direita, https://SeuRobo.com.br/
void Vireadireita()
{
  Serial.println("Robô: Direita ");
  digitalWrite(in1, LOW);                           //Configurar a ponte h 
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  delay(300);                                       //aguarda um tempo
  analogWrite(enA, velocidadeMotorUm);              // Defina a velocidade do motor Um
  analogWrite(enB, velocidadeMotorDois);            // Defina a velocidade do motor Dois                         
}

// Função que faz o robô virar à esquerda
void VireaEsquerda()
{
  Serial.println("Robô: Esquerda ");                
  digitalWrite(in1, HIGH);                          //Configurar a ponte h 
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  delay(300);                                       //aguarda um tempo
  analogWrite(enA, velocidadeMotorUm);              // Defina a velocidade do motor Um
  analogWrite(enB, velocidadeMotorDois);            // Defina a velocidade do motor Dois                         
}

//Função para o robô virar para o outro lado
void Retorne () {    
  Serial.println("Robô: Girar ");      
  digitalWrite(in1, HIGH);                          //Configurar a ponte h 
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  delay (700);                                      //aguarda um tempo
  analogWrite(enA, velocidadeMotorUm);              // Defina a velocidade do motor Um
  analogWrite(enB, velocidadeMotorDois);            // Defina a velocidade do motor Dois                         
}

//Fim
//Versão do Software: 1.0 SR 2 SeuRobo.com.br //não apague essa linha, para futuras consultas

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