estou precisando de uma ajuda p/ programar um ultrasom servo + ponte H(L298N) + Arduino UNO
programei ele mas so anda p/ frente
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por