bclose

EL MÓDULO CONTROLADOR DE MOTORES L298N

Controlar la velocidad y el sentido de giro de dos motores de corriente continua.

Objetivos

 

 

    • Presentar el módulo controlador de motores L298N H-bridge.
    • Explicar cómo se conecta y se utiliza.
    • Usarlo para controlar dos motores de corriente continua.

 
 
 

Material requerido.

Imagen de Arduino UNO

Arduino Uno o equivalente.

 

Vista principal

Un módulo controlador de motores L298N.

 Paraja motriz

 Un par de ruedas y motores CC.

Img_3_6

Algunos cables de Protoboard macho-macho y macho-hembra.

 

INTRODUCCIÓN

 

El módulo controlador de motores L298N H-bridge nos permite controlar la velocidad y la dirección de dos motores de corriente continua o un motor paso a paso de una forma muy sencilla, gracias a los 2 los dos H-bridge que monta.

Ya hemos hablado de ellos antes, pero básicamente un puente-H o H-bridge es un componente formado por 4 transistores que nos permite invertir el sentido de la corriente, y de esta forma podemos invertir el sentido de giro del motor.

El rango de tensiones en el que trabaja este módulo va desde 3V hasta 35V, y una intensidad de hasta 2A. A la hora de alimentarlo hay que tener en cuenta que la electrónica del módulo consume unos 3V, así que los motores reciben 3V menos que la tensión con la que alimentemos el módulo.

Además el L298N incluye un regulador de tensión que nos permite obtener del módulo una tensión de 5V, perfecta para alimentar nuestro Arduino. Eso sí, este regulador sólo funciona si alimentamos el módulo con una tensión máxima de 12V.

Es un módulo que se utiliza mucho en proyectos de robótica, por su facilidad de uso y su reducido precio.

pines l298n h-bridge

 

CONEXIÓN Y FUNCIONAMIENTO

 

La entrada de tensión Vin admite tensiones entre 3V y 35V, y justo a su derecha en la imagen tenemos el pin que debemos conectar a GND.

La tercera conexión de ese grupo V lógico puede funcionar de dos maneras:

 
  • Si el jumper del regulador está cerrado activaremos el regulador de tensión del L298N, y en V lógico tendremos una salida de 5V, que podremos usar para lo que queramos, por ejemplo para alimentar una placa Arduino.
  • Si el quitamos el jumper desactivaremos el regulador, necesitaremos alimentar la parte lógica del módulo, así que tendremos que meter una tensión de 5V por la conexión V lógico para que el módulo funcione.
  • ¡Cuidado! Si introducimos corriente por V lógico con el jumper de regulación puesto podríamos dañar el módulo.
  • Además el regulador sólo funciona con tensiones hasta 12V en Vin, por encima de este valor tendremos que quitar el jumper y alimentar la parte lógica del módulo desde otra fuente. 

El resto de conexiones se usan de una u otra forma dependiendo si vamos a manejar dos motores de continua o un motor paso a paso. En esta sesión nos vamos a centrar en el control de motores DC.

Las salidas para los motores A y B nos darán la energía para mover los motores. Tened en cuenta la polaridad al conectarlos, para que cuando más tarde hagamos que se muevan adelante, funcionen como deberían. Si no fuera así, no tendríamos más que invertir las conexiones.

Los pines IN1 e IN2 nos sirven para controlar el sentido de giro del motor A, y los pines IN3 e IN4 el del motor B. Funcionan de forma que si IN1 está a HIGH e IN2 a LOW, el motor A gira en un sentido, y si está IN1 a LOW e IN2 a HIGH lo hace en el otro. Y lo mismo con los pines IN3 e IN4 y el motor B.

Para controlar la velocidad de giro de los motores tenemos que quitar los jumpers y usar los pines ENA y ENB. Los conectaremos a dos salidas PWM de Arduino de forma que le enviemos un valor entre 0 y 255 que controle la velocidad de giro. Si  tenemos los jumpers colocados, los motores girarán a la siempre a la misma velocidad.

El esquema de montaje que vamos a utilizar va a ser el siguiente, aunque podéis usar los pines que queráis siempre que respetemos que los que conectemos a ENA y ENB sean PWM.

esquema montaje l298n motores dc

 

PROGRAMACIÓN

 

Sabiendo todo esto, ya estamos en posición de empezar a programar. Vamos a hacer un programilla que mueva los motores en ambos sentidos, adelante y atrás, y  en sentidos contrarios el uno del otro, variando también la velocidad de movimiento.

Comenzamos asignando los pines que vamos a usar y declarándolos como salida:

// Motor A
int ENA = 10;
int IN1 = 9;
int IN2 = 8;

// Motor B
int ENB = 5;
int IN3 = 7;
int IN4 = 6;

void setup ()
{
 // Declaramos todos los pines como salidas
 pinMode (ENA, OUTPUT);
 pinMode (ENB, OUTPUT);
 pinMode (IN1, OUTPUT);
 pinMode (IN2, OUTPUT);
 pinMode (IN3, OUTPUT);
 pinMode (IN4, OUTPUT);
}

Y ahora vamos a crear las funciones para mover los motores. Primero para moverlos hacia delante a plena potencia:

void Adelante ()
{
 //Direccion motor A
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, LOW);
 analogWrite (ENA, 255); //Velocidad motor A
 //Direccion motor B
 digitalWrite (IN3, HIGH);
 digitalWrite (IN4, LOW);
 analogWrite (ENB, 255); //Velocidad motor B
}

Y ahora para moverse en el sentido contrario a la mitad de potencia:

void Atras ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, HIGH);
 analogWrite (ENA, 128); //Velocidad motor A
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, HIGH);
 analogWrite (ENB, 128); //Velocidad motor B
}

Y ahora vamos a girar cada motor en un sentido, cada uno con una velocidad además:

void Derecha ()
{
 //Direccion motor A
 digitalWrite (IN1, HIGH);
 digitalWrite (IN2, LOW);
 analogWrite (ENA, 200); //Velocidad motor A
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, HIGH);
 analogWrite (ENB, 100); //Velocidad motor A
}

void Izquierda ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, HIGH);
 analogWrite (ENA, 50); //Velocidad motor A
 //Direccion motor B
 digitalWrite (IN3, HIGH);
 digitalWrite (IN4, LOW);
 analogWrite (ENB, 150); //Velocidad motor A
}

Y una función más para pararlos:

void Parar ()
{
 //Direccion motor A
 digitalWrite (IN1, LOW);
 digitalWrite (IN2, LOW);
 analogWrite (ENA, 0); //Velocidad motor A
 //Direccion motor B
 digitalWrite (IN3, LOW);
 digitalWrite (IN4, LOW);
 analogWrite (ENB, 0); //Velocidad motor A
}

Vamos a  combinar estas funciones en el loop, haciendo que cada una se ejecute durante un periodo de tiempo:

void loop ()
{
 Adelante ();
 delay (5000);
 Atras ();
 delay (3000);
 Derecha ();
 delay (2000);
 Izquierda ();
 delay (2000);
 Parar ();
 delay (4000);
}

Podéis descargar el programa completo aquí: l298n_motores_dc. Si al ejecutarlo resulta que los motores se mueven en direcciones que no son las esperadas, podéis o bien intercambiar las conexiones del motor en los bornes del L298N o invertir el estado de los pines IN1 a IN4.

 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
    • Hemos presentado el módulo L298N que nos permite controlar motores de una cierta potencia de una manera muy sencilla.
    • Sabemos cómo utilizarlo y cómo conectarlo a nuestro Arduino.
    • Hemos aprendido a usar el L298N para controlar dos motores de corriente continua.
    • Hemos creado un programa con funciones para mover los motores en ambas direcciones y a diferentes velocidades.

(15) Comments

  • Hola, muchas gracias por este post, me ayudó muchísimo, pero me surgió una duda, puedo conseguir hasta 4 Amperes si sólo conecto un motor empleando las dos terminales de salida? Es que requiero alimentar un motor de 3.5 A
    Muchas gracias de antemano

    • Hola Francisco, el máximo que da son 2A.

  • Hola, queria saber si es posible que cada motor funcione independiente de otro, que pueda hacer que se activen y desactiven a diferente tiempo…

    • Hola Sylvia, sí se puede. De hecho e n el ejemplo lo hacen. ¿Qué es exactamente lo que quieres conseguir? Un saludo.

  • Hola, tengo el problema de que mi motor gira mas lento en una dirección; esta conectado a ENB, IN3, IN4. Descarto que sea el motor ya que lo he conectado a una fuente y al cambiar los cables gira igual.

  • Buenas ivan, he probado de todas las maneras y no se que puede fallar.
    He probado con el jumper quitado y puesto, alimentando asi externamente el L298N pero ni por esas..
    Si pudieras enviarme un circuito correcto de las conexiones (mi correo es: gorkagmv @gmail.com)
    Los pines PWM los tengo conectados igual que los que pones tu aqui…

    Gracias de antemano
    Un saludo

    • Hola Gorka, el circuito es el que está en la sesión, te mando un correo y mejor que me enseñes tú como lo tienes montado. Un saludo.

  • Buenas, aqui estoy de nuevo.
    Me surge un problema y es que por mucho que cambio la velocidad de 0 a 255 tanto del ENA o del ENB, no hay variacion de velocidad en mis DC.
    Los tengo bien conectados a los pines 5 y 6 respectivamente que son salidas PWM.

    ¿a que se puede deber?

    Gracias

    • Hola Gorka, recuerda que tienes que tener los jumpers quitados. Por otra parte si has realizado el programa de la sesión fíjate que los pines ENA y ENB están conectados a las salidas 10 y 5 del Arduino. Por lo demás debería funcionarte sin problemas porque es tal como dices. Si sigues teniendo problemas nos dices. Un saludo.

  • Buenas, llevo unos dias utilizando tu programacion pero me surge un problema.
    La rueda izquierda (para mi con conexiones IN1, IN2, ENA) me va mas rapido que la derecha y soy incapaz de corregirlo.
    Cambio el valor de la velocidad pero no me da resultado…
    ¿a que puede deberse?

    • Hola Gorka, este tipo de motores están bien para este tipo de proyectos porque son sencillos y baratos pero no son muy fiables,y puede ser que a veces uno gire más rápido que otro para el mismo valor (aunque no debería ser demasiado)

      Puedes solucionarlo o bien ralentizando el que va más rápido o acelerando el que va más lento. Para ello tienes que jugar con los valores que das a ENA y ENB en el programa. Un saludo.

  • Muy bueno, me ha ayudado bastente a entender la programación porque estaba usando una libreria y me estaba volviendo loco ya que ando un poco verde en esto de programar.
    Tengo una duda que te voy a proponer:
    “yo por ejemplo quiero utilizar un boton, y que al pulsarlo una vez vaya hacia delante X tiempo, y gire a la derecha por ejemplo. Pero si lo pulso 2 veces quiero que vaya X tiempo y gire a la izquierda”
    ¿como podría conseguir tal efecto?
    Gracias de antemano

    • Hola Gorka, yo haría una especie de cronómetro usando la función milis() de forma que si en el intervalo que consideres oportuno se pulsa una o dos veces el botón haga una cosa u otra. Si tienes problemas nos dices y te echamos una mano.

      Una vez tengas eso hacer que se mueva como quieras debería ser sencillo.

    • Francisco

    Tengo dias leyendo todos las publicaciones de arduino y vaya que me ha ayudado, ahora, tengo una peticion, donde consigo el modulo L298 que usan uds en fritzing, lo he buscado y solo encuentro el IC. Saludos desde mexico, y exito

    • Hola Francisco, yo tampoco lo encontré, así que el esquema está hecho con el paint. La imagen del controlador saqué directamente de google me parece. Un saludo.

Give a Reply

WordPress Anti-Spam by WP-SpamShield

¡Ofertón!

Robot Rover 4×4

Ahora por sólo

50€ + IVA

¡Lo quiero!