Articles

Cómo controlar un motor paso a paso con controlador A4988 y Arduino

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

Aunque puede usar este controlador sin una biblioteca Arduino, le recomiendo 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, analizo y explico cómo funciona el código, por lo que no debería tener problemas para modificarlo para adaptarse a sus necesidades.

Si desea obtener más información sobre otros controladores de motor paso a paso, los siguientes artículos pueden ser útiles:

  • How to control a stepper motor with DRV8825 driver and Arduino
  • 28BYJ-48 Stepper Motor with ULN2003 Driver and Arduino Tutorial
  • How to control a Stepper Motor with Arduino Motor Shield Rev3
  • TB6600 Stepper Motor Driver with Arduino Tutorial

Supplies

Hardware components

A4988 stepper motor driver × 1 Amazon
AliExpress
NEMA 17 stepper motor × 1 Amazon
Arduino Uno Rev3 × 1 Amazon
Power supply (8-35 V) × 1 Amazon
AliExpress
Breadboard × 1 Amazon
Capacitor (100 µF) × 1 Amazon
Jumper wires ~ 10 Amazon
AliExpress
USB cable type A/B × 1 Amazon

me gusta usar este controlador en combinación con un CNC-escudo o placa de expansión. Este blindaje ya incluye condensadores y ofrece una forma fácil de seleccionar la resolución de microstepping. Esto hace que el cableado sea mucho más fácil y es una gran opción si usted necesita una solución más permanente que una protoboard.

Tools

Small screwdriver Amazon
Multimeter Amazon
Alligator test leads (optional) Amazon

Software

Arduino IDE

Makerguides.com es participante en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen tarifas de publicidad mediante publicidad y enlaces a productos en Amazon.com.

Sobre el controlador

En el corazón del controlador A4988 encontrará un chip fabricado por Allegro MicroSystems: el controlador de Microstepping DMOS A4988 con Traductor y Protección contra Sobrecorriente. Este controlador de motor integrado hace que la interfaz con un microcontrolador sea súper fácil, ya que solo necesita dos pines para controlar la velocidad y la dirección del motor paso a paso.

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

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

  • Controlador de motor paso a paso TB6600 con tutorial Arduino

El chip de controlador A4988 tiene varias funciones de seguridad incorporadas, como sobrecorriente, cortocircuito, bloqueo de bajo voltaje y protección contra sobrecalentamiento. Puede encontrar más especificaciones en la tabla a continuación.

A4988 Specifications

Minimum operating voltage 8 V
Maximum operating voltage 35 V
Continuous current per phase 1 A
Maximum current per phase 2 A
Minimum logic voltage 3 V
Maximum logic voltage 5.5 V
Microstep resolution full, 1/2, 1/4, 1/8 and 1/16
Reverse voltage protection? No
Dimensiones 15.5 × 20,5 mm (0.6″ x 0.8″)
Costos consultar precio

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

Diferencias entre el A4988 y el DRV8825

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

  • El DRV8825 ofrece microstepping de 1/32, mientras que el A4988 solo se reduce a 1/16 pasos. Más de microstepping resultados en un funcionamiento suave y silencioso, pero no siempre es necesario.
  • El potenciómetro de límite de corriente está en una ubicación diferente
  • La relación entre el voltaje de referencia y el límite de corriente es diferente.
  • El DRV8825 requiere una duración de pulso de paso mínima de 1,9 µs; el A4988 requiere un mínimo de 1µs.
  • El DRV8825 se puede utilizar con una fuente de alimentación de motor de mayor voltaje (45 V vs 35 V). Esto significa que es menos susceptible a daños por picos de voltaje LC.
  • El DRV8825 puede suministrar un poco más de corriente que el A4988 sin refrigeración adicional.

Tenga en cuenta que el pinout del DRV8825 es exactamente el mismo que para el A4988, por lo que se puede usar como reemplazo inmediato.

A4899 (izquierda) vs DRV8825 (derecha)

Micropasos configuración

los motores paso a Paso tienen normalmente un tamaño de paso de 1,8° o 200 pasos por revolución, esto se refiere a los pasos completos. Un controlador de microstepping como el A4988 permite resoluciones más altas al permitir ubicaciones de pasos intermedios. Esto se logra energizando las bobinas con niveles de corriente intermedios.

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

Pinout A4988

Los pines selectores de resolución (tamaño de paso) (MS1, MS2 y MS3) le permiten seleccione una de las cinco resoluciones de pasos de acuerdo con la tabla a continuación.

MS1 MS2 MS3 Microstep resolution
Low Low Low Full step
High Low Low 1/2 step
Low High Low 1/4 step
High High Low 1/8 step
High High High 1/16 step

Las tres entradas tienen resistencias pull-down internas de 100 kΩ, por lo que dejar desconectados los tres pines de selección de microstep da como resultado el modo de paso completo.

A menudo uso un escudo CNC o una placa de expansión en combinación con estos controladores. La placa de expansión tiene 3 interruptores dip para configurar MS1-MS3 alto o bajo y en el blindaje CNC puede instalar puentes. Si está utilizando el controlador con una tabla de cortar el pan, solo puede usar cables de puente para conectar los pines selectores a 5 V (es decir, hacerlos ALTOS).

Cableado: Conexión de A4988 a Arduino y motor paso a paso

Diagrama de cableado/esquema para el controlador de motor paso a paso A4988 con Arduino y motor paso a paso.

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

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

A4988 Connections

A4988 Connection
VMOT 8-35V
GND Motor ground
SLP RESET
RST SLP
VDD 5V
GND Logic ground
STP Pin 3
DIR Pin 2
1A, 1B, 2A, 2B Stepper motor
  • La fuente de alimentación del motor está conectada a GND y VMOT (arriba a la derecha).
  • Las dos bobinas del motor paso a paso están conectadas a 1A, 1B y 2A, 2B (véase más abajo).
  • El pin GND (inferior derecho) está conectado al pin de tierra del microcontrolador y el VDD está conectado a 5V.
  • El pin STP (paso) y el pin DIR (dirección) están conectados al pin digital 3 y 2 respectivamente. Puede elegir un pin digital diferente si lo desea, pero estos son los que usé para este tutorial y el código de ejemplo.
  • El pin SLP es una entrada baja activa. Es decir, tirar de este pasador bajo pone al conductor en modo de suspensión, minimizando el consumo de energía. RST también es una entrada baja activa. Cuando se tira hacia abajo, se ignoran todas las entradas de PASO hasta que se tira hacia arriba. Si no está utilizando el pin, puede conectarlo al pin SLP/SLEEP adyacente para elevarlo y habilitar el controlador.
  • El pin EN (habilitar) se puede dejar desconectado, se baja de forma predeterminada. Cuando este pin está configurado en alto, el controlador está desactivado.

En el resto de este tutorial he dejado MS1, MS2 y MS3 desconectados, por lo que el controlador funciona en modo de paso completo. Esto facilita un poco la explicación del código. Normalmente utilizaría microstepping de 1/8 o 1/16 y conectaría los pines apropiados a 5V (consulte la tabla en la introducción).

Advertencia

La placa portadora A4988 utiliza condensadores cerámicos de bajo ESR, lo que la hace susceptible a picos destructivos de voltaje LC, especialmente cuando se usan cables de alimentación de más de unas pocas pulgadas.

Para proteger el controlador, puede conectar un condensador electrolítico entre VMOT y GND. Pololu sugiere un condensador de 47 µF o más (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 puede encontrar la hoja de datos de su motor paso a paso, puede ser difícil averiguar cómo cablear su motor correctamente. Utilizo el siguiente truco para determinar cómo conectar motores paso a paso bipolares de 4 cables:

Lo único que necesita identificar son los dos pares de cables que están conectados a las dos bobinas del motor. Los cables de una bobina se conectan a 1A y 1B y el otro a 2A y 2B, la polaridad no importa.

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

  1. Intente girar el eje del motor paso a paso a mano y observe lo difícil que es girar.
  2. Ahora elija un par de cables al azar del motor y toque los extremos desnudos juntos.
  3. A continuación, intente girar de nuevo el eje del motor paso a paso.

Si sientes mucha resistencia, has encontrado un par de cables de la misma bobina. Si puedes girar el eje libremente, prueba con otro par de cables. Ahora conecte las dos bobinas a los pines que se muestran en el diagrama de cableado anterior.

(Si aún no está claro, deje un comentario a continuación, también se puede encontrar más información en el RepRap.org wiki)

¿Cómo establecer el límite actual?

Antes de comenzar a programar su Arduino y comenzar a usar el controlador, hay una cosa muy importante que necesita hacer que mucha gente olvide: ¡establezca el límite actual!

Este paso no es muy complicado, pero es absolutamente necesario para proteger su motor paso a paso y al conductor. Si no establece un límite de corriente apropiado, su motor puede extraer más corriente de la que puede manejar o su conductor, es probable que dañe a uno o ambos.

Para establecer el límite de corriente, debe medir un voltaje de referencia y ajustar el potenciómetro incorporado en consecuencia. Necesitará un destornillador pequeño, un multímetro para medir el voltaje de referencia y cables de prueba de cocodrilo (opcionales pero muy prácticos).

Diagrama de cableado de límite de corriente para el controlador A4988.

Para medir el voltaje de referencia, el controlador debe estar alimentado. El A4988 solo necesita alimentación a través de VDD (5V) y necesita conectar RST y SLP juntos, de lo contrario el controlador no se encenderá. Lo mejor es desconectar el motor paso a paso mientras haces esto.

Si ya ha conectado el controlador, puede dejar todo menos el motor paso a paso conectado. Puede aplicar energía a través del puerto USB del Arduino.

A4988 Connection
VDD 5V
RST SLP
SLP RESET
GND Ground
Required connections to set the current limit

Current limit formula

The next step is to calculate the current limit with the following fórmula:

Límite de corriente = Vref ÷ (8 × Rcs)

El Rcs es la resistencia de detección de corriente. Si compró un controlador A4988 de Pololu antes de enero de 2017, el Rcs será de 0,050 Ω. Los controladores vendidos después de eso tienen resistencias de detección de corriente de 0,068 Ω.

Esto significa que para un límite de corriente de 1A para una placa con resistencias de detección de corriente de 0,068 Ω, el Vref debe ser de 540 mV.

sentido Corriente del resistor de ubicaciones. Foto: www.pololu.com

Para seleccionar el límite de corriente correcto, eche un vistazo a la hoja de datos de su motor paso a paso. Si no puede encontrar la clasificación actual de su motor, le recomiendo comenzar con un límite de corriente de 1A. Siempre puede aumentarlo más tarde si a su motor/conductor le faltan pasos.

Información adicional: Cuando se utiliza el controlador en modo de paso completo, la corriente a través de cada bobina está limitada a aproximadamente el 70% del límite de corriente establecido. Esto significa que tendría que establecer el límite actual un 40% más alto o 1.4 A en el modo de paso completo. Cuando se usa microstepping, se aplica la fórmula anterior.

Tenga en cuenta que debe recalibrar el límite de corriente si cambia el voltaje de la fuente de alimentación del motor. Si su motor hace mucho ruido, intente reducir el límite actual. Lo mejor es establecer el límite de corriente lo suficientemente alto para que el motor no pierda pasos.

Medición de Vref

Ahora tendrá que medir el voltaje de referencia (Vref) entre los dos puntos marcados en la imagen de abajo (GND y el potenciómetro) y ajustarlo al valor que calculó.

Puntos de sonda Vref (GND y potenciómetro).

Recomiendo usar cables de prueba de cocodrilo sujetados al destornillador para establecer el límite actual. 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 usar la corriente medida en la fuente de alimentación para establecer el límite de corriente. El lugar apropiado para colocar su medidor de corriente es en serie con una de sus bobinas de motor paso a paso.

Pololu

FAQ de límite de corriente

¿Necesito tener el motor paso a paso conectado o no?
No, no es necesario conectar el motor paso a paso al conductor al establecer el límite de corriente. Para estar seguro, desconecte el motor, a veces interfiere con la medición del voltaje Vref.

¿Necesito girar el motor ejecutando el boceto del motor Arduino?No, véase la pregunta anterior.

necesito para girar el potenciómetro del reloj o en sentido antihorario para aumentar Vref?
Esto depende del fabricante del conductor. Si tiene una placa de desbloqueo Polulu genuina del DRV8825 o del A4988, gire el potenciómetro en el sentido de las agujas del reloj para elevar el Vref y en el sentido contrario a las agujas del reloj para bajarlo.

Enfriamiento del controlador

El CI del controlador A4988 tiene una capacidad de corriente máxima de 2 A por bobina, pero sin un disipador de calor, solo puede suministrar aproximadamente 1 A por bobina antes de que comience a sobrecalentarse.

El conductor generalmente viene con un pequeño disipador de calor con respaldo adhesivo, que le recomiendo que instale de inmediato. También puede comprar un montón de pequeños disipadores de calor de Amazon por un precio realmente barato.

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

Ahora que ha conectado el controlador y establecido el límite actual, es hora de conectar el Arduino al ordenador y cargar algún código. Puede cargar el siguiente código de ejemplo en su Arduino utilizando el IDE de Arduino. Para este ejemplo específico, no es necesario instalar ninguna biblioteca.

Este boceto controla la velocidad, el número de revoluciones y la dirección de giro del motor paso a paso.

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

Cómo funciona el código:

El croquis comienza definiendo los pines de paso y dirección. Los conecté al pin 3 y 2 de Arduino.

La instrucción #define se utiliza para dar un nombre a un valor constante. El compilador reemplazará cualquier referencia a esta constante con el valor definido cuando se compile el programa. Así que donde quiera que mencione dirPin, el compilador lo reemplazará con el valor 2 cuando se compile el programa.

También definí una constante stepsPerRevolution. Debido a que configuré el controlador en modo de paso completo, lo configuré en 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 la secciónsetup()del código, todos los pines de control del motor se declaran como SALIDA digital con la funciónpinMode().

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

En la sección 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. A continuación, dejamos que el motor gire 5 revoluciones en cada dirección con una alta velocidad. Entonces, ¿cómo se controla la velocidad, la dirección de giro y el número de revoluciones?

Control de dirección de giro:

Para controlar la dirección de giro del motor paso a paso, configuramos el pasador DIR (dirección) ALTO o BAJO. Para ello utilizamos la función digitalWrite(). Dependiendo de cómo conectó el motor paso a paso, al configurar el pasador DIR alto, el motor girará CW o CCW.

Controlar el número de pasos o revoluciones:

En este bosquejo de ejemplo, los bucles for controlan el número de pasos que tomará el motor paso a paso. El código dentro del bucle for da como resultado 1 paso del motor paso a paso. Debido a que 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 en el bucle for al 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 está determinada por la frecuencia de los pulsos que enviamos al pasador DE PASOS. Cuanto mayor sea la frecuencia, más rápido funcionará el motor. Puede controlar la frecuencia de los pulsos cambiando delayMicroseconds() en el código. Cuanto más corto sea el retardo, mayor será la frecuencia, más rápido funcionará el motor.

Tutorial de la biblioteca AccelStepper

La biblioteca AccelStepper escrita por Mike McCauley es una biblioteca increíble para usar en tu proyecto. Una de las ventajas es que admite aceleración y desaceleración, pero también tiene muchas otras funciones agradables.

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

Puede instalar la biblioteca yendo a Sketch > Include Library > Add.Biblioteca ZIP in en el IDE Arduino.

Otra opción es navegar a Herramientas > Administrar bibliotecas Manage o escribir Ctrl + Mayús + I en Windows. El Administrador de bibliotecas abrirá y actualizará la lista de bibliotecas instaladas.

puede buscar por ‘accelstepper’ y busca la biblioteca por Mike McCauley. Seleccione la versión más reciente y, a continuación, haga clic en Instalar.

la rotación Continua de código de ejemplo

El siguiente dibujo puede ser utilizado para ejecutar uno o más motores paso a paso de forma continua a una velocidad constante. (No se utiliza aceleración ni desaceleración).

¿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 las conexiones de A4988 a Arduino y el tipo de interfaz del motor. El tipo de interfaz del motor debe ajustarse a 1 cuando se utiliza un conductor de paso y dirección. Puedes encontrar los otros tipos de interfaz aquí.

La instrucción #define se utiliza para dar un nombre a un valor constante. El compilador reemplazará cualquier referencia a esta constante con el valor definido cuando se compile el programa. Así que donde quiera que mencione dirPin, el compilador lo reemplazará con el valor 2 cuando se compile 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, debe crear una nueva instancia de la clase AccelStepper con el tipo de interfaz de motor y las conexiones adecuadas.

En este caso, llamé al motor paso a paso ‘stepper’, pero también puedes usar otros nombres ,como ‘z_motor’o’ liftmotor’, etc. AccelStepper liftmotor = AccelStepper(motorInterfaceType, stepPin, dirPin);. El nombre que le dé al motor paso a paso se usará más tarde para establecer la velocidad, la posición y la aceleración para ese motor en particular. Puede crear varias 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 la sección setup() del código definimos la velocidad máxima en pasos / segundo. Velocidades de más de 1000 pasos por segundo pueden ser poco fiables, por lo que establecí esto como el máximo. Tenga en cuenta que especifico el nombre del motor paso a paso (‘stepper’), para el que quiero definir la velocidad máxima. Si usted tiene múltiples motores paso a paso conectado, puede 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() empezamos la velocidad a la que queremos que el motor funcione. Para ello, utilizamos la función setSpeed(). (también puede colocar esto en la sección configuración del código).

stepper.runSpeed() sondea el motor y cuando vence un paso, ejecuta 1 paso. Esto depende de la velocidad establecida 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 en sentido contrario.

Código de ejemplo para controlar el número de pasos o revoluciones

Para permitir que el motor gire un número específico de pasos, prefiero usar un bucle while en combinación con stepper.currentPosition(). Puede usar el siguiente código de ejemplo para que el motor funcione de un lado a otro.

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 la función currentPosition(). Primero, establezco la posición actual del motor paso a paso a cero con stepper.setCurrentPosition(0).

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

A continuación hacemos uso del bucle while. Un bucle while hará un bucle continuo, e infinitamente, hasta que la expresión dentro del paréntesis, () se convierta en false. Por lo tanto, 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). Si bien este no es el caso, ejecutamos el motor paso a paso a una velocidad constante establecida por setSpeed().

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

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

Con el siguiente esquema, puede agregar aceleración y desaceleración a los movimientos del motor paso a paso, sin ninguna codificación complicada. En el siguiente ejemplo, el motor funcionará de ida y vuelta con una velocidad de 200 pasos por segundo y una aceleración de 30 pasos por segundo por segundo.

Explicación del código:

En la configuración (), 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 permitir que el motor girara un número predefinido de pasos. La función stepper.moveTo() se utiliza para establecer la posición de destino. La función stepper.runToPostion() mueve el motor (con aceleración/desaceleración) a la posición de destino y se bloquea hasta que está en la posición de destino. Debido a que esta función está bloqueando, no debe usarla cuando necesite controlar otras cosas al mismo tiempo.

Conclusión

En este artículo le he mostrado cómo controlar un motor paso a paso con el controlador de motor paso a paso A4988 y Arduino. Espero que lo haya encontrado útil e informativo. Si lo hiciste, por favor compártela con un amigo que también le guste la electrónica y hacer cosas.

He utilizado mucho este controlador personalmente para un montón de impresoras 3D y otros proyectos relacionados con CNC, pero me encantaría saber qué proyectos planea construir (o ya ha construido) con este controlador. Si tiene alguna pregunta, sugerencia o si cree que faltan cosas en este tutorial, deje un comentario a continuación.