Robô autônomo (Servomotor fica voltando quando detecta um obstaculo para posição inicial) e dificuldade em terminar o projeto

Olá a todos , estou com uma pequena dificuldade em desenvolver o algoritmo...

a Idéia é montar um robô autônomo que caso ele ache um obstáculo a menos de 10 cm , ele gire o servomotor para a esquerda(0); e direita(160); (Do servomotor) e caso ele ache uma distância a menos de 10 cm seja ele para a direita ou esquerda do sentido que o servomotor girou ele faça uma novabusca até que a condição (novabusca > 10) para ele seguir em frente (Chama a função "frente();")

OBS : O servomotor quando acha um obstaculo ele vira pro sentido que achou o obstaculo mas fica "voltando" pra posição inicial ( 90º) gostaria de saber o porque dele ficar assim,sendo que não estou usando DELAY;

CODE :

// FUNCAO SERVOMOTOR
//Inicializa a posiçao do servomotor
int distancia;

int distanciae;
int distanciad;

int novabusca;

#include <Servo.h>

Servo meuservo;


#define motor1A 4
#define motor2A 5

#define motor1B 6
#define motor2B 7


int pwma = 3;
int pwmb = 9;


#include "Ultrasonic.h"
// Portas do Arduino que vou utilizar para programar o sensor

Ultrasonic ultrasonic(12,13);





void setup ()
{
  Serial.print("Lendo dados dos sensores:");
  Serial.begin(9600);

  pinMode(motor1A,OUTPUT);
  pinMode(motor2A,OUTPUT);

  pinMode(motor1B,OUTPUT);
  pinMode(motor2B,OUTPUT);
 
  pinMode(pwma,OUTPUT);
  pinMode(pwmb,OUTPUT);
 
  meuservo.attach(8);  


  //Centraliza Servomotor :)
  meuservo.write(90);
 

}

void loop () {

busca();

if (distancia < 10)  
{
  parado();
 
  // Vira o servo para a direita (busca)

   meuservo.write(160);
 
   nbusca();
 }

 
 
 if ( novabusca < 10) {
 
   
   // Vira para a esquerda
   meuservo.write(0);   
 
  parado();
   nbusca();    // Faz uma nova busca para ver se o sensor   eh menor que 10 cm

 


// Condicao para verificar se o sensor da esquerda eh menor que 10

    if ( novabusca < 10) {
      parado();
      nbusca();
      
  }
  else {
    parado();
    nbusca();
    esquerda();
   //Centralizar o motor
 
  }
 }

   
   if ( novabusca < 10) {
     parado();
     nbusca();
     meuservo.write(145);
    
      }else{
         parado();      
        nbusca();
        direita();
        
      }
      

 
        if (novabusca > 10)      {
   
          parado();
          esquerda();
    nbusca();
    }
  else{
     parado();
    direita();
    nbusca();
    
  }


    if (novabusca > 10)
    {
    frente();
  }

}


void frente () {

  digitalWrite(motor1A,LOW);
  digitalWrite(motor2A,HIGH);
 
  analogWrite(pwma,130);
 
  digitalWrite(motor1B,LOW);
  digitalWrite(motor2B,HIGH);
 
  analogWrite(pwmb,130);
}

void tras(){

  digitalWrite(motor1A,HIGH);
  digitalWrite(motor2A,LOW);
 
   analogWrite(pwma,100);
 
  digitalWrite(motor1B,LOW);
  digitalWrite(motor2B,HIGH);
 
   analogWrite(pwmb,100);

}


void direita(){

  digitalWrite(motor1A,HIGH);
  digitalWrite(motor2A,LOW);
 
  analogWrite(pwma,100);
 
  digitalWrite(motor1B,HIGH);
  digitalWrite(motor2B,LOW);

 analogWrite(pwmb,100);
}


void esquerda () {

  digitalWrite(motor1A,LOW);
  digitalWrite(motor2A,LOW);

   analogWrite(pwma,100);
   
  digitalWrite(motor1B,HIGH);
  digitalWrite(motor2B,HIGH);

   analogWrite(pwmb,100);
}

void parado () {

  digitalWrite(motor1A,LOW);
  digitalWrite(motor2A,LOW);
  analogWrite(pwma,0);
 
  digitalWrite(motor1B,LOW);
  digitalWrite(motor2B,LOW);
 
   analogWrite(pwmb,0);

}

/*
void desvio_direita(){

  parado();
  delay(1000);
  direita();
  delay(1000);
  frente();
}
*/
void busca(){  

  // Funçao para Fazer leituras de Sensor Ultrasonico t
  distancia = (ultrasonic.Ranging(CM));

  Serial.print(distancia);
  Serial.println("cm de distancia");
 

}
void nbusca(){  

  // Funçao para Fazer leituras de Sensor Ultrasonico t
  novabusca = (ultrasonic.Ranging(CM));

  Serial.print(distancia);
  Serial.println("cm de distancia");
 

}

Exibições: 312

Responder esta

Respostas a este tópico

Olá Tiago.

Você testou sem usar a função meuservo.write(90); no setup?

Dica: você pode estabelecer outras decisões com valores determinados dos centímetros, ao invés de usar só else.

Exemplo:

 if ( novabusca < 10)

{
      parado();
      nbusca();
 }


  else if(novabusca>=10)

{
    parado();
    nbusca();
    esquerda();
   //Centralizar o motor
  
  }
 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço