Cómo controlar un motor paso a paso con Arduino
Guía para controlar motor paso a paso con Arduino o ESP32: drivers, alimentación, cableado y código probado para lograr movimientos precisos y fiables.
Un motor paso a paso no se conecta directamente a un pin de Arduino, ESP32 ni a la salida de 5 V de una placa. Para controlar motor paso a paso de forma fiable hay que elegir el driver correcto, limitar la corriente y usar una fuente capaz de sostener la carga. Saltarse uno de esos pasos suele acabar en vibraciones, pérdida de posiciones o un driver muy caliente.
La ventaja de este tipo de motor es clara: avanza en incrementos definidos. Eso permite construir una corredera, un dosificador, una cámara motorizada, un selector, un pequeño CNC o un mecanismo de impresión 3D sin montar un encoder desde el primer prototipo. La precisión real, eso sí, depende de que el motor no pierda pasos y de que la mecánica esté bien resuelta.
Antes de controlar un motor paso a paso, identifica cuál tienes
No todos los motores paso a paso se manejan igual. El modelo compacto 28BYJ-48, normalmente acompañado por una placa ULN2003, es un motor unipolar pensado para proyectos ligeros. Va bien para aprender secuencias, mover una aguja, una compuerta pequeña o una plataforma de poco peso. Su par es limitado y no es la mejor elección para empujar un eje con rozamiento importante.
Los motores tipo NEMA 17 son otra categoría. Suelen ser bipolares, tienen cuatro cables y necesitan un driver con control de corriente, como A4988, DRV8825 o TMC2209. Son habituales en impresoras 3D, cortadoras, ejes lineales y aplicaciones donde el par importa de verdad. El nombre NEMA describe principalmente el tamaño de la brida, no garantiza el par, la corriente ni la longitud del cuerpo.
Antes de comprar o cablear, revisa tres datos: número de cables, corriente nominal por fase y resistencia o disposición de las bobinas. Con un motor bipolar de cuatro cables, hay que localizar las dos parejas de bobinas. Un multímetro en modo resistencia ayuda: dos cables que muestran una resistencia baja pertenecen a la misma bobina. No conectes los cables al azar a un driver de potencia.
Unipolar y bipolar: el driver no es intercambiable
El ULN2003 conmuta las cuatro fases del 28BYJ-48, pero no sustituye a un A4988. El A4988 y el DRV8825 son controladores de corriente para motores bipolares y trabajan con señales STEP y DIR. Cada pulso recibido en STEP ordena un avance y DIR decide el sentido.
Esta diferencia simplifica mucho el programa. Con un driver STEP/DIR no necesitas enviar una secuencia de cuatro bobinas desde el microcontrolador. A cambio, debes ajustar correctamente el límite de corriente del driver. Es el punto que más se omite en montajes rápidos y uno de los que más drivers destruye.
Alimentación: donde empiezan la mayoría de fallos
La corriente del motor no debe pasar por el regulador de la placa Arduino ni por el puerto USB. Aunque el motor indique 5 V, sus picos de consumo y el ruido eléctrico pueden reiniciar la placa o dañar el ordenador. Usa una fuente externa dimensionada para el motor y el driver.
En un NEMA 17 con A4988 o DRV8825, la tensión de la fuente puede ser bastante mayor que la tensión nominal que aparece en la etiqueta del motor. Esto es normal: el driver regula la corriente en las bobinas mediante conmutación. Una fuente de 12 V es común en montajes pequeños, siempre que el driver admita esa tensión y el límite de corriente esté configurado según la ficha del motor.
En cambio, con un 28BYJ-48 de 5 V y su ULN2003, utiliza una fuente de 5 V estable para el motor. Si alimentas Arduino por USB y el motor por fuente externa, une las masas: GND de la fuente, GND del driver y GND del microcontrolador deben compartir referencia. Sin esa masa común, las señales de control pueden ser erráticas.
Coloca un condensador electrolítico cerca de la entrada de alimentación del driver de potencia, siguiendo el valor recomendado por su fabricante. En módulos A4988 y DRV8825 se suele usar para absorber picos generados por las bobinas. Conectar o desconectar el motor mientras el driver está alimentado es mala práctica: puede provocar una sobretensión y averiar el módulo.
Conexión básica de un NEMA 17 con A4988
Para un montaje con Arduino, conecta VMOT y GND de potencia a la fuente del motor. Conecta VDD y GND lógico al Arduino, respetando el voltaje que admita el módulo. En muchos A4988, la lógica funciona a 3,3 V o 5 V; aun así, comprueba la versión concreta de tu placa antes de cablear.
Las dos bobinas del motor van a las salidas 1A, 1B, 2A y 2B. Los pines STEP y DIR van a dos GPIO digitales. Para una prueba inicial, une RESET y SLEEP y llévalos a nivel alto. Los pines de microstepping pueden quedar sin conectar o configurarse según la tabla del driver. Empieza en paso completo: es más fácil detectar una bobina mal conectada o un límite de corriente incorrecto.
Ajusta el potenciómetro de referencia de corriente con un destornillador adecuado y siguiendo la fórmula indicada para tu driver y su resistencia de sensado. No hay un valor universal válido para todos los módulos, aunque se llamen igual. Algunos clones cambian la resistencia de sensado y, por tanto, la relación entre Vref y corriente. Mide, consulta la documentación del módulo y comienza por debajo de la corriente nominal del motor.
Código mínimo con STEP y DIR
Este ejemplo mueve un motor bipolar con un driver compatible con señales STEP/DIR. No usa librerías, por lo que sirve para comprobar primero cableado, sentido y velocidad. En Arduino, los pines 2 y 3 son una elección cómoda para la prueba.
```cpp const byte STEP_PIN = 2; const byte DIR_PIN = 3; const int pasosPorVuelta = 200;
void mover(int pasos, bool sentido) { digitalWrite(DIR_PIN, sentido);
for (int i = 0; i < pasos; i++) { digitalWrite(STEP_PIN, HIGH); delayMicroseconds(800); digitalWrite(STEP_PIN, LOW); delayMicroseconds(800); } }
void setup() { pinMode(STEP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT); }
void loop() { mover(pasosPorVuelta, HIGH); delay(500); mover(pasosPorVuelta, LOW); delay(500); } ```
Un motor de 1,8 grados necesita normalmente 200 pasos completos por vuelta. Si activas microstepping a 1/16, necesitarás 3.200 pulsos para una vuelta teórica. Esa resolución adicional mejora la suavidad, pero no multiplica por dieciséis la precisión mecánica: la elasticidad de correas, holguras, carga y fricción siguen estando ahí.
El valor de `delayMicroseconds(800)` define una velocidad prudente para empezar. Si lo reduces demasiado, el motor puede zumbar sin girar o perder pasos. No significa necesariamente que el código esté mal: puede que la carga tenga demasiada inercia, falte corriente o necesites acelerar progresivamente.
Velocidad, par y aceleración: el compromiso real
Un paso a paso ofrece más par a baja velocidad que a alta velocidad. Al aumentar la frecuencia de pulsos, la corriente de las bobinas tiene menos tiempo para establecerse y el par disponible cae. Por eso un eje que gira perfecto en vacío puede bloquearse al montar una polea, una varilla roscada o una carga real.
La solución no suele ser subir la corriente sin más. Primero reduce la velocidad máxima, revisa que el mecanismo se mueva libremente y añade aceleración gradual. Para proyectos con trayectorias y velocidades variables, una librería de aceleración es preferible a generar pulsos con `delay()`. En ESP32 también conviene usar temporizadores o periféricos de generación de pulsos cuando el proyecto debe atender sensores, Wi-Fi o una pantalla al mismo tiempo.
Si el motor se calienta, diferencia entre temperatura y avería. Un motor paso a paso puede trabajar caliente, pero no debería oler a barniz quemado, perder par al poco tiempo ni ser imposible de tocar durante una comprobación breve. Baja el límite de corriente si el par disponible ya es suficiente. Mantener el motor energizado cuando está parado da fuerza de sujeción, pero consume y calienta; en algunos mecanismos conviene desactivar el driver al terminar el movimiento.
Errores que conviene detectar antes de culpar al código
Un motor que solo vibra suele tener una pareja de bobinas mal identificada, una secuencia incorrecta o una velocidad inicial excesiva. Si gira en sentido contrario, invierte DIR en el código o intercambia los cables de una bobina, pero no hagas ambas cosas a la vez si quieres saber qué has corregido.
Los reinicios de Arduino al mover el motor apuntan casi siempre a la alimentación: fuente insuficiente, masa sin compartir, cables demasiado largos o motor alimentado desde la placa. Un driver que se quema o se protege puede tener el límite de corriente mal ajustado, ventilación insuficiente o una conexión realizada con tensión aplicada.
También hay un error de planteamiento frecuente: asumir que cada orden llega a una posición exacta sin referencia inicial. Si el proyecto necesita repetir una posición después de apagarlo o tras un atasco, añade un final de carrera, un sensor óptico o una rutina de homing. El motor cuenta pasos, pero no sabe por sí mismo dónde está.
Empieza con el motor en vacío, una fuente correcta y una velocidad lenta. Cuando ese movimiento sea repetible, añade carga, microstepping y aceleración uno por uno. Es menos espectacular que conectar todo de golpe, pero es la forma de obtener un mecanismo que siga funcionando cuando deje de estar sobre la mesa de pruebas.