2 motores de C.C. con el L298N

Esta vez, usaremos el L298N, este driver para motores es uno de los más populares entre los aficionados a la electrónica y la robótica.

 l294n

Material requerido

cropped-arduino-1.jpg
  • Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.
Img_3_4
  •  Una Protoboard.
chasis-de-vehiculo-robotico-para-arduino-pic-avr-etc-11690-MLM20046960131_022014-O
  • Chasis del robot
l294n
  • Un H bridge integrado L298N
Img_3_6-300x185
  • Algunos cables de Protoboard.
motor_CC
  • Dos motores de corriente continua.
Para entender lo siguiente es conveniente que veas la entrada donde se explican los puentes en H.
El L298N tiene en su interior dos puentes H y tiene las siguientes características:
  • Tensión de funcionamiento 6-48V.
  • Intensidad por canal 2A.
  • Salida de 5V.

Tutorial modulo L298N_2

Este módulo basado en el chip L298N te permite controlar dos motores de corriente continua o un motor paso a paso bipolar de hasta 2 amperios.

El módulo cuenta con todos los componentes necesarios para funcionar sin necesidad de elementos adicionales, entre ellos diodos de protección y un regulador LM7805 que suministra 5V a la parte lógica del integrado L298N. Cuenta con jumpers de selección para habilitar cada una de las salidas del módulo (A y B). La salida A esta conformada por OUT1 y OUT2 y la salida B por OUT3 y OUT4. Los pines de habilitación son ENA y ENB respectivamente.

L298N_pines_Electronilab

En la parte inferior se encuentran los pines de control del módulo, marcados como IN1IN2IN3 e IN4.

Conexión de alimentación

Este módulo se puede alimentar de 2 maneras gracias al regulador integrado LM7805.

L298N_power_Electronilab

Cuando el jumper de selección de 5V se encuentra activo, el módulo permite una alimentación de entre 6V a 12V DC. Como el regulador se encuentra activo, el pin marcado como +5V tendrá un voltaje de 5V DC.

Cuando el jumper de selección de 5V se encuentra inactivo, el módulo permite una alimentación de entre 12V a 35V DC. Como el regulador no esta funcionando, tendremos que conectar el pin de +5V a una tensión de 5V para alimentar la parte lógica del L298N.

Nunca conectar una tensión de entrada al pin de +5V, cuando el jumper de selección de 5V se encuentre activado. Esto provocaría un corto y podría dañar permanentemente el módulo.

 

El esquema.

Como demostración, vamos a controlar un motor DC a través de la salida B del módulo. El pin ENB se conectará con el jumper a +5V.

L298N_1_mot

Código en Arduino

El programa básicamente activa el motor en un sentido durante 4 segundos, luego detiene el motor durante 0.5 segundos, después activa el motor en sentido inverso durante 4 segundos y por último detiene el motor durante 5 segundos. Luego repite la acción indefinidamente.

int IN3 = 5;
int IN4 = 4;
void setup() {
pinMode (IN4, OUTPUT); // Input4 conectada al pin 4
pinMode (IN3, OUTPUT); // Input3 conectada al pin 5
}

void loop(){

// Motor gira en un sentido
digitalWrite (IN4, HIGH);
digitalWrite (IN3, LOW);
delay(4000);

// Motor no gira
digitalWrite (IN4, LOW);
delay(500);

// Motor gira en sentido inverso
digitalWrite (IN3, HIGH);
delay(4000);
/

/ Motor no gira
digitalWrite (IN3, LOW);
delay(5000);

}

Control de un motor DC variando su velocidad

Si queremos controlar la velocidad del motor, tenemos que hacer uso de PWM. Este PWM será aplicado a los pines de activación de cada salida o pines ENA y ENB respectivamente, por tanto los jumper de selección no serán usados.

L298N_1_mot_PWM

Código en Arduino

El programa controla la velocidad de un motor DC aplicando PWM al pin ENB del módulo L298N.

int IN3 = 5; // Input3 conectada al pin 5
int IN4 = 4; // Input4 conectada al pin 4
int ENB = 3; // ENB conectada al pin 3 de Arduino

void setup(){

pinMode (ENB, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);

 }

void loop(){

//Preparamos la salida para que el motor gire en un sentido
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);

// Aplicamos PWM al pin ENB, haciendo girar el motor, cada 2 seg aumenta la velocidad
analogWrite(ENB,55);
delay(2000);
analogWrite(ENB,105);
delay(2000);
analogWrite(ENB,255);
delay(2000);

// Apagamos el motor y esperamos 5 seg
analogWrite(ENB,0);
delay(5000);

}

Nota: Si usamos alimentaciones diferentes para el controlador de motores y Arduino, hay que unir Gnd de ambas placas.

El programa

En esta ocasión tenemos dos códigos, el primero usamos directamente el L298N con las funciones de Arduino, en el segundo código de ejemplo usamos una librería desarrollada por leantec para facilitar el control de dos motores de cc con este driver.

Código 1 (Sin librería)

// Configuramos los pines que vamos a usar
int motorDer1=2;//El pin 2 a In1 del L298N
int motorDer2=3;//El pin 3 a In2 del L298N
int motorIzq1=7;//El pin 7 a In3 del L298N
int motorIzq2=4;//El pin 4 a In4 del L298N
int derecho=5;  //El pin 5 a EnA del L298N
int izquierdo=6;//El pin 6 aEnB del L298N

int velocidad=150;

void setup() 
{ 
  //Configuramos los pines como salida
  pinMode(motorDer1, OUTPUT); 
  pinMode(motorDer2, OUTPUT);
  pinMode(motorIzq1, OUTPUT); 
  pinMode(motorIzq2, OUTPUT); 
  pinMode(derecho, OUTPUT);
  pinMode(izquierdo, OUTPUT);

} 
void atras(){ 
  digitalWrite(motorDer1,HIGH);
  digitalWrite(motorDer2,LOW);
  digitalWrite(motorIzq1,HIGH);
  digitalWrite(motorIzq2,LOW);
  analogWrite(derecho,200);//Velocidad motor
  analogWrite(izquierdo,200);
}
void adelante(){ 
  digitalWrite(motorDer1,LOW);
  digitalWrite(motorDer2,HIGH);
  digitalWrite(motorIzq1,LOW);
  digitalWrite(motorIzq2,HIGH);
  analogWrite(derecho,200);
  analogWrite(izquierdo,200);
}
void giraDerecha(){ 
  digitalWrite(motorDer1,HIGH);
  digitalWrite(motorDer2,LOW);
  digitalWrite(motorIzq1,LOW);
  digitalWrite(motorIzq2,HIGH);
  analogWrite(derecho,200);
  analogWrite(izquierdo,200);
}
void giraIzquierda(){ 
  digitalWrite(motorDer1,LOW);
  digitalWrite(motorDer2,HIGH);
  digitalWrite(motorIzq1,HIGH);
  digitalWrite(motorIzq2,LOW);
  analogWrite(derecho,200);
  analogWrite(izquierdo,200);
}
void parar(){ 
  digitalWrite(motorDer1,LOW);
  digitalWrite(motorDer2,LOW);
  digitalWrite(motorIzq1,LOW);
  digitalWrite(motorIzq2,LOW);
  analogWrite(derecho,200);
  analogWrite(izquierdo,200);
}

void loop() { 
       adelante();
       delay(3000);
       atras();
       delay(3000);
       giraDerecha();
       delay(3000);
       giraIzquierda();
       delay(3000);
       parar();
       delay(3000);
  }

Código 2 (Con librería)

Librería control de motores.

DESCARGAR LIBRERÍA

Esta librería se configura en con una sola linea de código.

#include <LEANTEC_ControlMotor.h>
ControlMotor control(2,3,7,4,5,6); 
// motorDer1, motorDer2,motorIzq1, motorIzq2
// derecho,izquierdo
control.Motor(200,100);
Y el control de motores se hace con la siguiente linea de código, donde el primer número que está en el paréntesis es la velocidad con la que se mueven los motores y el siguiente número nos indica el giro que hacen y la dirección.
// Giro del 100% a la derecha 
// a una velocidad de 200
control.Motor(200,100);
//giro del 100% a la izquierda 
// a una velociad de 200
control.Motor(200,-100);
// giro del 70% a la derecha 
// a una velociad de 200
control.Motor(200,70);
// Avanzar recto una velociad de 180.*/
control.Motor(180,1);
#include <LEANTEC_ControlMotor.h>
ControlMotor control(2,3,7,4,5,6); 
int velocidad=150;

void setup() { 
   //En esta ocasión no necesitamos configurar   
   //pines ya que la librería lo hace.
} 
 
void loop(){

//Avanzar
 while(velocidad<254){
     velocidad++;
     control.Motor(velocidad,1); 
     delay(200);
 }
// Atrás
  control.Motor(-180,1);
  delay(3000);
//girar a la derecha. 
  control.Motor(200,100);
  delay(3000);
// girar a la izquierda.  
  control.Motor(200,-100);
  delay(3000);
//Los motores se paran.
  control.Motor(0,1);
  delay(3000);
  
  velocidad=150;//Reseteamos la velocidad
  }