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).
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.
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.
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
me da error el codigo
a mi también me marca error, alguien nos puede ayudar?
Gracias
Cambia las iniciales «<«, por «<="
en ambos renglones y ya funciona
donde esta eso?
donde esta eso «<"
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
Hola!
Cuando conecto mi driver con pasos completos funciona perfectamente, pero cuando pongo micropasos anda muy mal… ¿que esta pasando?