• estou precisando de uma ajuda p/ programar um ultrasom servo + ponte H(L298N) + Arduino UNO

  • programei ele mas so anda p/ frente

Exibições: 629

Responder esta

Respostas a este tópico

PH, boa tarde.

Posta seu code aqui, para que possamos ajuda-lo.

Rui

#include <Servo.h>
#include <Ultrasonic.h>
Servo myservo;
int pos = 90;  //posição inicial do servo
int echopin = 9; // a saido echo do SRF05 liga no pin 9
int trigerpin = 8; // a saida triger do SRFo5 liga no pin 8
int in1 = 2; // pino 1 do motor 1
int in2 = 3; // pino 2 do motor 1
int in3 = 4; // pino 1 do motor 2
int in4 = 7; // pinto 2 do motor 2
int enable1 = 5; // define a velociadade do motor 1
int enable2 = 6; // define a velocidade do motor 2
unsigned long pulsetime = 0; // Variavel que faz a leitura do pulso
unsigned long distancia = 0; //Variavel que que armazena a distancia
void stopMotor() {
  //para os motores
  analogWrite(enable1, 0);
  analogWrite(enable2, 0);
}
void setup()
{
  myservo.attach(10); // anexa o servo lógico ao fisico no pino 10
  pinMode(enable1, OUTPUT); // define todos os pinos como saída
  pinMode(enable2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(trigerpin, OUTPUT); // define o pino triger como saída
  pinMode(echopin, INPUT); // define o pino echo como entrada
}
void loop()
{

  distancia = leiaDistancia(); //executa a funcao que retorna a distancia em cm
 
  if (distancia > 16) // se a distancia for maior que 16 cm
     {
       andeParaFrente();  //continua andando.
     }
  else { //senão, lógico, a distancia frontal é MENOR ou IGUAL a 16.

       
       stopMotor(); //pare o motor
       delay(1000); //aguarde 1 segundo
       
       int distEsquerda = 0;
       int distDireita = 0;
       myservo.write(175); //gira o servo a 175 graus
       delay(1000); // tem que ser ajustado para esperar o servo chegar no 175
       distEsquerda = leiaDistancia();
       myservo.write(90); //gira o servo para 90 graus - deve ser a posicao inicial ou central.
              
       //vamos analisar o que foi lido na Esquerda
       if (distEsquerda > 16) // se a distancia ESQUERDA for maior que 16 cm
       {
          giraParaEsquerda(3000); //invoca a funcao que gira para ESQUERDA por 3 segundos. Favor ajustar esse valor.
       
       } else { //senão, lógico, a distancia esquerda é MENOR ou IGUAL a 16. Vamos analisar a DIREITA, então.
           myservo.write(5);
           delay(1000);//tem que esperar o servo chegar em 5 graus.
           distDireita = leiaDistancia(); // lendo a distancia da DIREITA
           myservo.write(90); //gira o servo para 90 graus - deve ser a posicao inicial ou central.
           
           if(distDireita > 16){
             giraParaDireita(3000); // mesma coisa. ajute esse TEMPO para que o robo gire os 5 graus.
           }
       }
  }
}
int leiaDistancia(){ //funcao que devolve a distancia em cm
  digitalWrite(trigerpin, HIGH);
  delayMicroseconds(50);
  digitalWrite(trigerpin,LOW);
  pulsetime = pulseIn(echopin, HIGH);
  return pulsetime/58; // converte para cm
}
void andeParaFrente(){
    analogWrite(enable1, 255); // velocidade do motor 1
    analogWrite(enable2, 255); // velocidade do motor 2
    digitalWrite(in1, LOW); // apenas pinos secundarios em HiGH, definindo o movimento para frente
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
}
void giraParaEsquerda(long tempo){//funcao para girar a esquerda. Observe o tempo em millissegundos.
      analogWrite(enable1, 255);
      analogWrite(enable2, 0); // gira para esquerda
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(tempo); //o motor só deve ficar ligado esse tempo.
      stopMotor(); //agora eu desligo.
}
void giraParaDireita(long tempo){//funcao para girar a esquerda. Observe o tempo em millissegundos.
      analogWrite(enable1, 0); // girar a direta
      analogWrite(enable2, 255);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(tempo); //o motor só deve ficar ligado esse tempo.
      stopMotor(); //agora eu desligo.
}

PH,

estava revendo seu código qdo me toquei que voce esta falando em controlar um servo com Ponte H.

Por favor, tem como colocar aqui o desenho da sua ligação?

Normalmente para controlar servo não é necessario ponte H.

Ele é controlado ele por um pino somente.  Dái a dúvida de como voce está fazendo.

Rui

???????

PH, bom dia.

Eu não identifiquei a ligação dos enable1 e enable2 no seu desenho. Pinos 5 e 6.

Pela sua programação, são eles que param ou liberam o motor.

int enable1 = 5; // define a velociadade do motor 1
int enable2 = 6; // define a velocidade do motor 2

Rui

Bom dia! Oq eu poderia fazer p/ estar resolvendo esse problema?

PH, veja se este link ajuda.

Ele ensina como movimentar o motor CW,  CCw e parar o motor,usando esta ponte H igual a sua.

http://blog.filipeflop.com/motores-e-servos/motor-dc-arduino-ponte-...

Rui

obrigado amigo, vou tentar arrumar aqui

De feedbck depois.

Deu certo, tenho outra duvida, quero usar um display lcd mas ñ tenho portas suficientes no arduíno, posso usar a mesma porta 2x

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço