Motor paso a paso con driver A4988 y Arduino

Motor paso a paso Nema 17, controlador A4988 y Arduino

En este tutorial se explica cómo controlar el movimiento de un motor paso a paso utilizando el controlador A4988 y Arduino. Se incluyen diagramas de cableado, se explica cómo configurar el límite de corriente y se muestran los códigos básicos para controlar el motor desde nuestro Arduino.

Detalles del controlador A4988

En el núcleo del A4988, se encuentra un chip fabricado por Allegro MicroSystems conocido como controlador de micropasos DMOS A4988 con traductor y protección contra sobrecorriente. Este controlador de motor integrado simplifica la interfaz con un microcontrolador, ya que solo requiere dos pines para controlar tanto la velocidad como la dirección del motor paso a paso.

Cuenta también con cinco resoluciones de micropasos diferentes (hasta 1/16 de paso). Funciona de 8 V a 35 V y puede suministrar hasta aproximadamente 1 A por fase sin disipador de calor ni flujo de aire forzado con una capacidad nominal de 2 A por bobina con suficiente refrigeración adicional. En el paquete en el que viene esta placa normalmente se incluye un disipador de aluminio que nos permitirá trabajar con corrientes cercanas a la nominal de 2 A. Con estas características, este controlador es ideal para alimentar motores paso a paso pequeños o medianos, como un motor bipolar NEMA 17.

Disipador de aluminio para controlador A4988

Cableado mínimo para utilizar este controlador

Para comenzar a utilizar este controlador el fabricante aconseja utilizar el siguiente cableado mínimo.

Cableado mínimo para utilizar el controlador A4988

Como se ve en el diagrama, el controlador requiere que se conecte una tensión de alimentación para el circuito lógico (de 3 V a 5,5 V) a través de los pines VDD y GND y una tensión de alimentación para el motor (8 a 35 V) que se conecte a través de VMOT y GND. Estos suministros deben tener condensadores de desacoplamiento apropiados cerca de la placa y deben ser capaces de entregar las corrientes esperadas.

Advertencia

Esta placa utiliza condensadores cerámicos de baja ESR (resistencia serie equivalente), lo que la hace susceptible a picos de voltaje LC destructivos, especialmente cuando se usan cables de alimentación largos. En las condiciones adecuadas, estos picos pueden superar la tensión nominal máxima de 35 V para el A4988 y dañar permanentemente la placa, incluso cuando la tensión de alimentación del motor es sólo de 12 V. Una forma de proteger al controlador de tales picos es colocar un condensador electrolítico grande (al menos 47 μF) en paralelo con la fuente del motor.

Advertencia

Conectar o desconectar un motor paso a paso mientras el controlador está encendido puede destruir el controlador.

Advertencia

Asegúrese de conectar con la polaridad correcta el capacitor electrolítico ya que de lo contrario este se destruirá en cuestión de segundos. La destrucción de un capacitor genera calor y humo e incluso puede llegar a crear una pequeña explosión por la compresión de los gases en la envoltura metálica.

Capacitor de 100 μF
Consejo

Para conocer la polaridad correcta del capacitor electrolítico, puede mirar la banda que señala la pata negativa.

Los pines 1A, 1B, 2A y 2B corresponden a la conexión de las bobinas del motor paso a paso. 1A y 1B corresponden a los extremos de la bobina 1 y 2A y 2B corresponden a los extremos de la bobina 2.

Tamaño del paso

Los motores paso a paso suelen tener una especificación de tamaño de paso, por ejemplo, 1,8° o 200 pasos por revolución. Un controlador de micropasos como el A4988 permite resoluciones más altas al permitir ubicaciones de pasos intermedios, que se logran energizando las bobinas con niveles de corriente intermedios. Por ejemplo, accionar un motor en modo de cuarto de paso permitirá que los motores de 200 pasos por revolución puedan realizar 800 micropasos por revolución mediante el uso de cuatro niveles de corriente diferentes.

Aunque en el diagrama de cableado mínimo indica que pueden dejarse desconectadas, las entradas del selector de resolución (tamaño de paso) MS1, MS2 y MS3 permiten seleccionar entre las cinco resoluciones de paso de acuerdo con la siguiente tabla.

MS1 MS2 MS3 Resolución de micropasos
Bajo Bajo Bajo Paso completo
Alto Bajo Bajo Medio paso (1/2)
Bajo Alto Bajo Cuarto de paso (1/4)
Alto Alto Bajo Octavo de paso (1/8)
Alto Alto Alto Dieciseisavo de paso (1/16)

MS1 y MS3 tienen resistencias pull-down internas de 100 kΩ y MS2 tiene una resistencia pull-down interna de 50 kΩ, por lo que dejar estos tres pines de selección de micropasos desconectados da como resultado el modo de paso completo. Para que los modos de micropasos funcionen correctamente, el límite de corriente debe establecerse lo suficientemente bajo para que se active la limitación de corriente. De lo contrario, los niveles de corriente intermedios no se mantendrán correctamente y el motor omitirá micropasos.

Entradas de control

Cada pulso a la entrada STEP corresponde a un micropaso del motor paso a paso en la dirección seleccionada por el pin DIR. Tenga en cuenta que los pines STEP y DIR no tienen ninguna tensión interna, por lo que no debe dejar ninguno de estos pines sin conectar en su aplicación. Si solo desea la rotación en una sola dirección, puede vincular DIR directamente a VDD o GND.

El chip tiene además tres entradas diferentes para controlar sus muchos estados de energía: RESET, SLEEP y ENABLE. ENABLE es activo en cero y se puede dejar desconectado para habilitar el controlador. En el caso de los pines SLEEP y RESET, que también son activos en cero, deben conectarse en un voltaje alto para habilitar el controlador. Sin embargo, como SLEEP tiene conectada una resistencia de pull-up internamente, podemos conectar directamente este pin al pin RESET para que ambos tengan un voltaje alto y de esta forma mantener el controlador habilitado.

Límite de corriente máxima

Antes de comenzar a programar su Arduino y usar el controlador, debe establecer el límite de corriente máxima. Este paso es muy importante, ya que si no establece un límite de corriente adecuado, su motor puede consumir más corriente de la que él o su controlador pueden manejar y probablemente esto dañe uno o ambos componentes.

El fabricante del circuito integrado brinda la siguiente fórmula para el cálculo de la corriente máxima.

Ecuación 1

Si queremos fijar la corriente máxima podemos despejar la fórmula para conocer cual debe ser la tensión de referencia para esa corriente máxima. De esta forma nos que la siguiente expresión.

Ecuación 2

El valor de la corriente máxima se estable en función de las características de nuestra fuente y nuestro motor; siempre respetando que este circuito puede trabajar como máximo a 2 A. En las especificaciones del motor que se esta utilizando para este tutorial se aclara que la corriente máxima por fase es de 1,5 A. Por esta razón establecemos una corriente máxima un poco más baja para no trabajar al límite.

Información

Esta corriente máxima que establecemos es la de seguridad y en caso de que sea superada, el circuito integrado corta de forma automática la alimentación de las bobinas del motor para evitar que este se deteriore.

Con el valor de corriente máxima fijado, necesitamos conocer el valor de la resistencia RCS. Si tenemos dudas de cómo encontrarla en la placa, se puede encontrar el valor en la hoja de datos del controlador. Los valores típicos de esta son 0,05 Ω, 0,1 Ω o 0,2 Ω. En este caso el valor de RCS es 0,05 Ω.

Con una corriente máxima de 1,4 A y una resistencia de 0,05 Ω, se obtiene una tensión de referencia de 0,56 V.

Ecuación 3 Ecuación 4

Para fijar este valor debemos ajustar el preset que aparece en la placa utilizando un destornillador, un multímetro para medir la tensión y alimentar con 5 V la parte lógica del controlador (pines VDD y GND). En el siguiente diagrama se muestra la conexión de la placa con el pin de 5 V de Arduino al pin VDD del controlador y el pin GND de Arduino al pin GND también del controlador.

Cableado para ajustar el preset de la placa

El negativo del multímetro se conecta al pin GND del controlador y el positivo a la parte metálica del destornillador con el que se ajusta el preset. De esta forma se mide la tensión VREF y se ajusta al valor previamente calculado girando suavemente el tornillo del preset.

Advertencia

El preset de la placa es muy delicado y se puede romper fácilmente.

Advertencia

Si su motor hace mucho ruido, intente reducir el límite de corriente. Lo mejor es establecer el límite de corriente lo suficientemente alto para que el motor no pierda pasos.

Cableado mínimo para utilizar el controlador con Arduino

Luego de establecer el límite de corriente se pueden conectar la fuente del motor, el motor y los pines de control, siguiendo el esquema básico sugerido por el fabricante como se muestra en la siguiente figura.

Cableado mínimo para utilizar el controlador A4988 en protoboard

Para controlar la velocidad del motor con esta configuración podemos utilizar demoras por software para modificar el tiempo que demora el motor en dar un paso (o micropaso). Si observamos el diagrama de tiempo que se muestra en el datasheet de este componente, comprobamos que la duración mínima del pulso de inicialización del paso es de 1 μs seguido de un pulso bajo de al menos 1 μs también. Es con la suma de estos dos tiempos que se obtiene la demora total entre pasos del motor. También se suman los tiempos de las instrucciones entre ciclos pero estas pueden en algunos casos considerarse insignificantes.

Diagrama de tiempo
Duración de tiempo Símbolo Tamaño del pulso Unidades
Paso mínimo, ancho de pulso en Alto tA 1 μs
Paso mínimo, ancho de pulso en Bajo tB 1 μs
Tiempo de Setup tC 200 ns
Tiempo de Hold tD 200 ns

Para construir los pulsos se pueden utilizar las funciones de demora delay(ms) o delayMicroseconds(us).

Información
  • delay(ms) – suspende la ejecución del código por milisegundos. La función delay() provoca que el código se detenga durante el tiempo fijado en el parámetro ms de tipo unsigned long. Esta función permite pausar la ejecución desde 1 ms a 50 días con una resolución de 1 milisegundo.

  • delayMicroseconds(us) – Análogo a delay(), pausa la ejecución del código durante el tiempo fijado en el parámetro us en microsegundos. El parámetro us es de tipo unsigned int y puede pausar la ejecución de 4 a 16383 μs con una resolución de 4 μs. Los valores más grandes pueden producir un retraso extremadamente corto. Para retrasos de más de unos pocos miles de microsegundos, debe usar en su lugar delay().

Advertencia

La velocidad máxima a la que puede trabajar el motor debes consultarla en el datasheet de tu motor. Muchos fabricantes recomiendan velocidades de trabajo de entre 100 y 500 rpm. Ten en cuenta que la velocidad de rotación del motor tiene una relación inversamente proporcional (aproximadamente) con el torque que puede ejercer el motor. Para conocer los límites de tú motor debes consultar la curva torque - velocidad.

En el siguiente código utilizamos las funciones de demora para rotar el motor una vuelta completa en sentido horario y en sentido anti-horario. En este caso se utiliza una demora tB de 5 ms luego de un pulso de inicialización tA de 4 μs. La suma de estos tiempos da cercana a 5 ms y este es el tiempo aproximado entre pasos. Teniendo en cuenta que este motor tiene 200 pasos por vuelta, a esta velocidad, el motor completa una vuelta luego de aproximadamente 1 segundo.

Ecuación 5
 1// Ejemplo de Arduino para utilizar el controlador A4988
 2// con el cableado mínimo. 
 3// Más información: https://www.3dpellet.com
 4
 5// Definimos las conexiones de control, en nuestro caso
 6// pin 4 para la dirección y pin 5 para el paso:
 7#define dirPin 4
 8#define stepPin 5
 9// Cantidad de pasos por revolución para este motor
10#define stepsPerRevolution 200
11// Con estas variables podemos configurar la velocidad del motor
12#define tA 4 //4 us
13#define tB 5 //5 ms
14
15void setup() {
16  // Declaramos los pines como salidas:
17  pinMode(stepPin, OUTPUT);
18  pinMode(dirPin, OUTPUT);
19}
20
21void loop() {
22  // Introducimos una demora de un segundo
23  // para poder visualizar el cambio de rotación
24  delay(1000);
25  // Ponemos en un nivel alto la entrada de dirección
26  // de rotación para rotar el motor en sentido horario:
27  digitalWrite(dirPin, HIGH);
28
29  // Rotamos el motor una vuelta completa:
30  for (int i = 0; i < stepsPerRevolution; i++) {
31    // Ponemos en nivel alto el pin de paso durante
32    // un tiempo aproximado tA
33    digitalWrite(stepPin, HIGH);
34    delayMicroseconds(tA);
35    // Ponemos en nivel bajo el pin de paso durante
36    // un tiempo aproximado tB
37    digitalWrite(stepPin, LOW);
38    delay(tB);
39  }
40
41  // Introducimos una demora de un segundo
42  // para poder visualizar el cambio de rotación
43  delay(1000);
44
45  // Rotamos el motor una vuelta completa en sentido anti-horario
46  // Estas líneas son similares a la rotación previa
47  digitalWrite(dirPin, LOW);
48  for (int i = 0; i < stepsPerRevolution; i++) {
49    digitalWrite(stepPin, HIGH);
50    delayMicroseconds(tA);
51    digitalWrite(stepPin, LOW);
52    delay(tB);
53  }
54}

Si te ha gustado nuestro contenido ayúdanos suscribiéndote o dejando tu like en nuestro canal de YouTube.

Play Video: Keynote (Google I/O '18)