Prezados, bom dia!

Estou trabalhando em um projeto de robô o qual utiliza o controlador L298N para acionar dois motores DC. Estou utilizando o esquema da imagem em anexo porém estou utilizando as entradas de 2 a 5 no Arduino Uno R3 e também estou utilizando uma fonte externa (bateria Li-po 11,1 V, 2,2 A) que também alimenta o Arduino através da saída 5V do controlador e da porta Vin do Arduino. Já tentei todos os métodos que encontrei na internet e utilizei 5 controladores mas nada faz com que os motores funcionem. Segue abaixo o código, ainda incompleto, que estou utilizando:

int obstaculoPin = 7;
int obstaculo = HIGH;
int IN1 = 2;
int IN2 = 3;
int IN3 = 4;
int IN4 = 5;

void setup() {
// put your setup code here, to run once:
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(obstaculoPin, INPUT);
}

void loop() {
// put your main code here, to run repeatedly:
// haObstaculo();
andarFrente();
}

// Verifica se há obstáculo a frente e retorna true caso exista e false caso não tenha.
boolean haObstaculo() {
boolean x;
obstaculo = digitalRead(obstaculoPin);
if (obstaculo == LOW) {
Serial.println("OBSTACULO!");
x = true;
}
else {
Serial.println("limpo");
x = false;
}
delay(200);
return x;
}

void andarFrente() {
//Gira o Motor A no sentido horario
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
delay(2000);
//Para o motor A
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
delay(500);
//Gira o Motor B no sentido horario
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(2000);
//Para o motor B
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
delay(500);

//Gira o Motor A no sentido anti-horario
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
delay(2000);
//Para o motor A
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
delay(500);
//Gira o Motor B no sentido anti-horario
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(2000);
//Para o motor B
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
delay(500);
}

Caso alguém possa me ajudar, desde já agradeço muito.

Exibições: 451

Anexos

As respostas para este tópico estão encerradas.

Respostas a este tópico

Dá uma olhada neste post, acabo de colocar o código fonte de um carrinho lá:

http://labdegaragem.com/forum/topics/gentileza-amigos-projeto-de-um...

Caro professor Francesco, perdoe a minha falta de habilidade em navegar pelos posts deste forum, mas não localizei o código que me indicou. Acredito também que o problema não seja o meu código já que é um código de exemplo utilizado em todos os exemplos de funcionamento do L298N que vi pela internet a fora. Creio que seja algo relacionado à forma que liguei os componentes.

Boa noite, 

Primeira recomendação : - não use o regulador de 5V do driver L298 para alimentar o seu Arduino.

Ele possivelmente não esta suportando a carga. E tem também o problema de ruidos elétricos provocados pleo motor.

Use a bateria para alimentar o Arduino, usando um conector de 12V .

Qual sensor de obstáculo esta usando na porta 7 ?

Bom dia José Gustavo! O sensor em questão é um IR como o da imagem abaixo.

Achei na WEB , essa informação sobre o seu sensor :
Nível lógico da saída quando obstáculo detectado: Nível lógico BAIXO

Não entendi essa rotina de obstáculo. Esta sempre dando delay.
Na verdade ela esta desativada.

boolean x;
obstaculo = digitalRead(obstaculoPin);
i f (obstaculo == LOW)
{
Serial.println("OBSTACULO!");
x = true;
}
else
{
Serial.println("limpo");
x = false;
}
delay(200);
return x;
}

Essa rotina ainda não está pronta, o sensor nem está conectado à placa ainda. No momento estou pelejando para fazer com que os motores funcionem.

Dê uma estudada nesse manual do L298 (anexado) .

Anexos

Andei olhando o manual e estou utilizando o mesmo esquema indicado na página 9, a diferença é que estou utilizando a saída 5V para alimentar o Arduino. Irei tentar com fontes diferentes para cada componente para verificar a sua hipótese da sobrecarga e dos ruídos elétricos. Quaisquer novidades postarei aqui.

Encontrei o seu erro !  Jogo dos 7 erros !

No seu Sketch :

int IN1 = 2;
int IN2 = 3;
int IN3 = 4;
int IN4 = 5;

Mas no diagrama esta usando outros pinos !  Mande o link da sua placa. 

int IN1 = 4;
int IN2 = 5;
int IN3 = 6;
int IN4 = 7;

O diagrama é genérico, somente o utilizei para mostrar como fiz, porém como disse anteriormente, e o senhor citou, utilizei os pinos de 2 a 5.

Informe como estão todos os jumpers do seu módulo. Era para funcionar.

Tire uma foto.

Mande o link da sua placa. 

Qual motor CC esta usando (é para 12V) ? Se conectar diretamente na bateria, os motores giram ? 

Boa tarde senhor José Gustavo. Encontrei o problema em meu projeto. Foi uma coisinha besta, erro de iniciante. Eu estou utilizando pinos PWM para controlar a velocidade do meu robô mas não estava definindo a velocidade. Refiz o projeto que ficou desta forma:

E utilizei o seguinte código:

/*Pinagem do arduino*/
 
//motor A
int IN1 = 2 ;
int IN2 = 4 ;
int velocidadeA = 3;
 
//motor B
int IN3 = 6 ;
int IN4 = 7 ;
int velocidadeB = 5;
 
//variavel auxiliar
int velocidade = 0;
 
//Inicializa Pinos
void setup(){
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(velocidadeA,OUTPUT);
pinMode(velocidadeB,OUTPUT);
}
 
void loop(){
 
/*Exemplo de velocidades no motor A*/
 
//Sentido Horario
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
 
//Alta
analogWrite(velocidadeA,230);
 
//Intermediaria
analogWrite(velocidadeA,150);
 
//Baixa
analogWrite(velocidadeA,80);
 
/*Exemplo de variacao de velocidade no motor B*/
 
//Sentido Horario
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
 
//velocidade de 0 a 255
while (velocidadeB < 255){
analogWrite(velocidadeB,velocidade);
velocidade = velocidade + 10;
delay(50);
}
//velocidade de 255 a 0
while (velocidadeB > 0){
analogWrite(velocidadeB,velocidade);
velocidade = velocidade - 10;
delay(50);
}
}
/*Pinagem do arduino*/
 
//motor A
int IN1 = 2 ;
int IN2 = 4 ;
int velocidadeA = 3;
 
//motor B
int IN3 = 6 ;
int IN4 = 7 ;
int velocidadeB = 5;
 
//variavel auxiliar
int velocidade = 0;
 
//Inicializa Pinos
void setup(){
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(velocidadeA,OUTPUT);
pinMode(velocidadeB,OUTPUT);
}
 
void loop(){
 
/*Exemplo de velocidades no motor A*/
 
//Sentido Horario
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
 
//Alta
analogWrite(velocidadeA,230);
 
//Intermediaria
analogWrite(velocidadeA,150);
 
//Baixa
analogWrite(velocidadeA,80);
 
/*Exemplo de variacao de velocidade no motor B*/
 
//Sentido Horario
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
 
//velocidade de 0 a 255
while (velocidadeB < 255){
analogWrite(velocidadeB,velocidade);
velocidade = velocidade + 10;
delay(50);
}
//velocidade de 255 a 0
while (velocidadeB > 0){
analogWrite(velocidadeB,velocidade);
velocidade = velocidade - 10;
delay(50);
}
}
Desta forma os motores funcionaram. Agora vou criar as demais rotinas para que o robô detecte obstáculos e desvie deles.
Gostaria de agradecer, muito, ao senhor pelo empenho em me ajudar.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço