Manejar un motor stepper con un driver A4988 y Arduino

Voy a contar cómo manejar un motor paso a paso (stepper) con Arduino a través de un driver A4988. En esta otra entrada ya expliqué cómo hacerlo con un controlador DRV8825, que es una versión mejorada del A4988 (el DRV8825 admite microstepping has 1/32, frente al 1/16 del A4988, 45V frente a 35V, y 2.5A frente a 2A).

Pololu driver A4988

 

Características principales del driver A4988:

  • Para motores bipolares
  • Permite microstepping de hasta 1/16
  • 2A
  • Interfaz casi idéntica al DRV8825
  • 35 V máximo
  • Control de corriente máxima con un potenciómetro

Nota importantísima: los datos anteriores, en especial el del límite de 2A es para los A4988 en los módulos Pololu (algo más caros). Hay una variante muy común que son los StepStick (más baratos, y seguramente es este el que tienes si lo has comprado de China). y la principal diferencia es que su límite es de 1A. Así que mucho ojito.

Stepstick driver A4988

El motor que voy a usar es un motor NEMA 17 GZGW09, comprado aquí por 13.50 €, pero valdría cualquier motor bipolar de 4 cables.

gzgw09

Características:

  • Step angle: 1.8 degree
  • Rated voltage: DC 4.83V
  • Rated current: 0.84A
  • Phase impedance: 5.75 Ohm + / – 10 degree centigrade
  • Phase inductance: 9.3 mH + / – 20 degree centigrade (1kHz 1V RMA)
  • Holding torque: 0.48Nm Min
  • Shaft diameter: 5mm / 0.188 (3/16)
  • Shaft length: 20mm
  • Motor height: 34mm
  • Number of lead wire: 4 wires
  • Driven X-axis and Y-axis movement, sprinkler wire wheel to scroll
  • Great for DIY project
  • Dimensions: 5.8 cm x 4.2 cm x 4.2 cm
  • Weight: 220 g

 

Para alimentar el motor empleo una fuente de alimentación de un ordenador (ver esta entrada).

Siguiendo las instrucciones de Pololu, voy a emplear el siguiente esquema de conexión, con paso completo (sin microstepping):

Empleo un Arduino Nano, pero valdría cualquier otro. Uso el pin 8 para la dirección y el 9 para el step. El esquema Fritzing sería así:

La conexión de los cables del motor al StepStick A4988 la hago así:

  • 1A: rojo (morado)
  • 1B: gris (gris)
  • 2A: amarillo (blanco)
  • 2B: verde (negro)

Para no dañar el motor tenemos que regular inicialmente el potenciómetro a la mínima potencia, girando el potenciómetro en sentido antihorario hasta el final, y más adelante ajustarlo hasta la capacidad del motor. En este vídeo se explica cómo regular adecuadamente la intensidad.

Lo primero es determinar el chip que realmente tenemos, pues cambia mucho si es un Pololu o un StepStick.

En la hoja de especificaciones se dice:

El Pololu tiene un valor de para la resistencia de censado SMD de 0.05 Ω (si se fabricó a partir de enero de 2017, entonces 0.068 Ω), mientras que en el StepStick es de 0.2 Ω. Lo mejor es mirarlo en la propia placa.

Así pues, en mi caso, tengo un StepStick (Rs= 0.2 Ω), y la intensidad máxima para mi motor de 0.84 A.

VREF = ItripMAX · 8 · Rs = 0.84 · 8 · 0.2 = 1.34 V

Así que debería limitar a 1.34 V.

Pero ojo, el valor de la intensidad que hemos empleado antes es la máxima. En función de qué configuración de microstepping vayamos a usar, se podrá emplear otro valor.

Así, si empleamos pasos completos sin micro pasos, vemos que la tensión va variando en cada micropaso (también se puede consultar una tabla en las especificaciones):

Si emplease pasos completos y no micro pasos, entonces la tensión máxima que se entrega al motor es de un 70.71%.

Y entonces, si voy a emplear pasos completos tendré que ajustar el voltaje a:

 

VREF= 0.7071· ItripMAX · 8 · Rs = 0.7071 · 0.84 · 8 · 0.2 = 0.95 V

Para medir este voltaje, lo hacemos con el multímetro sobre el potenciómetro y sobre tierra, y ajustamos el potenciómetro hasta la VREF calculada antes (0.95 V).

Ya tengo el driver ajustado a mi motor para pasos completos, así que ya puedo conectarlo y empezar a utilizarlo.

Cargando el siguiente código a Arduino, el motor da una vuelta completa en una dirección, y luego cambia de dirección y da otra vuelta:

const int dirPin = 8;
const int stepPin = 9;
 
const int steps = 200;
int microPausa = 1000;
 
void setup() {
 pinMode(dirPin, OUTPUT);
 pinMode(stepPin, OUTPUT);
}
 
void loop() {
 digitalWrite(dirPin, HIGH);  // Establezco una dirección

 for (int x = 0; x < steps ; x++) {
   digitalWrite(stepPin, HIGH);
   delayMicroseconds(microPausa);
   digitalWrite(stepPin, LOW);
   delayMicroseconds(microPausa);
 }
 delay(1000);
 
 digitalWrite(dirPin, LOW);  // Cambio la dirección

 for (int x = 0; x < steps ; x++) {
   digitalWrite(stepPin, HIGH);
   delayMicroseconds(microPausa);
   digitalWrite(stepPin, LOW);
   delayMicroseconds(microPausa);
 }
 delay(1000);

}

Y un vídeo mostrando el motor en movimiento con el código anterior:

Referencias

https://www.pololu.com/product/2133

http://www.luisllamas.es/2016/08/motores-paso-paso-arduino-driver-a4988-drv8825/

http://www.instructables.com/id/Drive-a-Stepper-Motor-with-an-Arduino-and-a-A4988-/

https://www.spainlabs.com/foros/tema-Ajuste-de-los-pololus-en-caliente

7 comentarios en “Manejar un motor stepper con un driver A4988 y Arduino

  1. Buenas tardes: como modifico el anterior programa de arduino para hacer lo siguiente:
    El motor paso a paso nema 17, control driver: A4988, arduino nano:
    Que el motor de un giro completo en 10 segundos y descanse 50 segundos y se repita este ciclo constantemente.
    El motor da un giro cada 60 segundos, pero el giro del eje demora 10 segundos, o sea que de 60 giros en una hora, que es para mover un reloj de madera artesanal.
    Le agradecería si me envía este programa a mi correo electrónico, Gracias

  2. Hola!
    Cuando conecto mi driver con pasos completos funciona perfectamente, pero cuando pongo micropasos anda muy mal… ¿que esta pasando?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.