Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Dominar los motores paso a paso con Arduino:la guía completa

En este tutorial aprenderemos todo lo que necesitamos saber sobre el control de motores paso a paso con Arduino. Cubriremos cómo controlar un motor paso a paso NEMA17 en combinación con un controlador 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 necesita control de posición, como impresoras 3D, máquinas CNC, robótica, máquinas de automatización, etc.

Ya lo he usado en muchos de mis proyectos Arduino, como los siguientes:

Explicaré en detalle cómo funcionan, cómo conectar motores paso a paso con 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. 

Entonces, tenemos mucho que cubrir en este tutorial. Puede ver el siguiente vídeo o leer el tutorial escrito a continuación, que también incluye todos los códigos de ejemplo y diagramas de cableado.

¿Qué es un motor paso a paso y cómo funciona?

Comenzaré explicando brevemente qué es el motor paso a paso y cómo funciona, ya que nos ayudará a comprender mejor todo lo demás en este tutorial. 

Un motor paso a paso es un tipo único de motor de CC sin escobillas cuya posición se puede controlar con precisión incluso sin ninguna retroalimentación.

El principio de funcionamiento de un motor paso a paso se basa en campos magnéticos. Tiene 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 energizamos o dejamos que la corriente fluya a través de las bobinas, se generan campos magnéticos particulares en el estator que atraen o repelen el rotor. Activando las bobinas, paso a paso, una tras otra en un orden determinado, podemos conseguir que el rotor siga en movimiento, pero también podemos hacer que se detenga en cualquier posición.

Por eso estos motores se llaman motores paso a paso, se mueven en pasos discretos. 

Al aumentar el número de polos magnéticos del rotor, podemos aumentar el número de posiciones de parada posibles, aumentando así la resolución o la precisión del motor. Tenga en cuenta que esto es sólo una explicación básica y puede encontrar más detalles en mi tutorial Cómo funcionan los motores paso a paso. 

Un motor paso a paso típico, un NEMA17 por ejemplo, tiene 50 puntos de parada o pasos en el rotor. Por otro lado, el estator puede tener varias bobinas organizadas en dos fases que proporcionan cuatro orientaciones o posiciones diferentes del campo magnético.

Entonces, los 50 pasos del rotor multiplicados por las 4 orientaciones diferentes del campo magnético, hacen un total de 200 pasos para completar una rotación completa. O si dividimos 360 grados entre 200 pasos, la resolución es de 1,8 grados por paso.

Mencioné que las bobinas del estator están organizadas en dos fases, y también podemos notar eso si observamos la cantidad de cables de un motor paso a paso. Tiene 4 cuatro cables, dos para cada fase. Las cuatro orientaciones diferentes del campo magnético son posibles ya que podemos dejar que la corriente fluya a través de las fases en ambas direcciones.

También hay motores paso a paso de 5, 6 o incluso 8 hilos, pero siguen funcionando en dos fases o los controlamos con sólo cuatro terminales.

Lo que pasa 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.

Sin embargo, con esta breve explicación, ahora entendemos que para accionar un motor paso a paso, no podemos simplemente conectarle energía porque no sucederá nada. En cambio, tenemos que energizar las dos fases del motor en ambas direcciones y activarlas o enviarles pulsos en un orden particular, en una secuencia oportuna. Por eso necesitamos controladores para controlar motores paso a paso. 

Hay muchos tipos y tamaños de controladores, correspondientes a los distintos tipos y tamaños de motores paso a paso. Sin embargo, el principio básico de funcionamiento de todos ellos es que cuentan con dos Puentes H que permiten energizar las fases del motor en ambos sentidos.

Por supuesto, tienen muchas otras funciones como micropasos, limitación de corriente, etc., que nos permiten controlar fácilmente los motores paso a paso, que es su propósito.

Cómo controlar el motor paso a paso NEMA17 con Arduino y el controlador paso a paso A4988

Muy bien, ahora podemos ver el primer ejemplo de este tutorial, cómo controlar un motor paso a paso NEMA 17 con un controlador paso a paso A4988. 

Muy bien, ahora podemos echar un vistazo al primer ejemplo de este tutorial, cómo controlar un motor paso a paso NEMA 17 con un controlador paso a paso A4988.

El NEMA17 es el motor paso a paso más popular entre los fabricantes, ya que ofrece excelentes prestaciones y es asequible al mismo tiempo. También se puede encontrar en casi cualquier impresora 3D y grabadora láser de escritorio. 

Generalmente, el motor paso a paso NEMA17 tiene 200 pasos, o 1,8 grados por paso de resolución, pero también hay modelos con 400 pasos y 0,9 grados por paso de resolución. Debemos tener en cuenta aquí 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, 17 dividido por 10 equivale a una placa frontal de 1,7 pulgadas o una placa frontal de 2,3 pulgadas en el caso de NEMA23.

Entonces, el tamaño de la placa frontal es fijo, pero la longitud de los motores paso a paso NEMA17 puede variar de 20 mm a 60 mm, y con eso también varía el requisito de potencia del motor. El requisito de energía generalmente se define por la cantidad de corriente que el motor puede consumir, y el rango de estos motores paso a paso NEMA17 es de 0,3 A hasta 2,5 A.

Ahora, de acuerdo con la clasificación actual del motor paso a paso, debemos elegir un controlador adecuado que pueda manejar esa cantidad de corriente. El controlador más popular para motores paso a paso NEMA17 es el controlador de motor paso a paso A4988.

El A4988 tiene una clasificación de corriente máxima de 2 A por bobina, pero en realidad es una clasificación máxima. Se recomienda mantener la corriente en alrededor de 1 A, pero, por supuesto, también es posible aumentar hasta 2 A si se proporciona una buena refrigeración al IC. 

Una gran característica que tiene el controlador paso a paso A4988, que en realidad tienen todas las demás unidades, es la limitación de corriente. Con esto podemos establecer fácilmente cuánta corriente consumirá el motor sin importar la potencia del motor. Por ejemplo, podemos conectar incluso un motor paso a paso de 2,5 A, pero limitaremos la corriente del controlador a 1,5 A. Así, aunque el motor no funcionará a su máxima capacidad, aún podríamos utilizarlo.

Por otro lado, si el motor tiene una clasificación inferior al límite de corriente establecido en el controlador, el motor se sobrecalentaría. Por supuesto, siempre se recomienda intentar hacer coincidir la clasificación actual del motor con la clasificación actual del controlador.

Conexión A4988 y Arduino

Muy bien, ahora veamos cómo conectar el controlador A4988 con el motor paso a paso y el controlador Arduino.

Puede obtener los componentes necesarios para este tutorial de Arduino en los enlaces siguientes:

Divulgación:Estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

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 oscilar entre 8 y 36V. Aquí 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 47 uF de capacidad. 

A continuación, 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 resultar 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 paso a paso con la mano y luego conectar dos cables entre sí. Si conectas dos cables que forman una fase, la rotación del eje sería un poco más difícil.

Otra forma es utilizar un multímetro y comprobar la continuidad entre los dos cables. Si conectas dos cables que forman una fase, tendrás un cortocircuito y el multímetro empezará a pitar.

Una vez que encontramos una fase, podemos conectarla a cualquier posición de las dos posiciones del controlador, el orden no importa. 

A continuación tenemos el IC o los pines de alimentación lógica, VDD y GND, que pueden ser de 3V a 5V. En el otro lado tenemos los pines Step y Direction, que se pueden conectar a cualquier pin de la placa Arduino. Con el pin de Dirección seleccionamos la dirección de rotación del motor, y con el pin de Paso controlamos los pasos del motor. Con cada pulso que enviemos al pin Step, el motor avanzará un paso en la dirección seleccionada. 

Justo encima de estos pines, tenemos los pines de suspensión y reinicio que se utilizan, como sugieren sus nombres, para poner el controlador en modo de suspensión o restablecerlo. Debemos tener en cuenta que ambos pines están activos en nivel bajo. El pin de suspensión por defecto está en estado ALTO, pero el pin RST está flotando. Eso significa que para tener el controlador habilitado, la forma más sencilla es simplemente conectar estos dos pines entre sí, asumiendo que no usaremos las funciones de estos pines. 

El pin Habilitar también está activo en nivel bajo, por lo que, a menos que lo coloquemos en ALTO, el controlador se habilitará. 

Los siguientes tres pines, MS1, MS2 y MS3, sirven para seleccionar la resolución de paso del motor. Ya dijimos que la resolución de pasos depende de la construcción del motor que suele ser de 200 pasos por revolución para un motor paso a paso NEMA 17. Sin embargo, todos los controladores paso a paso tienen esta característica llamada micropasos que permite accionar el motor a resoluciones más altas. Esto se logra energizando las bobinas a un nivel de corriente intermedio, lo que produce ubicaciones de pasos intermedios.

Por ejemplo, si seleccionamos resolución de un cuarto de paso, los 200 pasos del motor se convertirán en, 200 multiplicado por 4 equivale a 800 micropasos por revolución. El conductor utilizará cuatro niveles de corriente diferentes en las bobinas para lograrlo. 

El controlador A4988 tiene una resolución máxima de 16 micropasos, lo que haría que un motor NEMA17 de 200 pasos tenga 3200 pasos por revolución, o eso es 0,1125 grados por paso. Esa es una precisión realmente impresionante y es por eso que este tipo de motores y controladores paso a paso se utilizan en tantas aplicaciones. En realidad, hay controladores paso a paso que tienen hasta 256 micropasos, o eso es 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 desconectados el driver funcionará en modo paso completo. Para seleccionar una resolución de micropasos diferente, necesitamos conectar 5 V a los pines apropiados según esta tabla. 

A4988 Limitación de corriente

Muy bien, ahora que sabemos cómo conectar el motor paso a paso y el controlador a la placa Arduino, podemos continuar explicando cómo programar o codificar el Arduino para controlar el paso a paso. Sin embargo, antes de hacer eso, o antes de encender 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 corriente nominal del motor, de lo contrario el motor se sobrecalentaría.

Hay un pequeño potenciómetro de ajuste en el controlador A4988 mediante el cual podemos ajustar el límite actual. Al girar el potenciómetro en el sentido de las agujas del reloj, el límite de corriente aumenta y viceversa. Hay dos métodos que se pueden utilizar para determinar el valor real del límite actual. 

El primer método implica medir el voltaje de referencia entre el potenciómetro y GND. Podemos medir el voltaje de referencia usando un multímetro y usar ese valor en la siguiente fórmula para calcular el límite de corriente del controlador:

Límite actual =Vref / (8 x Rcs)

El Rcs es la resistencia de detección de corriente o los valores de las resistencias de detección de corriente ubicadas justo al lado del chip. Según el 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 con este método. 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 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 5V a los pines de Dirección y Paso para que el motor permanezca 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 tanto con el voltaje lógico, los 5 V, como con la potencia del motor de 12 V en mi caso, podemos leer cuánta corriente pasa por la bobina.

Sin embargo, debemos tener en cuenta aquí que cuando el controlador funciona en modo de paso completo, la corriente en las bobinas puede alcanzar sólo el 70% del límite de corriente real. Entonces, cuando se usa el controlador en otros modos de micropasos, la lectura del amperímetro debe multiplicarse por 1,3 para obtener el valor real del límite actual del controlador. 

Probé ambos métodos para configurar el límite actual del controlador y me dieron aproximadamente los mismos resultados.

Motores paso a paso y Arduino – Códigos de ejemplo

Sin embargo, ahora podemos continuar con la programación del Arduino o echar un vistazo a varios códigos de ejemplo para controlar un motor paso a paso con una placa Arduino.

Comencemos con un código de ejemplo muy básico sobre cómo controlar un motor paso a paso sin usar una biblioteca.

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: PHP (php)

Descripción del código:

Aquí lo único que tenemos que hacer es definir 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 haciendo que el estado del pin de dirección sea ALTO. Luego, usando un bucle “for”, enviamos 200 pulsos al pin STEP que hará que el motor gire un ciclo completo, considerando que funciona en modo de paso completo. Los pulsos se generan simplemente alternando el estado del pin STEP de ALTO a BAJO con un cierto retraso de tiempo entre ellos. Este retardo de tiempo define en realidad la velocidad de rotación. Si lo bajamos, la velocidad de rotación aumentará a medida que los pasos se producirán más rápido, y viceversa. 

Luego cambiamos la dirección de rotación y usando otro bucle "for" enviamos 400 pulsos que harían que el motor gire dos ciclos completos. Sin embargo, si cambiamos el modo de micropasos del controlador, digamos un cuarto de paso, lo que haría que el motor tuviera ahora 800 pasos, el primer bucle hará que el motor gire solo 90 grados y el segundo bucle solo media rotación.

Código de ejemplo 2

Aquí hay otro ejemplo simple, controlando la velocidad del motor paso a paso usando un potenciómetro.

Para ello, sólo tienes que conectar el potenciómetro al Arduino y leer su valor usando la función analogRead().

/*
 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: PHP (php)

Descripción del código:

Luego podemos mapear o convertir los valores del potenciómetro que van de 0 a 1023, a valores adecuados para ser un tiempo de retardo en microsegundos para los pulsos de paso. Encontré que el valor mínimo para el retraso entre pasos es de alrededor de 300 microsegundos. Al bajar eso, el motor paso a paso comenzó a saltar pasos. 

En general, controlar motores paso a paso con este método es fácil y funciona, pero sólo si el control requerido es simple como se muestra en los ejemplos. En caso de que necesitemos un control más complejo, la mejor manera 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 que ofrece 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 una excelente documentación que explica cómo funciona cada función. Ya he usado esta biblioteca para varios de mis proyectos Arduino, para controlar el movimiento de mi control deslizante de cámara DIY, la máquina dobladora de alambre 3D, el brazo robótico SCARA y algunos otros. En caso de que esté interesado, hay detalles y explicaciones del código para cada proyecto en el sitio web. 

Ahora echemos un vistazo a algunos ejemplos de código que utilizan esta biblioteca.

Código de ejemplo:control de velocidad del motor paso a paso mediante un potenciómetro

El primer ejemplo será controlar la velocidad del motor usando el 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: PHP (php)

Descripción del código:

Entonces, aquí primero debemos incluir la biblioteca AccelStepper. Por supuesto, antes de hacer eso, necesitamos instalar la biblioteca y podemos hacerlo desde el administrador de bibliotecas Arduino IDE. Sólo tenemos que buscar “AccelStepper” y 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 a los que se conecta 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, nombré a mi motor paso a paso1. 

En el apartado de configuración solo tenemos que establecer la velocidad máxima del motor que se define en pasos por segundo. Este valor puede llegar hasta 4000, pero en la documentación de la biblioteca se indica que valores de velocidad superiores a 1000 pasos por segundo pueden no ser fiables. 

En la sección de bucle, usando la función setSpeed() configuramos la velocidad actual del motor, y en este caso esa es la entrada analógica del potenciómetro que es de 0 a 1023.

Para que el motor se mueva e implemente esa velocidad constante, necesitamos llamar a la función runSpeed() en cada intervalo. Un valor negativo aquí, o simplemente incluir un signo menos antes 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í hay otro ejemplo de control de dos motores paso a paso implementando aceleración y desaceleración usando la biblioteca AccelStepper.

/*
 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: PHP (php)

Descripción del código:

Entonces, necesitamos definir los dos motores paso a paso y, en la configuración, usando la función setAcceleration() establecer el valor de aceleración para los motores. 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() mediante la cual le indicamos al motor a qué posición debe ir o cuántos pasos debe moverse. En el caso de una resolución de un cuarto de paso, 800 pasos significarían una rotación completa. Luego, la función runToPosition() mueve el motor a esa posición mientras implementa aceleración y desaceleración. Sin embargo, esta es una función de bloqueo, por lo que la ejecución del código permanecerá allí hasta que el motor paso a paso alcance esa posición. 

Con el mismo método movemos el segundo motor 1600 pasos o dos rotaciones completas con 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, en lugar de usar la función runToPosition(), deberíamos usar la función run(). run() también implementa aceleración y desaceleración para alcanzar la posición objetivo, pero solo da un paso por llamada. Por lo tanto, debemos llamarlo con la mayor frecuencia posible. Por esa razón, aquí ponemos 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. Previamente configuramos los dos motores para que vayan a la posición 0 con las funciones moveTo(). 

También podríamos agregar más código en ese bucle " while " y hacer otras cosas mientras hace funcionar el motor. En realidad, existen muchos métodos para hacer funcionar los motores y también hacer otras cosas. Recomiendo consultar la documentación bien descrita de la biblioteca para que pueda comprender cómo funciona cada función e implementarlas según sus necesidades.

Código de ejemplo:control de múltiples motores paso a paso con la biblioteca AccelStepper

Me gustaría mostrarles un ejemplo más que utiliza la biblioteca AccelStepper y que controla múltiples motores paso a paso de manera coordinada. Esto significa que podemos establecer posiciones objetivo para cada paso a paso y pueden alcanzar sus posiciones todos al mismo tiempo, sin importar la distancia diferente que deban recorrer.

Esto se puede hacer fácilmente usando la clase MultiStepper que viene con la biblioteca AccelStepper.

/*
 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: PHP (php)

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, tipo "larga", 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 agregarlos a la instancia MultiStepper creada previamente, que en mi caso la llamé "steppersControl". 

En la sección de bucle, comenzamos almacenando los valores de la posición objetivo en la matriz que creamos previamente. Configuré el primer paso a paso para que se moviera una rotación, el segundo, dos rotaciones y el tercero, tres rotaciones. Luego podemos asignar esta matriz a la función moveTo() que calculará las velocidades requeridas para que todos los motores lleguen a esas posiciones al mismo tiempo. Luego sólo tenemos que llamar a la función runSpeedToPosition() que moverá los motores a su posición. Aunque debemos tener en cuenta que esta función bloquea el código hasta que los motores paso a paso alcanzan 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. 

Sin embargo, si quieres aprender más, a partir de ejemplos más avanzados, puedes consultar mis proyectos Arduino que ya mencioné, todos los detalles y los códigos de los mismos están en el sitio web.

Escudo CNC para controlar múltiples motores paso a paso para cualquier proyecto Arduino

Siguiendo con el control de múltiples motores paso a paso, vale la pena mencionarlo y echarle un vistazo al escudo Arduino CNC.

El propósito principal del escudo Arduino CNC es controlar máquinas CNC de 2 o 3 ejes, pero en realidad es una excelente opción para controlar cualquier tipo de proyecto donde necesitemos controlar múltiples motores paso a paso, ya que es compacto y proporciona conexiones fáciles para los controladores y los motores. 

Este escudo se coloca encima de una placa Arduino UNO y puede controlar hasta 4 motores paso a paso individuales y tiene todos los pines Arduino restantes disponibles para su uso. Utilicé esta combinación de una placa Arduino UNO y el escudo CNC para controlar mi brazo robótico SCARA de 4 ejes.

Actualizaré esta sección del artículo sobre cómo usar el escudo CNC con Arduino con más detalles pronto.

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 paso a paso A4988 también se aplica al DRV8825. El principio de funcionamiento, las conexiones y la codificación son casi los mismos para ambos controladores. La diferencia entre ellos está en sus características técnicas y ahora vamos a echarles un vistazo y compararlos.

El DRV8825 es un controlador paso a paso de Texas Instruments que puede usarse como reemplazo directo del controlador Allegro A4988 ya que sus conexiones son las mismas. Las tres diferencias clave entre ellos son que el DR8825 puede entregar más corriente que el A4988 sin refrigeración adicional (1,5 A frente a 1 A), tiene un voltaje de suministro máximo más alto (45 V frente a 35 V) y ofrece una mayor resolución de micropasos (32 frente a 16 micropasos). 

Por supuesto, también tienen algunas otras diferencias menores. Por ejemplo, el potenciómetro de límite de corriente tiene 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 necesita fuente de alimentación lógica y la ubicación de ese pin se utiliza como salida de FALLA.

Sin embargo, es seguro conectar el pin FALLO directamente a 5V, por lo que el DRV8825 se puede utilizar como reemplazo directo en sistemas diseñados para el controlador A4988. 

Sin embargo, vale la pena señalar que al reemplazar un controlador A4988 por un DRV8825 es muy importante asegurarse de que la orientación del controlador sea correcta. Ya mencioné que sus potenciómetros están en diferentes ubicaciones, en el A4988 está debajo del chip y en el DRV8825 está encima del chip, y eso a veces puede causar confusión y el controlador se puede colocar fácilmente en el lado equivocado. 

Para establecer 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 fórmula para calcular el controlador paso a paso DRV8825 es la siguiente:

Límite actual =Vref x 2

En cuanto a seleccionar la resolución del microstepping, podemos utilizar la siguiente tabla.

En general, el DRV8825 es un mejor controlador paso a paso que el A4988, ya que ofrece valores nominales de corriente y voltaje más altos y una resolución de micropasos más alta, lo que resulta en un funcionamiento más suave y silencioso del motor paso a paso.

Controlador paso a paso TMC2208

Hablando de un funcionamiento más suave y silencioso, echemos un vistazo al controlador paso a paso TMC2208. El chip TMC2208 está 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. Se utiliza ampliamente en impresoras 3D de escritorio, grabadoras láser, escáneres, etc.

Lo que distingue a este controlador de los otros dos es su unidad de interpolación integrada que proporciona 256 subdivisiones o micropasos. Esto permite un control sinusoidal perfecto que se genera internamente dentro del chip. Esto significa que el controlador emitirá 256 micropasos al motor paso a paso, sin importar qué resolución de micropasos hayamos seleccionado a través de los dos pines MS, 2, 4, 8 o 16 micropasos. Esto proporciona un funcionamiento más fluido y reduce significativamente la carga del microcontrolador.

Esta característica del controlador, en combinación con su tecnología StealthChop2 de control de corriente silencioso, proporciona un control ultrasilencioso de los motores paso a paso. A continuación se muestra una comparación de los niveles de ruido entre los tres conductores.

Niveles de ruido del controlador paso a paso: A4988 alrededor de 65 dB, DRV8825 alrededor de 67 dB y TMC2208 alrededor de 41 dB.

El TMC2208 acciona los motores paso a paso de forma completamente silenciosa, lo cual es realmente impresionante.

La clasificación actual del TMC2208 es ligeramente superior a la del controlador A4988, o es 1,2 A con una corriente máxima de 2 A. Para configurar el límite actual del controlador, nuevamente podemos usar el mismo método explicado para los otros controladores. Necesitamos medir el voltaje de referencia con una sonda en GND y otra en el conjunto justo al lado del pin Enable.

La fórmula para calcular el límite actual es la siguiente:

Límite actual =Vref x 0,71

Aunque se puede utilizar como reemplazo directo, el controlador TMC2208 tiene una distribución de pines ligeramente diferente en comparación con el controlador A4988. Aquí solo tenemos dos pines para seleccionar la resolución de los micropasos y para habilitar el controlador necesitamos conectar el pin Enable a GND.

En términos de codificación, es igual que los otros dos controladores. 

El controlador TMC2208 también tiene otras características más avanzadas en comparación con los otros dos controladores, como por ejemplo, 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. Además de eso, proporciono más opciones de ajuste y control. 

En general, el TMC2208 es un 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 los niveles de ruido no le preocupan, otros dos controladores son una excelente opción.

Conclusión

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 increíblemente versátiles y pueden usarse en muchas aplicaciones donde se necesita control de posición. Siempre puedes aprender más explorando algunos de mis proyectos Arduino.

Si está interesado en aprender a controlar motores paso a paso más grandes como NEMA23 o NEMA34, también tendré un tutorial dedicado a eso. 

Espero que hayas disfrutado este tutorial y hayas aprendido algo nuevo. No olvides suscribirte y no dudes en hacer cualquier pregunta en la sección de comentarios a continuación.


Proceso de manufactura

  1. Elegir los mejores amortiguadores para vehículos
  2. Sensor capacitivo de huellas dactilares con Arduino o ESP8266
  3. Escáner desnatador de bomba de gas
  4. Fieltro
  5. Decodificador DTMF usando solo Arduino
  6. Pizarra
  7. El funcionamiento de una máquina cepilladora y las operaciones realizadas en ella.
  8. La máquina CNC más simple con el mínimo de piezas posible:grabadora láser de bricolaje
  9. Sistema inteligente de monitoreo de basura usando Arduino 101
  10. Juega con Fire a través de Wi-Fi (ESP8266, NeoPixels y aplicación de Android)
  11. Error feo