Skip to Content

Cómo controlar un motor paso a paso con el driver DRV8825 y Arduino

Cómo controlar un motor paso a paso con el driver DRV8825 y Arduino

Este artículo incluye todo lo que necesitas saber sobre el control de un motor paso a paso con el controlador de motor paso a paso DRV8825 y Arduino. He incluido un diagrama de cableado, un tutorial sobre cómo establecer el límite de corriente, y muchos códigos de ejemplo.

Aunque puede utilizar este controlador sin una biblioteca de Arduino, le recomiendo encarecidamente que también eche un vistazo al código 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:

Suministros

Componentes de hardware

DRV8825Controlador de motor paso a paso DRV8825× 1Amazon
Motor paso a pasoMotor paso a paso NEMA 17× 1Amazon
Arduino Uno Rev 3Arduino Uno Rev3× 1Amazon
Alimentación (8,2-45 V)× 1Amazon
Tablero de pruebas× 1Amazon
condensadorCondensador (100 µF)× 1Amazon
Cables de puente~ 10Amazon
Cable USB tipo A/B× 1Amazon

Me gusta utilizar este controlador en combinación con un escudo CNC o una placa de expansión. Dicho escudo ya incluye condensadores y ofrece una manera fácil de seleccionar la resolución de microdirección. Hace que el cableado sea mucho más fácil y es una gran opción si necesitas una solución más permanente que una protoboard.

Herramientas

Destornillador pequeñoAmazon
multímetroMultímetroAmazon
Cables de prueba tipo cocodrilo (opcional)Amazon

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.

Sobre el conductor

En el corazón del controlador DRV8825, encontrarás un chip fabricado por Texas Instruments: el CI controlador de motor paso a paso DRV8825. Este controlador de motor integrado hace que la interconexión con un microcontrolador sea súper fácil, ya que sólo necesita dos pines para controlar tanto la velocidad como la dirección del motor paso a paso.

El driver tiene una capacidad de salida máxima de 45 V y ± 2 A, lo que es ideal para accionar motores paso a paso de tamaño pequeño o mediano, como un motor paso a paso bipolar NEMA 17.

Si necesita controlar motores paso a paso más grandes como un NEMA 23, eche un vistazo al controlador de motor paso a paso TB6600. Este driver puede utilizarse con el mismo código que el A4988 y tiene una corriente nominal de 3,5 A.

El chip controlador DRV8825 lleva incorporadas varias funciones de seguridad como la protección contra sobrecorriente, cortocircuito, bloqueo por baja tensión y sobretemperatura. Puedes encontrar más especificaciones en la siguiente tabla.

Especificaciones del DRV8825

Tensión mínima de funcionamiento8.2 V
Tensión máxima de funcionamiento45 V
Corriente continua por fase1.5 A
Corriente máxima por fase2.2 A
Tensión lógica mínima2.5 V
Tensión lógica máxima5.25 V
Resolución de micropasoscompleto, 1/2, 1/4, 1/8, 1/16 y 1/32
¿Protección contra la tensión inversa?No
Dimensiones15,5 × 20,5 mm (0,6″ × 0,8″)
CosteComprobar el precio

Para más información, puede consultar la hoja de datos aquí.

Diferencias entre el DRV8825 y el A4988

El DRV8825 es bastante similar al A4988, pero hay algunas diferencias clave:

  • El DRV8825 ofrece un micropaso de 1/32, mientras que el A4988 sólo llega a 1/16 de paso. Un micropaso más alto permite un funcionamiento más suave y silencioso, pero no siempre es necesario.
  • El potenciómetro de límite de corriente está en un lugar diferente
  • La relación entre la tensión de referencia y el límite de corriente es diferente.
  • El DRV8825 requiere una duración mínima del impulso STEP de 1,9 µs, el A4988 requiere 1 µs como mínimo.
  •  El DRV8825 puede utilizarse con una fuente de alimentación de motor de mayor tensión (45 V frente a 35 V). Esto significa que es menos susceptible a los daños causados por los picos de tensión de la LC.
  •  El DRV8825 puede suministrar algo más de corriente que el A4988 sin necesidad de refrigeración adicional.

Tenga en cuenta que la disposición de los pines del DRV8825 es exactamente la misma que la del A4988, por lo que puede utilizarse como sustituto.

Controlador de motor paso a paso A4988 vs DRV8825
A4899 (izquierda) frente a DRV8825 (derecha)

Ajustes del micropaso

Los motores paso a paso suelen tener un tamaño de paso de 1,8° o 200 pasos por revolución, esto se refiere a pasos completos. Un driver de micropasos como el DRV8825 permite resoluciones más altas al permitir ubicaciones de pasos intermedios. Esto se consigue energizando las bobinas con niveles de corriente intermedios.

Por ejemplo, al accionar un motor en modo cuarto de paso, el motor de 200 pasos por revolución dará 800 micro pasos por revolución utilizando cuatro niveles de corriente diferentes.

DRV8825-pinout
DRV8825 Pinout

Los pines de selección de resolución (tamaño de paso) (M0, M1 y M2) permiten seleccionar una de las seis resoluciones de paso según la tabla siguiente.

M0M1M2Resolución de micropasos
BajoBajoBajoPaso completo
AltaBajoBajo1/2 paso
BajoAltaBajo1/4 de paso
AltaAltaBajo1/8 paso
BajoBajoAltaPaso 1/16
AltaBajoAlta1/32 paso
BajoAltaAlta1/32 paso
AltaAltaAlta1/32 paso

Las tres entradas tienen resistencias pull-down internas de 100 kΩ, por lo que si se dejan desconectados los tres pines de selección de micropasos se obtiene el modo de paso completo.

A menudo utilizo un CNC-shield o una placa de expansión en combinación con estos controladores. La placa de expansión tiene 3 interruptores DIP para ajustar M0 - M2 alto o bajo y en el CNC-shield puedes instalar puentes. Si usas el driver con una protoboard, puedes simplemente usar cables de puente para conectar los pines del selector a 5 V (es decir, hacerlos HIGH).

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

DRV8825 Arduino motor paso a paso diagrama de cableado pinout
Diagrama/esquema de cableado para el controlador de motor paso a paso DRV8825 con Arduino y motor paso a paso.

El diagrama/esquema de cableado anterior muestra cómo conectar el controlador DRV8825 a un motor paso a paso y al Arduino.

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

Conexiones DRV8825

DRV8825Conexión
VMOT8.2-45 V
GNDTierra del motor
SLP5 V
RST5 V
GNDTierra lógica
STPClavija 3
DIRClavija 2
A1, A2, B1, B2Motor paso a paso
  • La alimentación del motor se conecta a GND y VMOT (arriba a la derecha).
  • Las dos bobinas del motor paso a paso se conectan a A1, A2 y B1, B2 (ver más abajo).
  • El pin GND (abajo a la derecha) se conecta al pin de tierra del microcontrolador y VDD se conecta a 5V.
  • Los pines STP (paso) y DIR (dirección) se conectan al pin digital 3 y 2 respectivamente. Puedes elegir un pin digital diferente si quieres, pero estos son los que he utilizado para este tutorial y el código de ejemplo.
  • Es necesario conectar RST (reset) y SLP (sleep) a 5 V, de lo contrario, el controlador no se encenderá.
  • El pin EN (enable) puede dejarse desconectado, por defecto se pone a nivel bajo. Cuando este pin se pone en alto, el controlador se desactiva.
  • El DRV8825 también cuenta con una salida FAULT que se pone a nivel bajo cuando los FETs de puente H se desactivan como resultado de la protección contra sobrecorriente o el apagado térmico. Este pin se deja desconectado para este tutorial.

En el resto de este tutorial he dejado M0, M1 y M3 desconectados, por lo que el controlador funciona en modo de paso completo. Esto hace que la explicación del código sea un poco más fácil. Normalmente usaría el micro paso 1/16 o 1/32 y conectaría los pines apropiados a 5 V (ver tabla en la introducción).

Advertencia

La placa base del DRV8825 utiliza condensadores cerámicos de baja ESR, lo que la hace susceptible a los destructivos picos de tensión de la LC, especialmente cuando se utilizan cables de alimentación de más de unos pocos centímetros.

Para proteger el driver puedes conectar un condensador electrolítico entre VMOT y GND. Pololu sugiere un condensador de 47µF o más (yo usé un condensador de 100 µF). Me gustan estas cajas de surtido de Amazon, de esta manera siempre tengo a mano algunos condensadores del tamaño adecuado.

¿Cómo determinar el cableado correcto 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 las dos bobinas del motor. Los cables de una bobina se conectan a A1 y A2 y los de la otra a B1 y B2, 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.

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 conecte las dos bobinas a las clavijas mostradas en el diagrama de cableado anterior.

¿Cómo se ajusta el límite de corriente?

Antes de empezar a programar tu Arduino y empezar a usar el driver hay una cosa muy importante que tienes que hacer y que mucha gente olvida: ¡configurar el límite de corriente!

Este paso no es muy complicado, pero es absolutamente necesario para proteger su motor paso a paso y el conductor. Si no estableces un límite de corriente adecuado, tu motor puede consumir más corriente de la que él o tu driver pueden manejar, esto es probable que dañe a uno o a ambos.

Para establecer el límite de corriente, es necesario medir una tensión de referencia y ajustar el potenciómetro de a bordo en consecuencia. Necesitarás un pequeño destornillador, un multímetro para medir la tensión de referencia y cables de prueba tipo cocodrilo (opcionales pero muy prácticos).

DRV8825-current-limit-wiring-diagram-schematic
Diagrama de cableado del límite de corriente para el controlador DRV8825.

Para medir la tensión de referencia, el driver necesita ser alimentado. El DRV8825 sólo necesita alimentación a través de VMOT (8,2-45 V) y necesitas aplicar 5 V a RST y SLP, de lo contrario, el driver no se encenderá. Es mejor desconectar el motor paso a paso mientras haces esto.

Si ya has cableado el controlador como he mostrado antes, puedes dejar el Arduino conectado para alimentar los pines RST y SLP.

DRV8825Conexión
VMOT8.2-45 V
GNDTierra del motor
SLP5V
RST5V
GNDTierra lógica

Fórmula de límite de corriente

El siguiente paso es calcular el límite de corriente con la siguiente fórmula:

Límite de corriente = Vref × 2

Esto significa que para un límite de corriente de 1 A la Vref debe ser de 0,5 V.

Para seleccionar el límite de corriente adecuado, echa un vistazo a la hoja de datos de tu motor paso a paso. Si no puedes encontrar la corriente nominal de tu motor, te recomiendo que empieces con un límite de corriente de 1A. Siempre puedes aumentarlo más tarde si tu motor/conductor carece de pasos.

Información adicional: Cuando se utiliza el controlador en modo de paso completo, la corriente que pasa por cada bobina está limitada a aproximadamente el 70% del límite de corriente establecido. Esto significa que tendría que ajustar el límite de corriente un 40% más alto o 1,4 A en el modo de paso completo. Cuando se utiliza el modo de micropasos, se aplica la fórmula anterior.

Si tu motor hace mucho ruido, intenta bajar el límite de corriente. Lo mejor es ajustar el límite de corriente lo suficientemente alto para que el motor no pierda pasos.

Medición de Vref

Ahora tendrás que medir la tensión de referencia (Vref) entre los dos puntos marcados en la imagen inferior (GND y el potenciómetro) y ajustarla al valor que has calculado.

DRV8825-Puntos de sondeo de límite de corriente
Puntos de sonda Vref (GND y potenciómetro).

Recomiendo utilizar cables de prueba tipo cocodrilo sujetos al destornillador para ajustar el límite de corriente. Esto le permite ajustar el potenciómetro y medir la tensión de referencia al mismo tiempo.

Nota: Hay otra forma de medir el límite de corriente y es medir directamente el consumo de corriente del motor paso a paso. Personalmente encuentro el método anterior mucho más fácil.

Pololu menciona lo siguiente en su sitio web:

Nota: La corriente de la bobina puede ser muy diferente de la corriente de la fuente de alimentación, por lo que no debe utilizar la corriente medida en la fuente de alimentación para establecer el límite de corriente. El lugar apropiado para poner su medidor de corriente es en serie con una de las bobinas de su motor paso a paso.

Pololu

Límite actual FAQ

¿Necesito tener el motor paso a paso conectado o no?
No, no es necesario conectar el motor paso a paso al controlador cuando se ajusta el límite de corriente. Para estar seguro, desconecta el motor, a veces interfiere con la medición de la tensión Vref.

¿Tengo que girar el motor ejecutando el sketch de motor de Arduino?
No, véase la pregunta anterior.

Do I need to turn the potentiometer clock- or counter clockwise to raise Vref?
This depends on the manufacturer of the driver. If you have a genuine Polulu breakout board of the DRV8825 or A4988 you turn the potentiometer clockwise to raise Vref and counter clockwise to lower it.

Refrigeración del conductor

El CI del controlador DRV8825 tiene una corriente máxima de 2,5 A por bobina, pero sin un disipador de calor, sólo puede suministrar unos 1,5 A por bobina antes de empezar a sobrecalentarse.

El controlador suele venir con un pequeño disipador de calor con soporte adhesivo, que te recomiendo instalar de inmediato. También puedes comprar un montón de pequeños disipadores de calor en Amazon por muy poco dinero.

Código de ejemplo básico de Arduino para controlar un motor paso a paso

Ahora que has cableado el controlador y has establecido el límite de corriente, es el momento de conectar el Arduino al ordenador y cargar algo de código. Puedes subir el siguiente código de ejemplo a tu Arduino usando el IDE de Arduino. Para este ejemplo específico, no necesitas instalar ninguna librería.

Este esquema controla tanto la velocidad, el número de revoluciones y el sentido de giro del motor paso a paso.

Puede copiar el código haciendo clic en el botón de la esquina superior derecha del campo de código.

/* Example sketch to control a stepper motor with 
   A4988/DRV8825 stepper motor driver and 
   Arduino without a library. 
   More info: https://www.makerguides.com */

// Define stepper motor connections and steps per revolution:
#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 200

void setup() {
  // Declare pins as output:
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop() {
  // Set the spinning direction clockwise:
  digitalWrite(dirPin, HIGH);

  // Spin the stepper motor 1 revolution slowly:
  for (int i = 0; i < stepsPerRevolution; i++) {
    // These four lines result in 1 step:
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(2000);
  }

  delay(1000);

  // Set the spinning direction counterclockwise:
  digitalWrite(dirPin, LOW);

  // Spin the stepper motor 1 revolution quickly:
  for (int i = 0; i < stepsPerRevolution; i++) {
    // These four lines result in 1 step:
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }

  delay(1000);

  // Set the spinning direction clockwise:
  digitalWrite(dirPin, HIGH);

  // Spin the stepper motor 5 revolutions fast:
  for (int i = 0; i < 5 * stepsPerRevolution; i++) {
    // These four lines result in 1 step:
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(500);
  }

  delay(1000);

  // Set the spinning direction counterclockwise:
  digitalWrite(dirPin, LOW);

  //Spin the stepper motor 5 revolutions fast:
  for (int i = 0; i < 5 * stepsPerRevolution; i++) {
    // These four lines result in 1 step:
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(500);
  }

  delay(1000);
}

Cómo funciona el código:

El sketch comienza definiendo los pines de paso y dirección. Los conecté a los pines 3 y 2 de Arduino.

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 dirPinel compilador lo sustituirá por el valor 2 al compilar el programa.

También he definido un stepsPerRevolution constante. Como he configurado el controlador en modo de paso completo, lo he ajustado a 200 pasos por revolución. Cambie este valor si su configuración es diferente.

// Define stepper motor connections and steps per revolution:
#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 200

En el setup() del código, todos los pines de control del motor se declaran como OUTPUT digital con la función pinMode().

void setup() {
  // Declare pins as output:
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

En el loop() del código, dejamos que el motor gire una revolución lentamente en la dirección CW y una revolución rápidamente en la dirección CCW. Luego, dejamos que el motor gire 5 revoluciones en cada dirección con una velocidad alta. Entonces, ¿cómo se controla la velocidad, la dirección de giro y el número de revoluciones?

  // Set the spinning direction clockwise:
  digitalWrite(dirPin, HIGH);

  // Spin the stepper motor 1 revolution slowly:
  for(int i = 0; i < stepsPerRevolution; i++)
  {
    // These four lines result in 1 step:
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(2000);
  }

Controla la dirección de giro:

Para controlar el sentido de giro del motor paso a paso ponemos el pin DIR (dirección) en HIGH o LOW. Para ello utilizamos la función digitalWrite(). Dependiendo de cómo hayas conectado el motor paso a paso, al poner el pin DIR en alto el motor girará en sentido de la marcha o en sentido contrario.

Controla el número de pasos o revoluciones:

En este ejemplo, los bucles for controlan el número de pasos que dará el motor paso a paso. El código dentro del bucle for resulta en 1 paso del motor paso a paso. Como el código en el bucle se ejecuta 200 veces (stepsPerRevolution), esto resulta en 1 revolución. En los dos últimos bucles, el código dentro del bucle for se ejecuta 1000 veces, lo que resulta en 1000 pasos o 5 revoluciones.

Tenga en cuenta que puede cambiar el segundo término del bucle for por el número de pasos que desee. for(int i = 0; i < 100; i++) resultaría en 100 pasos, o media revolución.

Velocidad de control:

La velocidad del motor paso a paso viene determinada por la frecuencia de los pulsos que enviamos al pin STEP. Cuanto mayor sea la frecuencia, más rápido funcionará el motor. Puedes controlar la frecuencia de los pulsos cambiando delayMicroseconds() en el código. Cuanto más corto sea el retardo, mayor será la frecuencia y más rápido funcionará el motor.

Tutorial de la biblioteca 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 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 
   DRV8825 stepper motor driver, AccelStepper library 
   and Arduino: continuous rotation. 
   More info: https://www.makerguides.com */

#include "AccelStepper.h"

// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

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

void loop() {
  // Set the speed in steps per second:
  stepper.setSpeed(400);
  // Step the motor with a 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 "AccelStepper.h"

El siguiente paso es definir las conexiones del DRV8825 a Arduino y el tipo de interfaz del motor. El tipo de interfaz del motor debe establecerse en 1 cuando se utiliza un controlador de paso y direcció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 dirPinel compilador lo sustituirá por el valor 2 al compilar el programa.

// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

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, stepPin, dirPin);. 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, stepPin, dirPin);

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(500);
}

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 desea cambiar la dirección del motor, puede establecer una velocidad negativa: stepper.setSpeed(-400); gira el motor hacia el otro lado.

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

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

Para que el motor gire un número determinado de pasos prefiero utilizar un bucle while en combinación con stepper.currentPosition(). Puedes utilizar el siguiente código de ejemplo, para que el motor funcione de un lado a otro.

/*Example sketch to control a stepper motor 
  with DRV8825 stepper motor driver, AccelStepper library 
  and Arduino: number of steps or revolutions. 
  More info: https://www.makerguides.com */

#include "AccelStepper.h"

// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  // Set the maximum speed in 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í, en este caso, compruebo si la posición actual del motor paso a paso no es igual a 400 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 de destino diferentes.

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

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. En el siguiente ejemplo, el motor irá de un lado a otro con una velocidad de 200 pasos por segundo y una aceleración de 30 pasos por segundo por segundo.

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

#include "AccelStepper.h"

// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  // Set the maximum speed and acceleration:
  stepper.setMaxSpeed(200);
  stepper.setAcceleration(30);
}

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

  delay(1000);

  // Move back to zero:
  stepper.moveTo(0);
  stepper.runToPosition();

  delay(1000);
}

Explicación del código:

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

void setup() {
  // Set the maximum speed and acceleration:
  stepper.setMaxSpeed(200);
  stepper.setAcceleration(30);
}

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. La función stepper.moveTo() se utiliza para fijar la posición del objetivo. La función stepper.runToPostion() mueve el motor (con aceleración/deceleración) a la posición objetivo y se bloquea hasta que esté en la posición objetivo. Debido a que esta función es de bloqueo, no deberías usarla cuando necesites controlar otras cosas al mismo tiempo.

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

Conclusión

En este artículo te he mostrado cómo controlar un motor paso a paso con el driver de motor paso a paso DRV8825 y Arduino. 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 y hacer cosas!

Personalmente he utilizado este controlador mucho para un montón de impresoras 3D y otros proyectos relacionados con el CNC, pero me encantaría saber qué proyectos planean construir (o ya han construido) con este controlador. Si tienes alguna pregunta, sugerencia, o si crees que faltan cosas en este tutorial, por favor deja un comentario abajo.

Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.

Licencia Creative Commons

Morgan

Sunday 14th of April 2024

I uploaded Example 3. Acceleration and Deceleration.

I increased the target position to 2000. I tested it four times at one cycle clockwise and counterclockwise and each time it overran the return position and not consistently. Test # return steps overrun Test 1 42 steps Test 2 26 steps Test 3 29 steps Test 4 26 steps

I next tested it for three cycles CW & CCW and again it overran the return position. Each time it returned it overran the return 2000 steps by 29 steps 58 steps 93 steps

I am using an UNO, DRV8825, and a POLOLU stepper 1472. https://www.pololu.com/product/1472

Any ideas on why it keeps overrunning the return number of steps?

Thanks Morgan

Stefan Maetschke

Monday 15th of April 2024

Hi, I don't have that specific stepper motor and can't replicate. But I would check: 1) Voltage 2) Current 3) Different stepper motor (other or same type) 4) Different driver (other or same type) to isolate the problem a bit.

eddy

Monday 29th of January 2024

my current limit is set to 0.6V

1/How the 5V is made, is the arduino making this voltage ? I've made it with a zener diode 5V1 , and steer the pulses out of an NE555 ath 16Hz. And i use a nema 17 stepper motor. 2/ The motor is still toggeling 1step left and 1step right i believe ? What is going wrong ?

Please could you give technical info please ?

I am from Belgium, Europe.

Stefan Maetschke

Tuesday 30th of January 2024

1) Yes, you get the 5V from the 5V pin of the Arduino However, don't use the 5V for the motor voltage (VMOT)! Why are using an NE555 if you have an Arduino? 2) It is either insufficient power or incorrect control. Hard to tell with out seeing the circuit and code.

Knobbbenhoofd

Friday 10th of February 2023

ik ga een SCARA robot maken en hebeen stappenmotor nodig dus ook een stepperdriver.

Dominique Cozijnsen

Sunday 8th of January 2023

very helpfull! thank you

Dave

Martes 29 de noviembre de 2022

Hola Benne, Tengo una pregunta, estoy haciendo algunos proyectos finales y necesito tu ayuda ¿cómo puedo arrancar y parar un motor paso a paso con un número específico de pasos de una sola vez cuando el programa comienza o carga?