Material requerido
|
|
|
|
|
|
|
- Tensión de funcionamiento 6-48V.
- Intensidad por canal 2A.
- Salida de 5V.
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.
En la parte inferior se encuentran los pines de control del módulo, marcados como IN1, IN2, IN3 e IN4.
Conexión de alimentación
Este módulo se puede alimentar de 2 maneras gracias al regulador integrado LM7805.
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.
El esquema.
Como demostración, vamos a controlar un motor 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ónsetSpeed()
. (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); }
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.