Motor paso a paso con el L298N y AccelStepper.

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.
 
Pero en lugar de utilizar la librería habitual, utilizaremos 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.

 l294n

Material requerido

cropped-arduino-1.jpg
  • Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.
l294n
  • Un H bridge integrado L298N
pasoapaso
  • Motor paso a paso.
Img_3_6-300x185
  • Algunos cables de Protoboard.
 
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.

MUY IMPORTANTE: 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 paso a paso.

l298n-motores-paso-a-paso

Instalación de la biblioteca AccelStepper

Opción 1:

Puedes instalar la librería, si tenemos el fichero .zip, haciendo click en Sketch > Incluir librería > Añadir librería .ZIP … en el IDE de Arduino.

Opción 2:

Otra opción es ir a Herramientas > Administrar Bibliotecas. El Administrador de Bibliotecas se abrirá y actualizará la lista de bibliotecas instaladas. Puedes buscar ‘accelstepper’ y buscar la biblioteca de Mike McCauley. Seleccione la última versión y luego haga clic en Instalar.

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“.
  • 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);. 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();
}

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);

// el motor paso a paso gira 2 revoluciones en el sentido de las agujas del
// reloj con 200 pasos/seg while (stepper.currentPosition() != 400) { stepper.setSpeed(200); stepper.runSpeed(); } delay(1000); // Reset the position to 0: stepper.setCurrentPosition(0); // Gira 1 revolución en sentido contrario a las agujas del reloj con 600
// pasos/seg while (stepper.currentPosition() != -200) { stepper.setSpeed(-600); stepper.runSpeed(); } delay(1000); // Reset the position to 0: stepper.setCurrentPosition(0); // gira 3 revoluciones en el sentido de las agujas del reloj con 400 pasos/seg. 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).
  • A continuación utilizamos el bucle while. Un bucle while hará un bucle continuo 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 400 pasos. Mientras no sea así, hacemos funcionar el motor paso a paso a una velocidad constante como la establecida por setSpeed().
  • En el resto del bucle hacemos exactamente lo mismo, sólo que con una velocidad y una posición del objetivo diferentes.
// 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();
  }

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/segundo.

/* 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, utilizaremos una forma diferente de dejar que el motor gire un número predefinido de pasos. Primero establecemos 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.

 

Deja un comentario