Los motores paso a paso son una parte fundamental en el mundo de la electrónica y la robótica, y cuando se combinan con Arduino se abren un sinfín de posibilidades. En esta guía definitiva, te enseñaremos todo lo que necesitas saber sobre cómo utilizar motores paso a paso con Arduino. Desde los conceptos básicos hasta proyectos avanzados, ¡prepárate para sumergirte en el fascinante mundo de la programación y la automatización!
En este tutorial aprenderemos todo lo que necesitamos saber sobre el control de motores paso a paso con Arduino. Cubrimos el control de un motor paso a paso NEMA17 en combinación con un controlador de motor paso a paso A4988, un DRV8825 y un TMC2208.
Esta combinación de motores paso a paso y controladores se utiliza en innumerables aplicaciones donde se requiere control de posición, como impresoras 3D, máquinas CNC, robots, máquinas de automatización, etc.
Ya lo he usado yo mismo en muchos de mis proyectos Arduino, como los siguientes:
- Control deslizante de cámara de bricolaje
- Máquina dobladora de alambre 3D
- Máquina cortadora de espuma de bricolaje
- Grabador láser de bricolaje
- Plotter de pluma con cambiador automático de pluma
- brazo robótico SCARA
Explico en detalle cómo funcionan, cómo conectar motores paso a paso a Arduino, cómo establecer el límite de corriente de los controladores y cómo programarlos con o sin biblioteca Arduino. Además, le mostraré cómo podemos controlar fácilmente múltiples motores paso a paso usando un escudo Arduino CNC para cualquier tipo de proyecto Arduino.
Así que tenemos mucho que cubrir en este tutorial. Puede ver el vídeo a continuación o leer el tutorial escrito a continuación, que también incluye todos los códigos de ejemplo y esquemas.
¿Qué es un motor paso a paso y cómo funciona?
Primero explicaré brevemente qué es un motor paso a paso y cómo funciona, ya que esto nos ayudará a comprender mejor todo lo demás en este tutorial.
Un>
El principio de funcionamiento de un motor paso a paso se basa en campos magnéticos. Consta de dos componentes principales: un estator y un rotor. El rotor suele ser un imán permanente y está rodeado por algunas bobinas en el estator.
Cuando>
Por>
Al aumentar el número de polos magnéticos del rotor, podemos aumentar el número de posibles posiciones de parada, mejorando así la resolución o precisión del motor. Tenga en cuenta que esto es sólo una explicación básica. Para obtener más detalles, consulte mi tutorial Cómo funcionan los motores paso a paso.
Un motor paso a paso típico, como un NEMA17, tiene 50 puntos de interrupción o pasos en el rotor. El estator, por otro lado, puede tener múltiples bobinas dispuestas en dos fases, proporcionando cuatro orientaciones o posiciones diferentes del campo magnético.
Entonces,>
Mencioné que las bobinas del estator están dispuestas en dos fases y también podemos saberlo observando la cantidad de cables en un motor paso a paso. Tiene cuatro cables, dos para cada fase. Las cuatro orientaciones diferentes del campo magnético son posibles porque podemos permitir que la corriente fluya a través de las fases en ambas direcciones.
Aunque>
El>
Después de esta breve explicación, ahora nos damos cuenta de que para accionar un motor paso a paso no podemos simplemente conectar la alimentación, de lo contrario no sucederá nada. En cambio, necesitamos alimentar las dos fases del motor en ambas direcciones y activarlas o enviarles pulsos en un orden y sincronización específicos. Por eso necesitamos controladores para controlar los motores paso a paso.
Hay muchos tipos y tamaños de controladores que corresponden a los distintos tipos y tamaños de motores paso a paso. Sin embargo, el principio de funcionamiento básico de todos los controladores es que cuentan con dos puentes en H que permiten suministrar energía a las fases del motor en ambas direcciones.
Por>
Cómo controlar el motor paso a paso NEMA17 con Arduino y el controlador de motor paso a paso A4988
Bien, ahora podemos ver el primer ejemplo de este tutorial, cómo controlar un motor paso a paso NEMA 17 con un controlador de motor paso a paso A4988.
Bien, ahora podemos ver el primer ejemplo de este tutorial, cómo controlar un motor paso a paso NEMA 17 con un motor paso a paso A4988.
El>
Generalmente, el motor paso a paso NEMA17 tiene 200 pasos o una resolución de 1,8 grados por paso, pero también existen modelos con 400 pasos y una resolución de 0,9 grados por paso. Debemos tener en cuenta aquí que la designación NEMA17 en realidad solo describe el tamaño del motor en relación con el tamaño del panel frontal.
El>
Por lo tanto, el tamaño del panel frontal es fijo, pero la longitud de los motores paso a paso NEMA17 puede variar entre 20 y 60 mm, por lo que el requisito de potencia del motor también varía. Los requisitos de energía generalmente se definen por la cantidad de corriente que el motor puede consumir, y el rango para estos motores paso a paso NEMA17 es de 0,3 A a 2,5 A.
Ahora,>
El>
Una gran característica del controlador de motor paso a paso A4988 que en realidad tienen todos los demás controladores es la limitación de corriente. Esto nos permite ajustar fácilmente cuánta corriente consumirá el motor independientemente de la potencia del motor. Por ejemplo, incluso podemos conectar un motor paso a paso de 2,5 A, pero limitamos la corriente del controlador a 1,5 A, por lo que incluso si el motor no está funcionando a su máxima capacidad, aún podemos usarlo.
Por otro lado, si la corriente nominal del motor es menor que el límite de corriente establecido por el controlador, el motor se sobrecalentaría. Por supuesto, siempre se recomienda hacer coincidir la clasificación actual del motor con la clasificación actual del conductor.
Conexión A4988 y Arduino
Bien, ahora veamos cómo conectar el controlador A4988 al motor paso a paso y al controlador Arduino.
Puede>
- Motor paso a paso NEMA 17…………………… Amazonas / Banggood / AliExpress
- Controlador de motor paso a paso A4988……………………..… Amazonas / Banggood / AliExpress
- Controlador de motor paso a paso DRV8825………….……..… Amazonas / Banggood / AliExpress
- Controlador de motor paso a paso TMC2208…………………… Amazonas / Banggood / AliExpress
- Escudo CNC Arduino…………………………. Amazonas / Banggood / AliExpress
- ArduinoUno…………………………………………..… Amazonas / Banggood / AliExpress
Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.
En la esquina superior derecha del controlador están los pines VMOT y GND. Aquí conectamos la fuente de alimentación del motor, que puede estar entre 8 y 36 V. También se recomienda utilizar un condensador de desacoplamiento entre estos dos pines para proteger la placa de picos de voltaje. Deberíamos utilizar un condensador electrolítico grande con al menos 47uF de capacidad.
Luego vienen los cuatro pines a los que conectamos el motor paso a paso. Una fase del motor va a los pines 1A y 1B y la otra fase va a los pines 2A y 2B.
A veces puede resultar un poco complicado identificar qué dos cables del motor forman una fase, pero existen varias formas de identificarlos. La forma más sencilla es girar el eje del motor paso a paso con la mano y luego conectar dos cables. Si conectas dos cables que forman una fase, girar el eje sería un poco más difícil.
Otra>
Una>
A continuación tenemos los pines VDD y GND del IC o fuente de alimentación lógica que pueden estar entre 3V y 5V. Por otro lado, tenemos los pines de paso y dirección, que se pueden conectar a cualquier pin de la placa Arduino. Con el pin de dirección seleccionamos el sentido de giro del motor y con el pin de paso controlamos los pasos del motor. Con cada pulso que enviamos al pin de paso, el motor avanza un paso en la dirección seleccionada.
Directamente encima de estos pines están los pines de suspensión y reinicio, que, como sugieren sus nombres, se utilizan para poner el controlador en suspensión o reiniciar. Debemos tener en cuenta que ambos pines están activamente bajos. El pin de suspensión está en estado ALTO de forma predeterminada, pero el pin RST está flotando. Esto significa que es más fácil conectar estos dos pines juntos para activar el controlador, suponiendo que no estemos usando estas funciones de pin.
El pin Habilitar también está activo en nivel bajo, lo que significa que si no lo colocamos en ALTO, el controlador está habilitado.
Los siguientes tres pines, MS1, MS2 y MS3, se utilizan para seleccionar la resolución de paso del motor. Ya hemos dicho que la resolución de pasos depende del diseño del motor y para un motor paso a paso NEMA 17 suele ser de 200 pasos por revolución. Sin embargo, todos los controladores de motores paso a paso tienen esta característica llamada micropasos, que permite que el motor funcione con una resolución más alta. Esto se logra energizando las bobinas con un nivel de corriente medio, creando posiciones de paso intermedias.
Por>
El controlador A4988 tiene una resolución máxima de 16 micropasos, lo que significa que un motor NEMA17 de 200 pasos tiene 3200 pasos por revolución o 0,1125 grados por paso. Esta es una precisión realmente impresionante y es la razón por la que este tipo de motores y controladores paso a paso se utilizan en tantas aplicaciones. De hecho, hay controladores de motores paso a paso con hasta 256 micropasos, la friolera de 51200 pasos por revolución o 0,007 grados por paso.
Sin embargo, estos tres pines tienen resistencias pull-down, por lo que si los dejamos separados el driver funcionará en modo paso completo. Para seleccionar una resolución de micropasos diferente, necesitamos conectar 5V a los pines correspondientes según esta tabla.
A4988 Límite de corriente
Bueno, ahora que sabemos cómo conectar el motor paso a paso y el controlador a la placa Arduino, podemos pasar a explicar cómo programar o codificar el Arduino para controlar el motor paso a paso. Pero antes de hacer eso o alimentar el motor, necesitamos hacer una cosa más muy importante y es ajustar el límite de corriente del controlador.
Como se explicó anteriormente, debemos configurar el límite de corriente del controlador para que sea inferior a la corriente nominal del motor; de lo contrario, el motor se sobrecalentaría.
Hay>
El primer método implica medir el voltaje de referencia entre el potenciómetro y GND. Podemos medir el voltaje de referencia con un multímetro y usar este valor en la siguiente fórmula para calcular el límite de corriente del controlador:
Limitación de corriente = Vref / (8 x Rcs)
Rcs es la resistencia de medición de corriente o el valor de las resistencias de medición de corriente que se encuentran directamente al lado del chip. Dependiendo del fabricante, estos valores suelen ser 0,05, 0,1 o 0,2 ohmios. Por lo tanto, debemos observar más de cerca el valor de estas resistencias para poder calcular con precisión el límite de corriente usando este método. En mi caso, estas resistencias estaban etiquetadas como R100, lo que significaba 0,1 ohmios.
Por>
El segundo método para establecer el límite de corriente es medir directamente la corriente a través de las bobinas. Para ello necesitamos conectar el motor paso a paso y el controlador como se explicó anteriormente. Podemos omitir la conexión del controlador, pero en su lugar conectar 5 V a los pines de dirección y paso para que el motor permanezca activo y mantenga una posición. Los pines MS deben permanecer desconectados para que el controlador funcione en modo de paso completo. Luego podemos desconectar un cable o bobina del motor y conectarlo en serie con un amperímetro. De esta manera, una vez que suministramos al controlador tanto el voltaje lógico (5V) como la potencia para el motor (12V en mi caso), podemos leer cuánta corriente fluye a través de la bobina.
Sin>
Probé ambos métodos para configurar la limitación de corriente del controlador y me dieron aproximadamente los mismos resultados.
Motores paso a paso y Arduino: códigos de ejemplo
Sin embargo, ahora podemos pasar a programar el Arduino o ver algunos códigos de muestra para controlar un motor paso a paso con una placa Arduino.
Comencemos>
Código de ejemplo 1
/*
* Basic example code for controlling a stepper without library
*
* by Dejan, https://howtomechatronics.com
*/
// defines pins
#define stepPin 2
#define dirPin 5
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
}
void loop() {
digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
// Makes 200 pulses for making one full cycle rotation
for(int x = 0; x < 800; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(700); // by changing this time delay between the steps we can change the rotation speed
digitalWrite(stepPin,LOW);
delayMicroseconds(700);
}
delay(1000); // One second delay
digitalWrite(dirPin,LOW); //Changes the rotations direction
// Makes 400 pulses for making two full cycle rotation
for(int x = 0; x < 1600; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
delay(1000);
}
Code language: Arduino (arduino)
Descripción del código:
Aquí sólo necesitamos establecer a qué número de pin están conectados los pines STEP y DIR y definirlos como salidas. En el bucle, primero configuramos la dirección de rotación del motor configurando el estado del pin de dirección en ALTO. Luego, usando un bucle «for», enviamos 200 pulsos al pin STEP, lo que hace que el motor gire un ciclo completo, suponiendo que esté funcionando en modo de paso completo. Los pulsos se generan simplemente cambiando el estado del pin STEP de ALTO a BAJO con un cierto retraso de tiempo. Este retardo de tiempo define en realidad la velocidad de rotación. Si la reducimos, la velocidad de rotación aumentará porque los pasos serán más rápidos, y viceversa.
Luego cambiamos la dirección de rotación y, usando otro bucle «for», enviamos 400 pulsos que hacen girar el motor durante dos ciclos completos. Sin embargo, si cambiamos el modo de micropasos del controlador, digamos aproximadamente un cuarto de paso, lo que ahora haría que el motor dé 800 pasos, el motor solo girará 90 grados en el primer bucle y solo media vuelta en el segundo bucle.
Código de ejemplo 2
Aquí hay otro ejemplo simple: controlar la velocidad del motor paso a paso usando un potenciómetro.
Todo>
/*
Basic example code for controlling a stepper without library
by Dejan, https://howtomechatronics.com
*/
// defines pins
#define stepPin 2
#define dirPin 5
int customDelay, customDelayMapped;
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
speedControl();
// Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends
digitalWrite(stepPin, HIGH);
delayMicroseconds(customDelayMapped);
digitalWrite(stepPin, LOW);
delayMicroseconds(customDelayMapped);
}
// Custom function for reading the potentiometer and mapping its value from 300 to 3000, suitable for the custom delay value in microseconds
void speedControl() {
customDelay = analogRead(A0); // Read the potentiometer value
customDelayMapped = map(customDelay, 0, 1023, 300, 3000); // Convert the analog input from 0 to 1024, to 300 to 3000
}
Code language: Arduino (arduino)
Descripción del código:
Luego podemos convertir los valores del potenciómetro de 0 a 1023 en valores adecuados como tiempo de retardo en microsegundos para los pulsos de paso. Descubrí que el valor mínimo para el retraso entre pasos es de alrededor de 300 microsegundos. A un valor más bajo, el motor paso a paso comenzó a saltar pasos.
En general, controlar motores paso a paso usando este método es fácil y funciona, pero sólo si el control requerido es tan simple como se muestra en los ejemplos. En caso de que necesitemos un control más complejo, el mejor método es utilizar una biblioteca Arduino.
Control de motores paso a paso con Arduino y la biblioteca AccelStepper – ejemplos
La biblioteca más popular para controlar motores paso a paso con Arduino es la Biblioteca AccelStepper de Mike McCauley. Es una biblioteca extremadamente versátil con control de velocidad, aceleración y desaceleración, establecimiento de posiciones objetivo, control de múltiples motores paso a paso simultáneamente, etc.
La biblioteca tiene documentación detallada que explica cómo funciona cada función. Ya he usado esta biblioteca para varios de mis proyectos Arduino para controlar el movimiento del control deslizante de mi cámara de bricolaje, mi doblador de cables 3D, mi brazo robótico SCARA y algunos otros. Si está interesado, puede encontrar detalles y explicaciones del código para cada proyecto en el sitio web.
Ahora veamos algunos códigos de muestra que usan esta biblioteca.
Código de ejemplo: control de velocidad de un motor paso a paso mediante un potenciómetro
En el primer ejemplo, la velocidad del motor se controla mediante un potenciómetro.
/*
* Basic example code for controlling a stepper with the AccelStepper library
*
* by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Type of driver: with 2 pins, STEP, DIR)
void setup() {
// Set maximum speed value for the stepper
stepper1.setMaxSpeed(1000);
}
void loop() {
stepper1.setSpeed((analogRead(A0));
// Step the motor with a constant speed previously set by setSpeed();
stepper1.runSpeed();
}
Code language: Arduino (arduino)
Descripción del código:
Entonces aquí primero debemos incluir la biblioteca AccelStepper. Por supuesto, primero tenemos que instalar la biblioteca. Esto lo podemos hacer a través del administrador de bibliotecas del IDE de Arduino. Solo debemos buscar “AccelStepper” luego aparecerá la biblioteca y podremos instalarla.
Luego necesitamos crear una instancia de la clase AccelStepper para nuestro motor. El primer parámetro aquí es el tipo de controlador, en este caso para un controlador con dos pines de control este valor es 1, y los otros dos parámetros son los números de pin con los que está conectado nuestro controlador al Arduino. Si tenemos varios motores paso a paso, debemos definir cada uno de ellos de esta manera y podemos nombrarlos como queramos, en este caso llamé a mi motor Stepper1.
En el apartado de configuración sólo necesitamos establecer la velocidad máxima del motor, que se define en pasos por segundo. Este valor puede ser hasta 4000, pero la documentación de la biblioteca indica que los valores de velocidad superiores a 1000 pasos por segundo pueden no ser confiables.
En la sección de bucle, configuramos la velocidad actual del motor usando la función setSpeed(). En este caso esta es la entrada analógica del potenciómetro, que está entre 0 y 1023.
Para que el motor se mueva y alcance esta velocidad constante, necesitamos llamar a la función runSpeed() en cada intervalo. Un valor negativo aquí o simplemente un signo menos delante del valor haría que el motor paso a paso gire en la dirección opuesta.
Código de ejemplo: control de dos motores paso a paso con aceleración y desaceleración
Aquí>
/*
Controlling two stepper with the AccelStepper library
by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Typeof driver: with 2 pins, STEP, DIR)
AccelStepper stepper2(1, 3, 6);
void setup() {
stepper1.setMaxSpeed(1000); // Set maximum speed value for the stepper
stepper1.setAcceleration(500); // Set acceleration value for the stepper
stepper1.setCurrentPosition(0); // Set the current position to 0 steps
stepper2.setMaxSpeed(1000);
stepper2.setAcceleration(500);
stepper2.setCurrentPosition(0);
}
void loop() {
stepper1.moveTo(800); // Set desired move: 800 steps (in quater-step resolution that's one rotation)
stepper1.runToPosition(); // Moves the motor to target position w/ acceleration/ deceleration and it blocks until is in position
stepper2.moveTo(1600);
stepper2.runToPosition();
// Move back to position 0, using run() which is non-blocking - both motors will move at the same time
stepper1.moveTo(0);
stepper2.moveTo(0);
while (stepper1.currentPosition() != 0 || stepper2.currentPosition() != 0) {
stepper1.run(); // Move or step the motor implementing accelerations and decelerations to achieve the target position. Non-blocking function
stepper2.run();
//
//
}
}
Code language: Arduino (arduino)
Descripción del código:
Entonces necesitamos definir los dos motores paso a paso y establecer el valor de aceleración para los motores en la configuración usando la función setAcceleration(). Usando la función setCurrentPosition(), configuramos la posición de los motores en 0 pasos.
En la sección de bucle comenzamos con la función moveTo(), con la que le indicamos al motor a qué posición ir o cuántos pasos dar. Con una resolución de un cuarto de paso, 800 pasos significarían una revolución completa. La función runToPosition() luego mueve el motor a esta posición, implementando aceleración y desaceleración. Sin embargo, esta es una función de bloqueo, por lo que la ejecución del código permanece allí hasta que el motor paso a paso alcance esta posición.
Usando el mismo método, movemos el segundo motor 1600 pasos o dos revoluciones completas con una resolución de un cuarto de paso.
Si no queremos que nuestro código se bloquee hasta que el motor alcance la posición objetivo, debemos usar la función run() en lugar de la función runToPosition(). La función run() también implementa aceleración y desaceleración para alcanzar la posición objetivo, pero solo toma un paso por llamada. Por lo tanto, debemos llamarlos con la mayor frecuencia posible. Por esta razón, aquí colocamos las funciones run() para ambos motores en este bucle while, que se ejecuta hasta que ambos motores paso a paso alcanzan la posición 0. Anteriormente configuramos los dos motores para que vayan a la posición 0 usando las funciones moveTo().
También podríamos agregar más código a este bucle » while » y hacer otras cosas además de ejecutar el motor. De hecho, existen muchos métodos para hacer funcionar los motores y hacer otras cosas. Recomiendo consultar la documentación bien descrita de la biblioteca para que comprenda cómo funciona cada función y pueda implementarla según sus necesidades.
Código de muestra: control de múltiples motores paso a paso utilizando la biblioteca AccelStepper
Me gustaría mostrarles otro ejemplo utilizando la biblioteca AccelStepper, en el que se controlan varios motores paso a paso de forma coordinada. Esto significa que podemos establecer posiciones objetivo para cada motor paso a paso y todos pueden alcanzar sus posiciones al mismo tiempo, independientemente de la diferente distancia que deban recorrer.
Esto>
/*
Controlling multiple steppers with the AccelStepper and MultiStepper library
by Dejan, https://howtomechatronics.com
*/
#include <AccelStepper.h>
#include <MultiStepper.h>
// Define the stepper motor and the pins that is connected to
AccelStepper stepper1(1, 2, 5); // (Typeof driver: with 2 pins, STEP, DIR)
AccelStepper stepper2(1, 3, 6);
AccelStepper stepper3(1, 4, 7);
MultiStepper steppersControl; // Create instance of MultiStepper
long gotoposition[3]; // An array to store the target positions for each stepper motor
void setup() {
stepper1.setMaxSpeed(1000); // Set maximum speed value for the stepper
stepper2.setMaxSpeed(1000);
stepper3.setMaxSpeed(1000);
// Adding the 3 steppers to the steppersControl instance for multi stepper control
steppersControl.addStepper(stepper1);
steppersControl.addStepper(stepper2);
steppersControl.addStepper(stepper3);
}
void loop() {
// Store the target positions in the "gotopostion" array
gotoposition[0] = 800; // 800 steps - full rotation with quater-step resolution
gotoposition[1] = 1600;
gotoposition[2] = 3200;
steppersControl.moveTo(gotoposition); // Calculates the required speed for all motors
steppersControl.runSpeedToPosition(); // Blocks until all steppers are in position
delay(1000);
gotoposition[0] = 0;
gotoposition[1] = 0;
gotoposition[2] = 0;
steppersControl.moveTo(gotoposition);
steppersControl.runSpeedToPosition();
delay(1000);
}
Code language: Arduino (arduino)
Descripción del código:
Aquí también necesitamos incluir la clase MultiStepper y crear una instancia de la misma. Luego necesitamos definir una matriz de tipo largo que se usará para almacenar las posiciones objetivo de nuestros motores. En la sección de configuración, debemos definir los valores de velocidad máxima de los motores paso a paso y agregar los pasos a la instancia MultiStepper creada previamente, que en mi caso llamé «steppersControl».
En la sección Bucle, primero almacenamos los valores de la posición objetivo en la matriz que creamos anteriormente. Configuré el primer motor paso a paso para que se moviera una revolución, el segundo para que se moviera dos revoluciones y el tercero para que se moviera tres revoluciones. Luego podemos asignar esta matriz a la función moveTo(), que calcula las velocidades requeridas para que todos los motores alcancen estas posiciones al mismo tiempo. Entonces todo lo que tenemos que hacer es llamar a la función runSpeedToPosition(), que mueve los motores a su posición. Sin embargo, debemos tener en cuenta que esta función bloquea el código hasta que los motores paso a paso alcancen su posición objetivo. Podríamos usar la función run() en su lugar si no queremos bloquear el código. También debemos tener en cuenta que la clase MultiStepper no admite aceleración ni desaceleración.
Si aún desea obtener más información con ejemplos más avanzados, puede consultar mis proyectos de Arduino mencionados anteriormente. Todos los detalles y códigos se pueden encontrar en el sitio web.
Escudo CNC para controlar múltiples motores paso a paso para cualquier proyecto Arduino
Dado que todavía estamos hablando de controlar múltiples motores paso a paso, vale la pena mencionar y echar un vistazo al escudo Arduino CNC.
El>
Este escudo se coloca en una placa Arduino UNO y puede controlar hasta 4 motores paso a paso individuales, con todos los pines Arduino restantes disponibles. Utilicé esta combinación de una placa Arduino UNO y el escudo CNC para controlar mi brazo robótico SCARA de 4 ejes.
Pronto actualizaré esta sección del artículo con más detalles sobre el uso de CNC Shield con Arduino.
DRV8825 frente a A4988
Muy bien, ahora sigamos adelante y veamos cómo podemos controlar los motores paso a paso usando el otro controlador que mencioné al principio, el DRV8825.
En realidad, todo lo que hemos explicado hasta ahora sobre el control de motores paso a paso con el controlador de motor paso a paso A4988 también se aplica al DRV8825. El principio de funcionamiento, las conexiones y la codificación son prácticamente iguales para ambos controladores. La diferencia entre ellos radica en sus características técnicas, y ahora los veremos más de cerca y los compararemos.
El>
Por supuesto, también existen otras diferencias menores. Por ejemplo, el potenciómetro de límite de corriente está en una ubicación diferente y la relación entre el ajuste del límite de corriente y el voltaje del pin de referencia es diferente. El DRV8825 no requiere una fuente de alimentación lógica y este pin se utiliza como salida de FALLA.
Sin>
Sin embargo, es importante tener en cuenta que al reemplazar un controlador A4988 por un DRV8825, es importante garantizar la orientación adecuada del controlador. Como ya se mencionó, los potenciómetros están en diferentes ubicaciones, debajo del chip en el A4988 y encima del chip en el DRV8825. Esto a veces puede causar confusión y es fácil colocar al conductor en el lado equivocado.
Para fijar el límite de corriente podemos medir la tensión de referencia con una sonda en GND y la otra en el propio potenciómetro.
La>
Límite de corriente = Vref x 2
Para seleccionar la resolución de micropasos podemos utilizar la siguiente tabla.
En>
Controlador de motor paso a paso TMC2208
Hablando de un funcionamiento más suave y silencioso, echemos un vistazo al controlador del motor paso a paso TMC2208. El chip TMC2208 es fabricado por Trinamic, una empresa con sede en Alemania especializada en electrónica de control de movimiento. El TMC2208 es un controlador de motor paso a paso silencioso que también se puede utilizar como reemplazo directo en sistemas diseñados para los controladores A4988 o DRV8825. Es ampliamente utilizado en impresoras 3D de escritorio, grabadoras láser, escáneres, etc.
Lo>
Esta>
Nivel> A4988 aproximadamente 65 dB, DRV8825 aproximadamente 67 dB y TMC2208 aproximadamente 41 dB.
El TMC2208 acciona los motores paso a paso de forma totalmente silenciosa, lo cual es realmente impresionante.
La clasificación actual del TMC2208 es ligeramente superior a la del controlador A4988, es decir, 1,2 A con una corriente máxima de 2 A. Para establecer el límite actual del controlador, podemos volver a utilizar el mismo método explicado para los demás controladores. Necesitamos medir el voltaje de referencia con una sonda en GND y la otra en toda el área justo al lado del pin de habilitación.
La>
Límite de corriente = Vref x 0,71
Aunque se puede utilizar como reemplazo directo, el controlador TMC2208 tiene una distribución de pines ligeramente diferente a la del controlador A4988. Aquí solo tenemos dos pines para seleccionar la resolución de micropasos y para habilitar el controlador necesitamos conectar el pin de habilitación a GND.
En>
El controlador TMC2208 también tiene algunas otras características avanzadas en comparación con los otros dos controladores, como una interfaz UART fácil de usar que permite controlar el controlador con una sola línea en lugar de los dos pines Step y Dir. También ofrece más opciones de ajuste y control.
En general, el TMC2208 es mejor controlador que el A4988 y el DRV8825, pero eso es normal ya que tiene un precio más alto. Sin embargo, si no necesita estas funciones adicionales y el nivel de ruido no le molesta, los otros dos controladores son una buena opción.
Diploma
Hemos cubierto prácticamente todo lo que necesitamos saber sobre el control de motores paso a paso con Arduino. El NEMA17 y los tres controladores, el A4988, el DRV8825 y el TMC2208, son simplemente increíblemente versátiles y pueden usarse en muchas aplicaciones donde se requiere control de posición. Siempre puedes aprender más explorando algunos de mis proyectos Arduino.
Si quieres aprender a controlar motores paso a paso más grandes como NEMA23 o NEMA34, también tengo un tutorial dedicado a eso.
Espero que hayas disfrutado este tutorial y hayas aprendido algo nuevo. No olvide suscribirse y no dude en hacer sus preguntas en la sección de comentarios a continuación.
En esta guía definitiva, aprenderemos todo lo que necesitamos saber sobre cómo controlar motores paso a paso con Arduino. Cubriremos cómo controlar un motor paso a paso NEMA17 en combinación con un controlador de pasos A4988, un controlador de pasos DRV8825 y un controlador de pasos TMC2208. Esta combinación de motores paso a paso y controladores se utiliza en innumerables aplicaciones donde se necesita control de posición, como impresoras 3D, máquinas CNC, robots, máquinas de automatización, entre otros.
¿Qué es un motor paso a paso y cómo funciona?
Comenzaremos explicando brevemente qué es un motor paso a paso y cómo funciona, ya que nos ayudará a comprender mejor todo lo demás en esta guía. Un motor paso a paso es un tipo único de motor de corriente continua sin escobillas cuya posición puede ser controlada con precisión incluso sin retroalimentación.
El principio de funcionamiento de un motor paso a paso se basa en campos magnéticos. Tiene dos componentes principales, un estátor y un rotor. El rotor suele ser un imán permanente y está rodeado por algunas bobinas en el estátor. Cuando energizamos o dejamos fluir la corriente a través de las bobinas, se generan campos magnéticos particulares en el estátor que atraen o repelen el rotor. Al activar las bobinas paso a paso, una tras otra en un orden particular, podemos lograr un movimiento continuo del rotor, pero también podemos hacer que se detenga en cualquier posición.
Entonces, por eso estos motores se llaman motores paso a paso, se mueven en pasos discretos. Aumentando el número de polos magnéticos en el rotor, podemos aumentar el número de posiciones de parada posibles, y por lo tanto aumentar la resolución o precisión del motor. Un motor paso a paso típico, un NEMA17 por ejemplo, tiene 50 puntos de detención o pasos en el rotor. Por otro lado, el estátor puede tener varias bobinas organizadas en dos fases que proporcionan cuatro orientaciones de campo magnético diferentes o posiciones.
Entonces, los 50 pasos del rotor multiplicados por las 4 diferentes orientaciones de campo magnético, hacen un total de 200 pasos para completar una rotación completa. O si dividimos 360 grados por 200 pasos, eso es una resolución de 1.8 grados por paso. Hay motores paso a paso con 5, 6 o incluso 8 cables, pero aún funcionan en dos fases o se controlan con solo cuatro terminales. La cosa con ellos es que pueden proporcionar diferentes características de rendimiento, como más par o más velocidad, dependiendo de cómo conectemos estos cables en los cuatro terminales de control.
Para accionar un motor paso a paso, no podemos simplemente conectarle energía, ya que no sucederá nada. En cambio, tenemos que energizar las dos fases del motor en ambas direcciones y activar o enviar pulsos a ellas en un orden particular, en una secuencia oportuna. Por eso necesitamos controladores para controlar motores paso a paso.
Existen muchos tipos y tamaños de controladores, correspondientes a los muchos tipos y tamaños de motores paso a paso. Sin embargo, el principio básico de funcionamiento de todos ellos es que tienen dos puentes H que permiten energizar las fases del motor en ambas direcciones. Por supuesto, tienen muchas otras funciones como microstepping, limitación de corriente, y así que nos permiten controlar fácilmente los motores paso a paso, que es el propósito principal de ellos.
Ahora que entendemos cómo funcionan los motores paso a paso y por qué necesitamos controladores para ellos, podemos avanzar y ver cómo podemos conectar los motores paso a paso con Arduino.
Cómo conectar un motor NEMA17 con un controlador A4988 a Arduino
El NEMA17 es el motor paso a paso más popular entre los fabricantes, ya que ofrece un gran rendimiento y es asequible al mismo tiempo. Se puede encontrar en casi cualquier impresora 3D de escritorio y grabadora láser. En general, el motor paso a paso NEMA17 tiene 200 pasos, o una resolución de 1.8 grados por paso, pero también hay modelos con 400 pasos y 0.9 grados por paso de resolución. Deberíamos tener en cuenta que la designación NEMA17 en realidad describe solo el tamaño del motor en términos del tamaño de la placa frontal.
El número representa el tamaño de la placa frontal en pulgadas cuando se divide por 10, o en este caso sería 17 dividido por 10 da como resultado una placa frontal de 1.7 pulgadas, o 2.3 pulgadas para el NEMA23. Entonces, el tamaño de la placa frontal es fijo, pero la longitud de los motores NEMA17 puede variar de 20 mm a 60 mm, y con eso la potencia requerida del motor también varía. El requerimiento de potencia generalmente está definido por la cantidad de corriente que el motor puede consumir, y el rango para estos motores paso a paso NEMA17 es de 0.3A hasta 2.5A.
Ahora, de acuerdo con la clasificación de corriente del motor, necesitamos elegir un controlador adecuado que pueda manejar esa cantidad de corriente. El controlador más popular para controlar motores paso a paso NEMA17 es el controlador de motores A4988.
El A4988 tiene una clasificación de corriente máxima de 2A por bobina, pero eso en realidad es una calificación de pico. Se recomienda mantener la corriente around 1A, pero por supuesto, también es posible llegar a 2A si se proporciona un buen enfriamiento al circuito integrado. Una gran característica que tiene el controlador A4988 es la limitación de la corriente. Con esto, podemos establecer fácilmente cuánta corriente consumirá el motor sin importar la clasificación del motor. Por ejemplo, podemos conectar un motor paso a paso con clasificación de 2.5A, pero limitaremos la corriente del controlador a 1.5A. Entonces, aunque el motor no funcionará a su capacidad máxima, aún podremos usarlo.
Por otro lado, si el motor tiene una clasificación menor que el límite de corriente establecido en el controlador, el motor se sobrecalentará. Por supuesto, siempre es recomendable intentar igualar la clasificación de corriente del motor con la clasificación de corriente del controlador.
Conexión A4988 y Arduino
Todo bien, ahora veamos cómo conectar el controlador A4988 con el motor paso a paso y Arduino. En la esquina superior derecha del controlador, tenemos los pines VMOT y GND y aquí conectamos la fuente de alimentación para el motor, que puede estar en el rango de 8 a 36V. Aquí también se recomienda usar un condensador de desacoplamiento entre estos dos pines para proteger la placa de picos de voltaje. Deberíamos usar un gran condensador electrolítico con al menos 47μF de capacidad.
Luego, están los cuatro pines donde conectamos el motor paso a paso. Una fase del motor va en los pines 1A y 1B, y la otra fase en los pines 2A y 2B. A veces, puede ser un poco difícil reconocer qué dos cables del motor forman una fase, pero hay varias formas de identificarlos. La forma más sencilla es girar el eje del motor a mano y luego conectar dos cables entre sí. Si conectamos dos cables que forman una fase, la rotación del eje será un poco más difícil. Otra forma es usar un multímetro y verificar la continuidad entre los dos cables. Si conectamos dos cables que forman una fase, tendremos un cortocircuito y el multímetro comenzará a pitar.
Una vez que encontramos una fase, podemos conectarla a cualquier posición de los dos pines en el controlador, el orden no importa.
Luego, están los pines VDD y GND de la alimentación lógica del CI, que pueden ser de 3V a 5V. En el otro lado tenemos los pines Step y Direction, que pueden conectarse a cualquier pin de la placa Arduino. Con el pin Direction seleccionamos la dirección de rotación del motor y con el pin Step controlamos los pasos del motor. Con cada pulso que enviamos al pin Step, el motor avanzará un paso en la dirección seleccionada.
Justo encima de estos pines, tenemos los pines Sleep y Reset que se utilizan, como sugieren sus nombres, para poner el controlador en modo de suspensión o restablecerlo. Deberíamos tener en cuenta que ambos pines son activos en bajo. El pin Sleep por defecto está en estado ALTO, pero el pin RST está flotante. Esto significa que para habilitar el controlador, la forma más fácil es simplemente conectar estos dos pines entre sí, asumiendo que no usaremos las funciones de estos pines.
El pin Enable también es activo en bajo, por lo que a menos que lo tiremos en ALTO, el controlador estará habilitado.
Los siguientes tres pines, MS1, MS2 y MS3, se utilizan para seleccionar la resolución de paso del motor. Ya dijimos que la resolución de paso depende de la construcción del motor, que suele ser de 200 pasos por revolución para un motor NEMA17. Sin embargo, todos los controladores a paso tienen esta función llamada microstepping que permite conducir el motor a resoluciones más altas. Esto se logra energizando las bobinas a un nivel de corriente intermedio, que producen ubicaciones intermedias de los pasos. Por ejemplo, si seleccionamos la resolución de cuarto de paso, los 200 pasos del motor se convertirán en 800 microsteps por revolución. El controlador usará cuatro niveles de corriente diferentes en las bobinas para lograr esto.
El controlador A4988 tiene una resolución máxima de 16 microsteps, lo que haría que un motor NEMA17 de 200 pasos tenga 3200 pasos por revolución, o sea 0.1125 grados por paso. Esa precisión es realmente impresionante y por eso estos motores y controladores se utilizan en tantas aplicaciones. De hecho, hay controladores que tienen hasta 256 microsteps, o sea, 51200 pasos por revolución, o 0.007 grados por paso.
Sin embargo, estos tres pines tienen resistencias de pull-down, por lo que si los dejamos desconectados, el controlador funcionará en modo de paso completo. Para seleccionar una resolución de microstepping diferente, necesitamos conectar 5V a los pines apropiados según esta tabla.
Limitación de corriente A4988
Ahora que sabemos cómo conectar el motor paso a paso y el controlador A4988 a la placa Arduino, podemos proceder a explicar cómo programar o codificar Arduino para controlar el motor paso a paso. Sin embargo, antes de hacer eso o antes de alimentar el motor, hay una cosa más muy importante que debemos hacer, y es ajustar el límite de corriente del controlador.
Como ya explicamos, necesitamos ajustar el límite de corriente del controlador para que sea inferior a la clasificación de corriente del motor, de lo contrario, el motor se sobrecalentará.
Hay un pequeño potenciómetro en el controlador A4988 a través del cual podemos ajustar el límite de corriente. Al girar el potenciómetro en sentido horario, el límite de corriente aumenta y viceversa. Hay dos métodos que se pueden utilizar para determinar el valor real del límite de corriente.
El primer método implica medir el voltaje de referencia a través del potenciómetro mismo y de GND. Podemos medir el voltaje de referencia con un multímetro, y utilizar ese valor en la siguiente fórmula para calcular el límite de corriente del controlador:
Límite de corriente = Vref / (8 x Rcs)
Los valores de Rcs son la resistencia de sensado de corriente o los valores de las resistencias de sensado de corriente ubicadas justo al lado del chip. Dependiendo del fabricante, estos valores suelen ser de 0.05, 0.1 o 0.2 ohmios. Entonces, necesitamos echar un vistazo al valor de estas resistencias para calcular con precisión el límite de corriente. En mi caso, estas resistencias estaban etiquetadas como R100, lo que significaba 0.1 ohmios.
Como ejemplo, si medimos un voltaje de referencia de 0.7V y tenemos resistencias de 0.1 ohmios, el límite de corriente sería de 0.875A. O si queremos limitar la corriente a, digamos, 1A, deberíamos ajustar el voltaje de referencia a 0.8V.
El segundo método para establecer el límite de corriente es midiendo directamente la corriente a través de las bobinas. Para este propósito, necesitamos conectar el motor paso a paso y el controlador como se explicó anteriormente. Podemos saltar la conexión del controlador, pero en lugar de eso, conectar 5V a los pines Direction y Step para que el motor esté activo y mantenga una posición. Los pines MS deben dejarse desconectados para que el controlador funcione en modo de paso completo. Luego podemos desconectar una línea o bobina del motor y conectarla en serie con un amperímetro. De esta manera, una vez que alimentamos el controlador con el voltaje lógico, los 5V, y la potencia para el motor de 12V en mi caso, podemos leer cuánta corriente circula por la bobina.
Sin embargo, debemos tener en cuenta que cuando el controlador funciona en modo de paso completo, la corriente en las bobinas solo puede alcanzar el 70% del límite de corriente real. Por lo tanto, al usar el controlador en los otros modos de microstepping, la lectura del amperímetro debe multiplicarse por 1.3 para obtener el valor real del límite de corriente del controlador.
He probado ambos métodos para establecer el límite de corriente en el controlador y ambos me dieron resultados aproximadamente iguales.
Cómo programar motores paso a paso con Arduino: códigos de ejemplo
Ahora que sabemos cómo conectar el motor paso a paso y el controlador A4988 a la placa de Arduino, podemos avanzar con explicar cómo programar o codificar Arduino para controlar el motor paso a paso. Sin embargo, antes de hacer eso o antes de alimentar el motor, hay una cosa más muy importante que debemos hacer, y es ajustar el límite de corriente del controlador.
Como ya explicamos, necesitamos ajustar el límite de corriente del controlador para que sea inferior a la clasificación de corriente del motor, de lo contrario, el motor se sobrecalentará.
Ahí un pequeño potenciómetro en el controlador A4988 a través del cual podemos ajustar el límite de corriente. Al girar el potenciómetro en sentido horario, el límite de corriente aumenta y viceversa. Hay dos métodos que se pueden utilizar para determinar el valor real del límite de corriente.
¡Excelente guía! Me ayudó a entender mejor cómo usar motores paso a paso con Arduino. ¡Gracias!
¡Buena explicación! Me quedó clarísimo cómo programar motores paso a paso con Arduino. ¡Gracias!