Motores paso a paso con Arduino y driver A4988 o DRV8825


arduino-a4988-drv8825

¿Qué es un A4988 o DRV8825?

El A4988 y el DRV8825 son controladores (drivers) que simplifican el manejo de motores paso a paso desde un autómata o procesador como Arduino.

Estos controladores nos permiten manejar los altos voltajes e intensidades que requieren estos motores, limitar la corriente que circula por el motor, y proporcionan las protecciones para evitar que la electrónica pueda resultar dañada.

Para su control únicamente requieren dos salidas digitales, una para indicar el sentido de giro y otra para comunicar que queremos que el motor avance un paso. Además permiten realizar microstepping, una técnica para conseguir precisiones superiores al paso nominal del motor.

El A4988 ha alcanzado una gran popularidad en sus últimos tiempos debido a su uso en proyectos como, por ejemplo, en impresoras 3D caseras. Por su parte el DRV8825 es una versión mejorada del A4988 y, por tanto, tiene unas características ligeramente superiores.

En particular, el DRV8825 permite trabajar con tensiones superiores al A4988 (45V frente a 35V), e intensidades superiores (2.5A frente a 2A). Además, añade un nuevo modo de microstepping (1/32) que no está presente en el A4988.

Por lo demás, aparte de unas pequeñas diferencias, ambos dispositivos son similares en su montaje y uso. Incluso pueden ser compatibles entre sí, es decir, bajo ciertas condiciones podemos usar indistintamente uno u otro, e incluso una combinación de ambos de forma simultánea.

ModeloA4988DRV8825
ColorVerde o RojoMorado
Intensidad máxima2A2.5A
Tensión máxima35V45A
Microsteps1632
Rs típico0.05, 0.1 o 0.20.1
FórmulasI_max = Vref / ( 8 * Rs)I_max = Vref / ( 5 * Rs)
Vref = I_max * 8 * RsVref = I_max * 5 * Rs

Ambos controladores pueden alcanzar altas temperaturas durante su funcionamiento y es necesario disipar el calor para que el dispositivo no se dañe. Para intensidades superiores 1A en el A4988 y a 1.5A en el DRV8825 es necesario añadir un sistema de disipación de calor, e incluso ventilación forzada.

Disponen de protecciones contra sobreintensidad, cortocircuito, sobretensión y sobretemperatura. En general, son dispositivos robustos y fiables siempre que realicemos la conexión correctamente, e incorporemos disipación de calor si es necesario.

El A4988 y el DRV8825 son muy empleados en una gran variedad de proyectos que requieren el uso de motores paso a paso, como máquinas de CNC, plotters, robots que dibujan, impresoras 3D, y escáneres 3D.

También son un componente frecuente en proyectos para controlar robots y vehículos, especialmente en aquellos que requieren variar de forma individual la velocidad de cada rueda, como en vehículos con omniwheel o mecannum wheels.

Precio

Actualmente ambos controladores son dispositivos baratos ya que han visto bajar su precio gracias al aumento de su popularidad. Es posible encontrar un driver A4988 por 0.75€, y un DRV8255 por 1.15€, en vendedores internacionales en eBay o AliExpress.

arduino-a4988

Con una diferencia de precio tan estrecha lo normal es que elijamos el DRV8255, dado que tiene unas características técnicas superiores,

arduino-drv8825

¿Cómo funciona el A4988 y el DRV8825?

Como en la mayoría de los controladores de motores el componente fundamental es un puente-H. En el caso del A4988 y DRV8825, destinados a controlar motores paso a paso, se dispone de dos puentes-H (uno por canal) constituidos por transistores MOSFET.

Sin embargo, a diferencia de controladores más simples como el L298N o el TB6612FNG, que presenta una electrónica relativamente simple, el A4988 y el DRV8825 tienen una electrónica considerablemente más compleja.

A modo de ejemplo, la siguiente imagen tenemos el esquema del DRV8255 y, cómo vemos, los puentes-H (remarcados en azul) representan una parte muy pequeña del conjunto.

arduino-a4988-drv8825-funcionamiento

Uno de los motivos para esta complejidad es que únicamente requieren dos señales digitales de control para hacer funcionar el motor, y que incorporan las protecciones necesarias para su manejo.

El otro motivo de la complejidad de su electrónica es que incorporan funciones especialmente diseñadas para el control de motores paso a paso, como son el regulador de intensidad y el Microstepping. Veremos estas funcionalidades a continuación.

Regulación de intensidad (Chopping)

Ambos controladores disponen de reguladores de intensidad incorporados. El motivo es que los motores paso a paso de cierto tamaño y potencia, como por ejemplo los NEMA 17 o NEMA 23, necesitan tensiones superiores a las que podrían soportar las bobinas por su corriente nominal.

Por ejemplo, supongamos que tenemos un motor NEMA 17 con 1.2A de intensidad nominal y 1.5 Ohm de resistencia por fase. Según la ley de Ohm deberíamos aplicar 1.8V a cada bobina para que circule la intensidad nominal de 1.2A. Sin embargo, con esa tensión el motor ni se movería.

Para el que el motor funcione correctamente necesitamos aplicar una tensión superior. En este ejemplo, la tensión nominal podría ser 12V. Pero si aplicáramos 12V directamente, nuevamente por la ley de Ohm, pasarían 8A por la bobina, lo cual destruiría el motor en poco tiempo.

Por este motivo, los controladores incorporan un limitador de intensidad, que permiten alimentar el motor a tensiones nominales superiores a las que es posible por su resistencia e intensidad máxima admisible.

Por supuesto, la ley de Ohmn debe cumplirse en todo momento por lo que, continuando con nuestro ejemplo, cuando alimentemos el motor a 12V por la bobina pasará inevitablemente 8A.

El limitador interrumpe la señal proporcionando una señal pulsada PWM de forma que el valor promedio de la intensidad que atraviesa la bobina es la intensidad nominal del motor. Terminando nuestro ejemplo, el limitador de tensión aplicaría el pulso durante el 15% del tiempo y mantendrá el motor apagado el 85% restante.

A este mecanismo de limitación de intensidad se le denomina Chopping.

Para regular la intensidad que proporcionara el limitador y ajustarlo al valor del motor que vayamos a emplear ambas placas disponen de un potenciómetro que regula la intensidad del limitador.

Una forma de estimar la intensidad del regulador es medir la tensión entre el potenciómetro y GND y aplicar una fórmula que depende del modelo, que encontraréis en la tabla del principio de la entrada.

Estas fórmulas dependen el valor Rs de las resistencias ubicadas en la placa que pueden variar en función del fabricante. Los valores típicos también aparecen en la tabla, pero debéis comprobar el valor de las resistencias que monta vuestra placa.

Por ejemplo, con los valores de Rs habituales las fórmulas se reducen a:

ModeloRsFórmula reducida
A498850I_max = 0,625 * V_ref
A4988100I_max = 1,25 * V_ref
A4988200I_max = 2 ,2* V_ref
DRV8825100I_max = 2 * V_ref

No obstante, el valor obtenido mediante esta medición es sólo una aproximación y puede ser inexacto, por lo que lo emplearemos sólo como una calibración inicial, y terminaremos el ajuste fino midiendo la corriente real que proporciona el controlador al motor mediante un amperímetro.

Microstepping

Como hemos dicho, el microstepping es una técnica que permite obtener pasos inferiores al paso nominal del motor paso a paso que vamos a controlar.

Cuando vimos las secuencias típicas de encendido de un paso a paso, vimos que aplicando un control todo a nada a las bobinas teníamos varias posibles combinaciones, de las cuales vimos las tres más habituales (1-fase, 2-fases, media-fase). Pero nadie ha dicho que tengamos que encender o apagar por completo las bobinas.

El microstepping hace variar la corriente aplicada a cada bobina emulando un valor analógico. Si pudiéramos a ambas bobinas dos señal eléctrica senoidal perfecta desfasadas 90º conseguiríamos un campo magnético rotatorio perfecto en el interior del motor.

arduino-motor-paso-a-paso-microstepping

Por supuesto el controlador digital no genera valores analógicos perfectos, si no valores discretizados (“a saltos”), por lo que la señal eléctrica que aplica es igualmente una función senoidal discretizada.

El resultado es un campo magnético un campo magnético rotativo con un paso inferior al paso nominal, que depende del número de niveles de discretos que podemos emplear en las señales de excitación de la bobina.

Cuando funcionamos sin microstepping (Modo full step), los controladores aplican una secuencia de 2-fases, por lo que aplican de forma permanente el 71% de la corriente del limitador a cada bobina. Únicamente varían el sentido en el que la corriente circula por la bobina.

arduino-motor-paso-paso-secuencia-2-fases

Sin embargo, si aplicamos microstepping en cualquier de sus modos de funcionamiento, el controlador llega a aplicar el 100% de la corriente a una de las bobinas en un determinado paso. La cantidad de corriente concreta aplicada a cada bobina varía con cada paso.

Por ejemplo, con resolución 1/4 de paso, en el primer paso de la secuencia tendremos una bobina al 100% y la bobina B al 0%, en el segundo paso la bobina A al 92% y la bobina B al 38%, en el tercer paso la bobina A al 71%, y así sucesivamente.

El hecho de que sin microstepping la corriente aplicada es siempre el 71%, y si aplicamos microstepping (en cualquier resolución) la corriente aplicada llegará a ser del 100% en algún paso, es muy importante a la hora de calibrar la intensidad que circula por las bobinas.

Finalmente, la resolución con la que queremos que funcione el controlador se controla aplicando tensión a los Pines M0, M1 y M2. Estos pines están puestos a tierra mediante resistencias de Pull-Up, por lo que si no conectamos nada estarán a Low, y sólo deberemos forzar los pines en High.

ResolucionPines M0, M1 y M2
A4988DRV8825MODE0MODE1MODE2
Full stepFull stepLowLowLow
1/2 step1/2 stepHighLowLow
1/4 step1/4 stepLowHighLow
1/8 step1/8 stepHighHighLow
1/16 stepLowLowHigh
1/32 stepHighLowHigh
1/32 stepLowHighHigh
1/16 step1/32 stepHighHighHigh

Dejar todos los pines desconectados dará lugar a usar modo Full Step

Esquema de montaje

El esquema de conexión de ambos controladores es muy similar. Incluso, como hemos dicho, bajo ciertas consideraciones ambos dispositivos son compatibles entre si.

En el caso del A4988 el esquema es el siguiente

arduino-a4988-esquema

Que visto desde Arduino quedaría de la siguiente forma.

arduino-a4988-conexion

En el caso del DRV8825 el esquema es muy similar, con la excepción de que el pin Vdd se sustituye por el pin Fault.

arduino-drv8825-esquema

El esquema desde Arduino sería idéntico al anterior.

arduino-drv8825-conexion

Observar que el potenciómetro está ubicado en extremos diferentes en ambos modelos. Por tanto a la hora de cambiar uno por otro, porque es fácil equivocarse en la orientación, y dañar el dispositivo.

Comprobar la orientación del controlador durante el montaje y antes de dar la alimentación al sistema

Proceso de montaje

El proceso de montaje del A4988 o el DRV8825 no es demasiado complicado. La única parte que resulta un poco peliaguda es el proceso de ajuste y calibración del regulador de intensidad.

Ambos controladores son bastante robustos y difíciles de romper cuando están trabajando, si respetamos las necesidades de disipación de calor (cuando sea necesario).

Pero son extremadamente sensibles a desconectar el motor cuando el controlador está alimentado. Hacer esto causará, casi con total seguridad, que dañemos el controlador.

En general, evitar conectar o desconectar cualquier cable mientras el controlador esté alimentado.

Por otro lado, el potenciómetro del regulador de intensidad no tiene tope físico, por lo que es posible pasar de cero al máximo de valor sin danos cuenta, y podríamos dañar accidentalmente el motor.

Para no dañar ni el controlador ni el componente, debemos seguir siempre el proceso rigurosamente sin saltarnos ningún paso.

  • Conectar el driver a tensión, sin el motor y sin microstepping
  • Medir con un voltímetro la tensión entre GND y el potenciómetro
  • Ajustar el potenciómetro hasta que la tensi´pn sea el valor proporcionado por la fórmula
  • Apagar el montaje
  • Conectar el motor, interponiendo en medio un amperímetro
  • Realizar con cuidado el ajuste fino del potenciómetro, hasta que la intensidad sea la nominal del motor
  • Apagar el montaje
  • Retirar el amperímetro, y conectar el motor definitivamente
  • Conectar Arduino al montaje

Como hemos dicho, el hecho de que vayamos a usar posteriormente microstepping influye en el valor limite que debemos fijar en el regulador de intensidad.

Si no vamos a usar Microstepping, podemos aplicar aumentar el límite del regulador de intensidad hasta el 100% de la intensidad nominal del motor.

Si vamos a usar Microstteping, el valor que hemos medido es el 71% del que luego circulará realmente por la bobina. Por tanto, en el amperímetro debemos ajustar el 71% de la intensidad nominal del motor.

Ejemplo de código

Aunque entender los pormenores del A4988 y el DRV8825 puede haber tenido su dificultad, las ventajas de su uso claras. El código necesario para su control es extremadamente sencillo, lo cual hace de ellos unos componentes muy prácticos y útiles de usar.

Simplemente tenemos que indicar mediante dos salidas digitales el instante en el que queremos que el motor avance un paso, y el sentido de giro. La velocidad de giro se controla por el tiempo que dejamos transcurrir entre paso y paso.

El siguiente ejemplo, hace girar el motor paso a paso una revolución en un sentido, y dos en sentido contrario a una velocidad ligeramente superior.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino
Previous Controlar dos motores DC con Arduino y driver TB6612FNG
Next Cómo usar un acelerómetro en nuestros proyectos de Arduino
  • Maximus

    ¿Es posible que donde dices DRV8225, quieras decir DRV8825?

    Genial, el artículo … saludos

    • luisllamas

      Muy posible, tengo una tendencia horrorosa a mezclar DRV8225 y DRV8825 y A4998 y A4988 XD
      Está re-revisado, y creo que no me he dejado ninguna. Gracias por el aviso!

  • manuel macugo

    Buenas.
    Primero que nada felicitarte por la currada que te has pegado con este blog.
    Y ahora la consulta.Compre un nema 23 para un proyecto con su arduino uno R3, su shield y un driver DVR8825. Trato de ajustar el driver como tu bien explicas pero no consigo que se mueva el dichoso motor. Hace un ruidito cada segundo mas o menos y ahi se queda. Le he metido 0.7 V al driver.
    Gracias

    • luisllamas

      ¿A que te refieres con que les has metido 0.7V? (¿te refieres al valor del potenciómetro? ¿has ajustado el regulador con un amperímetro?)
      ¿Tu nema que valores nominales de tensión e intensidad máxima tiene? ¿Que tensión alimentación le has puesto? ¿Has medido la intensidad que está atravesando el motor?

      • manuel macugo

        Primero gracias por responder, y ahora te contesto por orden tus preguntas.

        1º y 2º Me refiero a que es el valor que me da poniendo el positivo del polimetro en el potenciometro y el negativo en GND. (por cierto que he puesto mal el dato, son 0,98V)

        3º Si, pero puesto en Voltios y ajustando el potenciometro hasta que me dio esos 0,98 V.

        4º Tension nominal por fase de 3,2V y de 2,8A

        5º Tengo el shield alimentado por una bateria de plomo 12 Voltios y 7 Amperios de capacidad. (como las de las motos)

        6º Lo he intentado pero no consigo un valor estable ni que se asemeje a lo que deberia de dar

        • luisllamas

          ¿Has mantenido en todo momento la precaución de no desconectar el motor mientras está el montaje encendido? (incluido durante la medición con el amperímetro)
          Si no, es posible que hayas dañado el driver (porque por el resto de cosas que cuentas, debería funcionarte, el resto parece que está bien)

          • manuel macugo

            No entiendo bien tu ultima contestacion. Pero si te refieres a lo de manipular el montaje mientras este tenia tension, ya te digo que no (lo pones muy clarito en tu expicacion). Apago todo, tanto la alimentacion del driver, como el arduino. En el codigo que tu pones de ejemplo, yo solo cambio el pin de direccion (5) y el de pulso (2).
            Un saludo y gracias por contestar

          • luisllamas

            Sí, me refería a eso, a manipular en tensión (si tienes un amperimetro midiendo la intensidad de fase del motor, puede ser que se suelte, y eso es como desconectar el motor, y el driver tiende a petar, lo digo por triste experiencia jaja)
            Es que realmente, no tengo muchas más ideas, si has respetado eso, y el cableado, no debería fallar. Yo he montado varios, y ningún problema.
            Cosas que se me ocurren
            – Driver roto, que por lo que has dicho pensemos que no
            – El motor que estás usando necesita más tensión de 12V para funcionar. Por lo que dices tienes un Nema 23 de 3.2V, 2.8A, algo similar a este https://www.pololu.com/file/download/SY57STH76-2804A.pdf?file_id=0J629, que en el Datasheet ponen alimentado a 30V. Igual con 12V no tiene par suficiente para moverse, puede ser
            – La batería no da suficiente intensidad. Dices que tiene 7A, pero seguramente serán 7Ah (capacidad) no 7A. En cualquier caso, una batería así debería dar mucho más de 7A como máximo, y desde luego más de los 5.6A que consume tu motor. ¿Podría ser que la batería no esté descargando correctamente? Por eso quería medir el consumo del motor directamente.

            Sin saber más sobre el tipo de motor, y asumiendo que el driver este bien, diría que lo más probable es que necesites más de 12V para mover ese motor. Mira a ver el modelo y consultar el Datasheet, a ver que dice.

  • Pingback: Manejar un motor stepper con un driver DRV8825 y Arduino | Carlini's Blog()

  • Pingback: Manejar un motor stepper con un driver A4988 y Arduino | Carlini's Blog()

  • mundomorro

    Crees que tenga problemas con un motor NEMA 23 de 2.3 A , con el DRV8825 ?

  • luisllamas

    50 000 micro segundos?? Eso es muchisima espera para un Nema17 + A4988. Has comprobado que está correctamente alimentado, y has calibrado bien el regulador de intensidad?

  • Pingback: Motores Arduino | Aprendiendo Arduino()

  • luisllamas

    Tienes que realizar el proceso de calibrado de la intensidad. Tu motor tiene una intensidad nominal de 1.7A.
    No dices cuál es la Rs de tu A4988, pero con 0,5V tienes entre 1.25V y 0,3V.
    Estas por debajo de la intensidad nominal, y por eso el motor no va todo lo rápido que podría ir.

  • Luis Alvarez

    Hola Luis,en primer lugar me gustaría darte las gracias por compartir tus conocimientos. Como dice Juan lo explicas todo super claro.
    Ahora mi duda. Estoy utilizando el código que has puesto de ejemplo para intentar mover un nema 17 con una ramps 1.4 cambio los valores de :

    const int dirPin = 48;
    const int stepPin = 46;
    ya que utilizo el zocalo Z y según la documentación de la ramps estos son los pines que utiliza.
    El motor no hace nada (movimiento, ruido ….). Mi pregunta es, ¿Debería de funcionar? o al utilizar un escudo como ramps hay que programar alguna otra cosa. Yo creo que la ramps lo que me da es hecho el esquema de montaje con el condesador, swich para los micropasos etc.. y por lo tanto debería de funcionar. ¿Esto es así o estoy equivocado??.
    Gracias
    Luis

    • luisllamas

      Bueno, lo primero decir que ahora mismo no tengo una Ramps, así que respondo “a ojo” 😀

      Según entiendo, tienes razón. El Ramps no es más que un shield para conectar fácilmente los componentes de la impresora, en particular los drivers de los paso a paso. Así que sí, el código de esta entrada debería funcionar.

      Mirando en el esquema de la ramps, los drivers de los steppers tienen la entrada Enable (negada) conectada a Vcc a través de una resistencia de Pull-up. En el eje Z, el pin correspondiente es el A8.
      https://uploads.disquscdn.com/images/b44ad5bd52d2ddd618f659342674388b2dcaf17b1eac55214c5ca8851a90e6e8.png

      Es decir, prueba a definir el pin A8 del Mega (supongo que estás usando ramps + mega) como salida digital, y ponlo a Low.

      Si eres tan amable, cuéntame si te ha funcionado, que me pica la curiosidad. Un saludo!

  • luisllamas

    Gracias a ti!

  • luisllamas

    No, puedes cambiarlo sin hacer reset. De hecho, el pin de dirección y el de step, actúan en la electrónica del módulo controla los puentes H, pero están “muy alejados” de la parte que controla la potencia. A efectos prácticos, tiene la misma influencia dar un paso en un sentido o en otro.

    Las únicas consideraciones realmente que hay que tener en cuenta para no dañar el módulo son:
    – Nunca cambiar una conexión (mover cables) mientras esté alimentado.
    – Añadir un condensador de >47uF para absorber picos de corriente.
    – Poner las tierras en común.

  • luisllamas

    Hombre… son de 2.1A nominal y el A4988 da un máximo de 2A. Eso no es casi nada de diferencia. El A4988 limitará la intensidad a sus 2A máximos (que es lo que hacen estos drivers, limitar la corriente) y no deberías notar prácticamente diferencia en el stepper.
    Eso sí, metele un disipador bien gordo y si es posible un ventiladorcete no le iría mal, porque trabajando a 2A se van a poner calentitos calentitos.

  • juan C

    hola, gracias por el post, una pregunta si tengo un motor nema 17 1.4 A y mi fuente para motor es de 12v 6 A, es posible conectar al pololu ?

  • luisllamas

    Pues sin más información, no lo puedo saber. Toma mediciones en salida y entrada, o prueba con otro driver u otro motor