Manejar un motor stepper con un driver DRV8825 y Arduino

Voy a contar cómo manejar un motor paso a paso (stepper) con Arduino a través de un controlador DRV8825. En esta otra entrada explico cómo hacerlo con una Raspberry Pi, de forma muy similar, y en esta hablo de varios motores y drivers.

0j42241200

Características principales del driver DRV8825:

  • Para motores bipolares
  • Permite microstepping de hasta 1/32
  • 1.5  por fase o 2.2A si se dispone de ventilación forzada de aire o disipadores
  • Interfaz casi idéntica al A4988
  • 45 V máximo
  • Control de corriente máxima con un potenciómetro

El motor que voy a usar es un motor NEMA 17 JK42HS40-1704 13A, comprado aquí por 12.50 €, pero valdría cualquier motor bipolar de 4 cables.

Características del motor:

  • Número de parte: JK42HS40-1704 13A
  • Tamaño de marco: NEMA17
  • Ángulo del paso: 1,8 grados
  • Voltaje: 3.4V
  • Corriente: 1,7 A/fase
  • Resistencia: 2,0 ohmios/fase
  • Inductancia: 3,0 mH/phase
  • Llevar a cabo el esfuerzo de torsión: 4000g-cm 58.30 OZ-IN
  • Inercia del rotor: 54 g-cm2
  • Esfuerzo de torsión de la muesca: 0,22 kilogramo-cm
  • Número de ventajas de alambre: 4
  • Peso: 0,24 kilogramos
  • Longitud: 40m m
  • Eje del motor: 5mm
  • Longitud del árbol delantero: 20 mm
  • Certificación: CE, ROHS, ISO9001

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

Siguiendo las instrucciones de la página de Pololu, voy a emplear el siguiente modo 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 de mi montaje es así:

Manejar un motor paso a paso con DRV8825 y Arduino

 

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

  • B2: azul
  • B1: rojo
  • A1: negro
  • A2: verde

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, que cuento a continuación.

Empiezo con el motor desconectado. Lo primero, calculo el voltaje por cada fase. Para eso me fijo en las características de mi motor. Ahí me dicen que el motor es de 1.7 A / fase. Tendré que limitar el DRV8825 a este valor. Por encima de 1.5 A (y hasta 2.2A) el controlador DRV8825 debe tener ventilación forzada de aire o un disipador, así que le pego un disipador (me venía al comprarlo con el DRV8825), pues pretendo fijarlo en la capacidad máxima del motor.

Ahora tengo que ajustar la corriente del DRV8825 con el potenciómetro. Primero tengo que averiguar a cuánto he de limitar esa corriente. Para ello empleo la fórmula que viene en la hoja de especificaciones del driver:

Current Limit = VREF × 2

(Ojo, que por muchas páginas se ven otras fórmulas; hay que emplear la fórmula específica de nuestro driver).

Entonces:

1.7 = VREF x 2

VREF = 0.85 V

Pero ojo, este voltaje va asociado a la corriente máxima que recibirá el motor, y depende de la configuración de micropasos. Hay que consultar en la Tabla 2 de la hoja de especificaciones del DRV8825. En mi caso, con paso completo (full step), la corriente es un 71%, así que deberé multiplicar por este factor el resultado anterior:

VREF = 0.71 · 0.85 = 0.60 V

Así que el voltaje límite que debo ajustar es 0.60 V por fase.

Ahora tengo que ver dónde medir con el multímetro en el DRV8825:

Aunque es más fácil medir directamente desde el potenciómetro:

Desconecto el motor, pero alimento con 12V el DRV8825 y alimento también el Arduino a través del puerto USB. Con todo así, mido el voltaje y ajusto el potenciómetro hasta alcanzar mis VREF calculado antes (0.60 V).

Ya tengo el driver ajustado a mi motor, 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://hetpro-store.com/TUTORIALES/controlador-de-motor-pasos-drv8825en-construccion/

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

https://forum.pololu.com/t/drv-8825-stepper-motor-steps-and-delay-between-pulses/7530

14 comentarios en “Manejar un motor stepper con un driver DRV8825 y Arduino

  1. Pingback: Motores paso a paso (stepper motor) con Arduino y varios controladores | Carlini's Blog

  2. En el caso del 4988 Imax=Vref/8xRs en el 8825 Imax=Vref/5xRs. en mi caso Rs es R100 que corresponde a 0,1 Ohm, por lo tanto Vref=2x Imax en mi caso 1,68 A implica que debo ajustar a 0,84Volts. Pero para paso completo habia que multiplicarlo por 0,7 (70%) para el 4988, en el 8825 también deberia hacerse lo mismo? Muy buen articulo, muchas gracias

  3. Tiene un error el codigo o bueno asi me marca en la linea donde esta el «for(int x= 0; x< steps; x++)»
    el bucle no tiene lógica a ti si te funciono????

  4. Pingback: Manejar un motor stepper con un driver DRV8825 y una Raspberry Pi | Carlini's Blog

  5. Buenas Tardes Tengo una consulta.
    Si en la lectura del Mulltímetro noto que el valor Vref es imposible de fijarlo ya que los valores oscilan aun así sin mover el potenciómetro, entonces ¿Es problema del potenciómetro? Tengo 4) 8825 y todos tienen la misma falla. El Multímetro no es el problema porque mide bien los valores de un Pololu A4.

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.