Skip to Content

Controlar un motor paso a paso con el controlador de motor L298N y Arduino

Controlar un motor paso a paso con el controlador de motor L298N y Arduino

En este artículo aprenderás a controlar un motor paso a paso con el driver de motor L298N. Esta placa de control se suele utilizar para controlar motores de corriente continua, pero también es una alternativa económica para controlar motores paso a paso. Puede controlar tanto la velocidad como el sentido de giro de la mayoría de los motores paso a paso como un NEMA 17.

He incluido un diagrama de cableado y muchos códigos de ejemplo. En el primer ejemplo veremos la librería Arduino Stepper.h. Recomiendo encarecidamente a echar un vistazo a los códigos de ejemplo para la biblioteca AccelStepper al final de este tutorial. Esta biblioteca es bastante fácil de usar y puede mejorar en gran medida el rendimiento de su hardware.

Después de cada ejemplo, desgloso y explico cómo funciona el código, por lo que no deberías tener problemas para modificarlo y adaptarlo a tus necesidades.

Si quiere saber más sobre otros controladores de motores paso a paso, los artículos siguientes pueden resultarle útiles:

El Arduino Motor Shield Rev3 también utiliza un controlador L298.

Suministros

Componentes de hardware

l298n-motor-driver-controller-boardPlaca de controladores de motor L298N× 1Amazon
Motor paso a pasoMotor paso a paso NEMA 17× 1Amazon
Arduino Uno Rev 3Arduino Uno Rev3× 1Amazon
Fuente de alimentación de 12 V× 1Amazon
Cables de puente× 10Amazon
Cable USB tipo A/B× 1Amazon

Software

Arduino IDEArduino IDE

Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. As an Amazon Associate we earn from qualifying purchases.

Información sobre el controlador de motor L298N

La placa de controladores de motor L298N está construida en torno al controlador de doble puente completo L298, fabricado por STMicroelectronics. Con este controlador de motor puede controlar motores de corriente continua, motores paso a paso, relés y solenoides. Viene con dos canales separados, llamados A y B, que puede utilizar para conducir 2 motores de corriente continua, o 1 motor paso a paso cuando se combina.

El L298N suele estar montado en una placa breakout (roja), lo que facilita mucho el cableado. La placa breakout también incluye un regulador de potencia 78M05 de 5 V.

¿Por qué se calienta mi motor paso a paso?

Una cosa que es muy importante recordar es que el L298 no tiene una manera fácil de establecer un límite de corriente a diferencia de otros controladores de motor paso a paso como el A4988(tutorial). Esto significa que el consumo de corriente depende de la relación entre la inductancia y la resistencia (L/R) del motor paso a paso que se conecta a él. Si el motor consume demasiada corriente, puedes dañar el driver y el motor se calentará.

Lo que esto significa para usted, es que usted necesita tener cuidado al seleccionar el motor paso a paso y la fuente de alimentación para utilizar con este controlador de motor. No todos los motores paso a paso funcionarán. El voltaje de funcionamiento del L298N está entre 4,8 y 46 voltios (máximo 35 V cuando se monta en la placa de circuito impreso). Dado que el controlador puede suministrar un máximo de 2 amperios por canal, es necesario encontrar un motor paso a paso que se puede utilizar en este rango de tensión y no excede la capacidad de corriente máxima.

Consulta la hoja de datos de tu motor paso a paso y busca el consumo de tensión/corriente del motor. Si no puedes encontrar la hoja de datos, puedes medir la resistencia de uno de los bobinados y utilizar la siguiente fórmula para obtener una estimación del consumo de corriente:

I = U ÷ R o Consumo de corriente (A) = Tensión de alimentación (V) ÷ Resistencia del bobinado (Ω)

Yo trataría de encontrar un motor que consuma menos de 2 A a la tensión que quieres utilizar.

El motor que utilicé para este tutorial consume alrededor de 1 A a 5 V. También encontré este motor paso a paso de Adafruit que funciona muy bien a 12V y sólo consume 350 mA.

Si el motor que quieres accionar no funciona con el driver de motor L298N, lo mejor es utilizar un driver chopper en su lugar. Escribí tutoriales para los drivers A4988 y DRV8825 que funcionan muy bien con muchos motores paso a paso.

Especificaciones del controlador de motor L298N

Tensión de funcionamiento5 - 35 V
Tensión lógica4.5 - 7 V
Corriente máxima2 A por canal o 4 A como máximo
Controlador del motorL298N, acciona 2 motores de corriente continua o 1 motor paso a paso
Regulador de tensión78M05
Dimensiones del módulo43 x 43 x 28 mm
Dimensiones de los agujeros3,2 mm, separación de 37 mm
CosteComprobar el precio

Para más información, puede consultar la hoja de datos que aparece a continuación:

Pinout del L298N

El L298 viene en varios paquetes diferentes, el pinout para el L298N (Multiwatt15) se da a continuación:

Pines del controlador del motor L298N
Pinout del L298N
Pin no.NombreFunción
1, 15Sentido A, Sentido BLa resistencia de detección debe conectarse entre este pin y GND (no se utiliza en la placa de circuito impreso).
2, 3Salida 1, Salida 2Salidas del Puente A; la corriente que fluye a través de la carga conectada entre estos dos pines es monitoreada en el pin 1.
4VsTensión de alimentación de las etapas de salida de potencia
5, 7Entrada 1, Entrada 2Entradas compatibles TTL del puente A
6, 11Habilitar A, Habilitar BEntrada de habilitación compatible TTL: el estado LOW desactiva el puente A (enable A) y/o el puente B (enable B).
8GNDTierra
9VSSTensión de alimentación de los bloques lógicos.
10, 12Entrada 3, Entrada 4Entradas compatibles TTL del puente B.
13, 14Salida 3, Salida 4Salidas del puente B; la corriente que fluye a través de la carga conectada entre estos dos pines se monitoriza en el pin 15.

Cableado - Conexión del L298N al motor paso a paso y al Arduino

El diagrama/esquema de cableado que aparece a continuación muestra cómo conectar un motor paso a paso, una fuente de alimentación y el Arduino a la placa de circuito impreso L298N.

l298n-motor-driver-with-stepper-motor-and-arduino-wiring-diagram-schematic-pinout
Driver de motor L298N con motor paso a paso y diagrama de cableado de Arduino.

Las conexiones también se indican en la tabla siguiente:

Conexiones L298N

L298NConexión
+12VAlimentación de 5 - 35 V
GNDFuente de alimentación y tierra del Arduino
Puente de 12 VQuitar si la potencia del motor es superior a 12 V.
5V+ (opcional)5 V Arduino si se quita el puente de 12 V
IN1Pin 8 Arduino
IN2Pin 9 Arduino
IN3Pin 10 Arduino
IN4Pin 11 Arduino
Puente ENA y ENBDejar instalado
OUT1 + OUT2Bobina del motor paso a paso A
OUT3 + OUT4Bobina del motor paso a paso B

Nota importante: retire el puente de +12V si utiliza una fuente de alimentación superior a 12 V.

Cuando el puente de +12V está conectado, el regulador de voltaje de la placa está habilitado y creará el voltaje lógico de 5 V. Cuando se quita el puente, es necesario proporcionar a la placa 5 V desde el Arduino.

También es necesario mantener los puentes ENA y ENB en su lugar para que el motor esté siempre habilitado.

¿Cómo determinar el cableado del motor paso a paso?

Si no puedes encontrar la hoja de datos de tu motor paso a paso, puede ser difícil averiguar cómo cablear tu motor correctamente. Yo uso el siguiente truco para determinar cómo conectar motores paso a paso bipolares de 4 hilos:

Lo único que hay que identificar son los dos pares de cables que se conectan a cada una de las dos bobinas. Una bobina se conecta a OUT1 y OUT2 y la otra a OUT3 y OUT4, la polaridad no importa.

Para encontrar los dos cables de una bobina, haga lo siguiente con el motor desconectado:

  1. Intenta hacer girar el eje del motor paso a paso con la mano y fíjate en lo difícil que es girar.
  2. Ahora escoge un par de cables al azar del motor y toca los extremos desnudos entre sí.
  3. A continuación, intente hacer girar de nuevo el eje del motor paso a paso.
  4. Si siente mucha resistencia, ha encontrado un par de cables de la misma bobina. Si puede girar el eje libremente, pruebe con otro par de cables.

Ahora conecta las dos bobinas a las clavijas indicadas en el diagrama de cableado anterior.

Código de ejemplo de la biblioteca Stepper.h para el controlador L298N con motor paso a paso y Arduino

Puedes cargar el siguiente código de ejemplo en tu Arduino utilizando el IDE de Arduino.

Este ejemplo utiliza la biblioteca Stepper.h, que debería venir preinstalada con el IDE de Arduino. Puedes encontrarla yendo a Sketch > Include Library > Stepper.

Este sketch hace girar el motor paso a paso 1 revolución en una dirección, hace una pausa y luego gira 1 revolución en la otra dirección.

/* Example sketch to control a stepper motor with 
  L298N motor driver, Arduino UNO and Stepper.h library. 
  More info: https://www.makerguides.com */

// Include the Stepper library:
#include "Stepper.h"

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Initialize the stepper library on pins 8 through 11:
Stepper myStepper = Stepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // Set the motor speed (RPMs):
  myStepper.setSpeed(100);
}

void loop() {
  // Step one revolution in one direction:
  myStepper.step(200);

  delay(2000);

  // Step on revolution in the other direction:
  myStepper.step(-200);

  delay(2000);
}

Cómo funciona el código:

El sketch comienza incluyendo la librería Arduino Stepper.h. Puedes encontrar más información sobre esta librería en la web de Arduino.

// Include the Stepper library:
#include "Stepper.h"

A continuación tenemos que definir cuántos pasos necesita el motor para girar 1 revolución. n este ejemplo vamos a utilizar el motor en modo de paso completo. Esto significa que tarda 200 pasos en girar 360 grados. Puedes cambiar este valor si quieres si estás usando un tipo diferente de motor paso a paso o una configuración diferente.

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

Después de esto, es necesario crear una nueva instancia de la clase Stepper, que representa un motor paso a paso particular conectado al Arduino. Para ello utilizamos la función Stepper(steps, pin1, pin2, pin3, pin4) donde pasos es el número de pasos por revolución y pin1 a pin4 son los pines utilizados para accionar el motor paso a paso. En nuestro caso son los pines 8, 9, 10 y 11.

// Initialize the stepper library on pins 8 through 11:
Stepper myStepper = Stepper(stepsPerRevolution, 8, 9, 10, 11);

En este caso he llamado al motor paso a paso 'myStepper', pero también puedes utilizar otros nombres, como 'z_motor' o 'liftmotor', etc. Stepper liftmotor = Stepper(stepsPerRevolution, 8, 9, 10, 11);. El nombre 'myStepper' se utilizará para establecer la velocidad y el número de pasos para este motor en particular. Ten en cuenta que puedes crear múltiples objetos stepper con diferentes nombres si quieres controlar más de un motor.

En el setup() definimos la velocidad del motor. La velocidad del motor se puede definir en RPM con la función setSpeed(rpm). Lo puse a 100, por lo que deberíamos ver alrededor de 1,6 revoluciones por segundo.

  // Set the motor speed (RPMs):
  myStepper.setSpeed(100);

En la sección de código del bucle, simplemente llamamos al step(steps) que hace girar el motor un número específico de pasos a una velocidad determinada por el setSpeed(rpm) función. Pasando un número negativo a esta función se invierte el sentido de giro del motor.

void loop() {
  // Step one revolution in one direction:
  myStepper.step(200);

  delay(2000);

  // Step on revolution in the other direction:
  myStepper.step(-200);

  delay(2000);
}

Ten en cuenta que la función step(steps) es de bloqueo, esto significa que esperará hasta que el motor haya terminado de moverse para pasar el control a la siguiente línea de tu sketch.

Instalación de la biblioteca AccelStepper

En los siguientes tres ejemplos te mostraré cómo puedes controlar tanto la velocidad como la dirección y el número de pasos que debe dar el motor paso a paso. En este ejemplo utilizaré la librería AccelStepper.

La librería AccelStepper escrita por Mike McCauley es una librería impresionante para usar en tu proyecto. Una de las ventajas es que soporta la aceleración y la desaceleración, pero tiene un montón de otras funciones agradables también.

Puede descargar la última versión de esta biblioteca aquí o hacer clic en el botón de abajo.

Puedes instalar la librería yendo a Sketch > Incluir librería > Añadir librería .ZIP ... en el IDE de Arduino.

Otra opción es ir a Herramientas > Administrar Bibliotecas... o teclear Ctrl + Shift + I en Windows. El Administrador de Bibliotecas se abrirá y actualizará la lista de bibliotecas instaladas.

Instalar una librería Arduino paso 1 abrir Library Manager
Library Manager

Puedes buscar 'accelstepper' y buscar la biblioteca de Mike McCauley. Seleccione la última versión y luego haga clic en Instalar.

Instalación de una biblioteca Arduino paso 2 AccelStepper
Installing AccelStepper Library

1. Código de ejemplo del AccelStepper de rotación continua

El siguiente esquema se puede utilizar para hacer funcionar uno o más motores paso a paso de forma continua a una velocidad constante. (No se utiliza ninguna aceleración o desaceleración).

/* Example sketch to control a stepper motor with L298N motor driver, Arduino UNO and AccelStepper.h library. Contiuous rotation. More info: https://www.makerguides.com */

// Include the AccelStepper library:
#include "AccelStepper.h"

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

void setup() {
  // Set the maximum speed in steps per second:
  stepper.setMaxSpeed(1000);
}

void loop() {
  // Set the speed of the motor in steps per second:
  stepper.setSpeed(500);
  // Step the motor with constant speed as set by setSpeed():
  stepper.runSpeed();
}

Cómo funciona el código:

El primer paso es incluir la biblioteca con #include "AccelStepper.h“.

// Include the AccelStepper library:
#include "AccelStepper.h"

El siguiente paso es definir el tipo de interfaz del motor. El tipo de interfaz del motor debe establecerse en 4 cuando se utiliza un motor paso a paso de 4 hilos en modo de paso completo (200 pasos/revolución). Puedes encontrar los otros tipos de interfaz aquí.

La declaración #define se utiliza para dar un nombre a un valor constante. El compilador sustituirá cualquier referencia a esta constante por el valor definido cuando se compile el programa. Por lo tanto, en todos los casos en los que se menciona motorInterfaceTypeel compilador lo sustituirá por el valor 4 cuando se compile el programa.

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

A continuación, hay que crear una nueva instancia de la clase AccelStepper con el tipo de interfaz del motor y las conexiones adecuadas.

En este caso he llamado al motor paso a paso 'stepper', pero también puedes utilizar otros nombres, como 'z_motor' o 'liftmotor', etc. AccelStepper liftmotor = AccelStepper(motorInterfaceType, 8, 9, 10, 11);. Como has visto en el ejemplo anterior, el nombre que le des al motor paso a paso se utilizará más tarde para establecer la velocidad, la posición y la aceleración de ese motor en particular. Puedes crear múltiples instancias de la clase AccelStepper con diferentes nombres y pines. Esto le permite controlar fácilmente 2 o más motores paso a paso al mismo tiempo.

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

En el setup() del código definimos la velocidad máxima en pasos/segundo. Las velocidades de más de 1000 pasos por segundo pueden ser poco fiables, así que establezco esto como el máximo. Observa que especifico el nombre del motor paso a paso ('stepper'), para el que quiero definir la velocidad máxima. Si tienes varios motores paso a paso conectados, puedes especificar una velocidad diferente para cada motor:

void setup() {
  // Set the maximum speed in steps per second:
  stepper.setMaxSpeed(1000);
  stepper2.setMaxSpeed(300);
}

En el loop() primero establecemos la velocidad a la que queremos que funcione el motor. Para ello, utilizamos la función setSpeed(). (también puede colocar esto en la sección de configuración del código).

stepper.runSpeed() sondea el motor y cuando se debe dar un paso ejecuta 1 paso. Esto depende de la velocidad ajustada y del tiempo transcurrido desde el último paso. Si quieres cambiar la dirección del motor, puedes establecer una velocidad negativa: stepper.setSpeed(-400); gira el motor hacia el otro lado.

void loop() {
  // Set the speed of the motor in steps per second:
  stepper.setSpeed(500);
  // Step the motor with constant speed as set by setSpeed():
  stepper.runSpeed();
}

2. Ejemplo de código para controlar el número de pasos o revoluciones

Con el siguiente sketch puedes controlar tanto la velocidad como la dirección y el número de pasos/revoluciones.

En este caso, el motor paso a paso gira 2 revoluciones en el sentido de las agujas del reloj con 200 pasos/seg, luego gira 1 revolución en sentido contrario a las agujas del reloj con 600 pasos/seg, y por último gira 3 revoluciones en el sentido de las agujas del reloj con 400 pasos/seg.

/* Example sketch to control a stepper motor with 
  L298N motor driver, Arduino UNO and AccelStepper.h library.  
  More info: https://www.makerguides.com */

// Include the AccelStepper library:
#include "AccelStepper.h"

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

void setup() {
  // Set the maximum steps per second:
  stepper.setMaxSpeed(1000);
}

void loop() {
  // Set the current position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor forward at 200 steps/second until the motor reaches 400 steps (2 revolutions):
  while (stepper.currentPosition() != 400)  {
    stepper.setSpeed(200);
    stepper.runSpeed();
  }

  delay(1000);

  // Reset the position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor backwards at 600 steps/second until the motor reaches -200 steps (1 revolution):
  while (stepper.currentPosition() != -200)   {
    stepper.setSpeed(-600);
    stepper.runSpeed();
  }

  delay(1000);

  // Reset the position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (stepper.currentPosition() != 600)  {
    stepper.setSpeed(400);
    stepper.runSpeed();
  }

  delay(3000);
}

Explicación del código:

La primera parte del código hasta la sección loop() es exactamente la misma que en el ejemplo anterior.

En el bucle hago uso de un bucle while en combinación con el currentPosition() función. En primer lugar, puse a cero la posición actual del motor paso a paso con stepper.setCurrentPosition(0).

  // Set the current position to 0:
  stepper.setCurrentPosition(0);

A continuación utilizamos el bucle while. Un bucle while hará un bucle continuo, e infinito, hasta que la expresión dentro del paréntesis, () se vuelva falsa. Así que en este caso compruebo si la posición actual del motor paso a paso no es igual a 200 pasos (!= significa: no es igual a). Mientras no sea así, hacemos funcionar el motor paso a paso a una velocidad constante como la establecida por setSpeed().

  // Run the motor forward at 200 steps/second until the motor reaches 400 steps (2 revolutions):
  while (stepper.currentPosition() != 400)  {
    stepper.setSpeed(200);
    stepper.runSpeed();
  }

En el resto del bucle hacemos exactamente lo mismo, sólo que con una velocidad y una posición del objetivo diferentes.

3. Código de ejemplo de aceleración y desaceleración

En este ejemplo veremos una de las principales razones para utilizar la biblioteca AccelStepper.

Con el siguiente sketch puedes añadir aceleración y desaceleración a los movimientos del motor paso a paso sin ninguna codificación complicada. La primera sección de este sketch es la misma que en el ejemplo 1, pero la configuración y el bucle son diferentes.

El motor funcionará a cinco revoluciones de ida y vuelta con una velocidad de 200 pasos por segundo y una aceleración de 50 pasos/segundo2.

/* Example sketch to control a stepper motor with 
   L298N motor driver, Arduino UNO and AccelStepper.h library. 
   Acceleration and deceleration. 
   More info: https://www.makerguides.com */

// Include the AccelStepper library:
#include "AccelStepper.h"

// Define the AccelStepper interface type:
#define MotorInterfaceType 4

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, 8, 9, 10, 11);

void setup() {
  // Set the maximum steps per second:
  stepper.setMaxSpeed(200);

  // Set the maximum acceleration in steps per second^2:
  stepper.setAcceleration(50);
}

void loop() {
  // Set target position:
  stepper.moveTo(1000);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

  delay(1000);

  // Move back to original position:
  stepper.moveTo(0);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

  delay(1000);
}

Cómo funciona el código:

En el setup()Además de la velocidad máxima, necesitamos definir la aceleración/desaceleración. Para ello, utilizamos la función setAcceleration().

  // Set the maximum steps per second:
  stepper.setMaxSpeed(200);

  // Set the maximum acceleration in steps per second^2:
  stepper.setAcceleration(50);

En la sección de bucle del código, utilicé una forma diferente de dejar que el motor gire un número predefinido de pasos. Primero establecí la posición objetivo con la función moveTo(). A continuación, simplemente utilizamos la función runToPosition() para que el motor funcione hasta la posición objetivo con la velocidad y la aceleración establecidas. El motor se desacelerará antes de alcanzar la posición objetivo.

  // Set target position:
  stepper.moveTo(1000);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

Por último, volvemos a poner la nueva posición de destino en el 0, de forma que volvemos al origen.

Conclusión

En este artículo te he mostrado cómo puedes controlar un motor paso a paso con un driver de motor L298N. Hemos visto 4 ejemplos, utilizando las bibliotecas Stepper y AccelStepper. Espero que lo hayas encontrado útil e informativo. Si lo has hecho, ¡compártelo con un amigo al que también le guste la electrónica!

Me encantaría saber qué proyectos planeas construir (o ya has construido) con el controlador de motor L298N. Si tienes alguna pregunta, sugerencia, o si crees que faltan cosas en este tutorial, por favor deja un comentario abajo.

Anuoluwa Odufote

Friday 31st of March 2023

You didn't show raspberry pi code only to control L289N. it was mostly Arduino. please kindly updates or reach out

Bryan

Saturday 7th of January 2023

Extremely good information, read the article twice to get the most out of the info. Can't wait to hook it all up and try it out. Again Thanks!

BLANC Mathéo

Martes 5 de abril de 2022

Hola, tengo que crear un programa para controlar un motor paso a paso en ambos sentidos de giro, solo que no encuentro la conexión adecuada. Tienes algo más detallado porque soy estudiante y estoy perdido... Gracias.

Norm Peacey

Martes 1 de diciembre de 2020

Estoy haciendo persianas enrollables con control remoto y he creado una mezcla de los bocetos Accel Acceleration y Multistepper. Esto abre y cierra las persianas con éxito. Sin embargo, quiero liberar las bobinas del stepper al final de cada función para permitir que las persianas se ajusten manualmente si es necesario. He buscado sin éxito este código. ¿Puede ofrecer una sugerencia? Tengo previsto manejar el arduino con un mando a distancia por infrarrojos.

Benne de Bakker

Martes 1 de diciembre de 2020

Hola Norm,

¡Buen proyecto! Creo que deberías poder utilizar las funciones disableOutputs() y enableOutputs() de la biblioteca AccelStepper. Puedes encontrar más información sobre estas funciones aquí: https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#a3591e29a236e2935afd7f64ff6c22006

Todavía no he utilizado estas funciones, pero creo que puedes simplemente llamar a myStepper.disableOutputs() al final de tus funciones y a myStepper.enableOutputs() al principio.

Saludos cordiales,

Benne

Michel

Domingo 19 de abril de 2020

Muchas gracias por este valioso curso. Esto me ayuda a utilizar el módulo L298 y un motor de cabeza de dvd