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.
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í:
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
Pingback: Motores paso a paso (stepper motor) con Arduino y varios controladores | Carlini's Blog
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
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????
No veo dónde está el error, la verdad, y sí me funcionó…
A mi también me da error en esa parte. Estas seguro de que esta bien el código?
Lo que sucede es que el sitio web hizo la conversión del signo < por < el cual es su equivalente en HTML.
la sentencia correcta es:
for (int x = 0; x< steps ; x++)
Pingback: Manejar un motor stepper con un driver DRV8825 y una Raspberry Pi | Carlini's Blog
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.
en el código tienes un error
for (int x = 0; x < steps ; x++) {
ese < debería convertirse en un <
Puede ser que estás pegando el código html…
buenas, lo conecte como esta pero, mi motor vibra mucho y corre despacio
Trata de tomar la opción microstepping, solucionará tu vibración. Para la velocidad quizas requiera más corriente.
los cables de tierra y corriente que alimentan el motor se calientan alguna respuesta?