ESP32 - Motor paso a paso

En este tutorial, vamos a aprender cómo usar el ESP32 para controlar el motor paso a paso:

El tutorial puede aplicarse a cualquier tipo de motor paso a paso bipolar (4 cables). El tutorial tomará como ejemplo un motor paso a paso NEMA 17.

Motor paso a paso ESP32

Acerca del motor paso a paso

Hay dos tipos comunes de motores paso a paso:

  • Bipolar: Estos motores vienen con 4 cables.
  • Unipolar: Los motores unipolares pueden tener 5 o 6 cables. En el caso de un motor paso a paso unipolar de 6 hilos, puedes usar efectivamente cuatro de los seis hilos para controlarlo como si fuera un motor paso a paso bipolar.

Si estás interesado específicamente en un motor paso a paso unipolar de 5 hilos, puedes consultar el tutorial titulado ESP32 - Controlar el motor paso a paso 28BYJ-48 usando el controlador ULN2003.

Sin embargo, este tutorial está exclusivamente dedicado a los motores paso a paso bipolares.

Disposición de pines del motor paso a paso bipolar

Un motor paso a paso bipolar tiene cuatro pines, y estos pines pueden llamarse de manera diferente dependiendo del fabricante. A continuación, encontrarás una tabla con algunos nombres de pines comunes:

PIN NO Naming 1 Naming 2 Naming 3
1 A+ A A
2 A- A C
3 B+ B B
4 B- B D
Diagrama de pines del motor paso a paso bipolar

La distribución de pines, los nombres de los cables y los colores de los cables pueden variar de un fabricante a otro. Para entender cómo los colores de los cables corresponden a los nombres de los pines, es esencial consultar la hoja de datos o el manual del usuario proporcionado por el fabricante. La imagen de arriba ilustra las especificaciones de dos motores distintos, cada uno con sus propias convenciones de nomenclatura de cables y coloración de cables.

Pasos por revolución

La especificación del motor indica el grado por paso (llamémoslo DEG_PER_STEP). Dependiendo del método de control, los pasos por revolución (a los que llamaremos STEP_PER_REVOLUTION) se calculan según la tabla siguiente:

Control method Steps per Revolution Real degree per step
Full-step STEP_PER_REVOLUTION = 360 / DEG_PER_STEP DEG_PER_STEP
Half-step STEP_PER_REVOLUTION = (360 / DEG_PER_STEP) * 2 DEG_PER_STEP / 2
Micro-step (1/n) STEP_PER_REVOLUTION = (360 / DEG_PER_STEP) * n DEG_PER_STEP / n

Por ejemplo, si la hoja de datos del motor especifica 1,8 grados por paso:

Control method Steps per Revolution Real degree per step
Full-step 200 steps/revolution 1.8°
Half-step 400 steps/revolution 0.9°
Micro-step (1/n) (200 * n) steps/revolution (1.8 / n)°

Cómo controlar un motor paso a paso con ESP32

El ESP32 puede generar señales para controlar el motor paso a paso, pero estas señales pueden carecer de los niveles de voltaje y corriente necesarios que exige el motor paso a paso. Por lo tanto, se necesita un controlador de hardware intermedio para superar la brecha entre el ESP32 y el motor paso a paso. Este controlador cumple dos funciones principales:

  • Amplificación de las señales de control: Aumenta la corriente y el voltaje de las señales de control originadas en el ESP32, asegurando que cumplan con los requisitos del motor paso a paso.
  • Protección del ESP32: Simultáneamente, protege al ESP32 de los niveles de corriente y voltaje más altos empleados para alimentar el motor paso a paso, evitando cualquier daño potencial.

Hay varios controladores de hardware disponibles para controlar motores paso a paso, y una opción comúnmente utilizada es el controlador L298N.

Acerca del controlador L298N

Un único controlador L298N puede usarse para controlar dos motores de corriente continua o un motor paso a paso. En este tutorial, aprendemos a usarlo para controlar el motor paso a paso.

Disposición de pines del controlador L298N

Pinout del controlador L298N

El controlador L298N tiene 11 pines y tres puentes:

  • Pin VCC: suministra energía para el motor. Puede estar entre 5 y 35 V.
  • Pin GND: es un pin de tierra común; debe conectarse a GND (0 V).
  • Pin 5V: suministra energía para el módulo L298N. Puede ser alimentado por 5V desde ESP32.
  • Pines IN1, IN2, IN3, IN4: están conectados a los pines del ESP32 para recibir la señal de control que controla el motor paso a paso.
  • Pines OUT1, OUT2, OUT3, OUT4: están conectados al motor paso a paso.
  • Jumpers ENA, ENB: se utilizan para habilitar el motor paso a paso. Debes mantener en su lugar ambos jumpers ENA y ENB.
  • 5V-EN jumper: si mantenemos el jumper 5V-EN en su lugar, la alimentación para el módulo L298N proviene de VCC; no es necesario conectar nada al pin de 5V. Si quitamos el jumper 5V-EN, debemos suministrar energía al módulo L298N a través de un pin de 5V.

Como se describió anteriormente, el controlador L298N tiene dos fuentes de alimentación de entrada:

  • Uno para el motor paso a paso (pines VCC y GND): de 5 a 35 V.
  • Uno para el funcionamiento interno del módulo L298N (pines de 5V y GND): de 5 a 7 V. Si el jumper 5V-EN se mantiene en su lugar, no es necesario conectar este pin a nada.

Diagrama de Cableado

Diagrama de cableado para motor paso a paso con ESP32 y controlador L298N

This image is created using Fritzing. Click to enlarge image

Si no sabe c\u00f3mo alimentar ESP32 y otros componentes, encuentre instrucciones en el siguiente tutorial: C\u00f3mo alimentar ESP32.

※ Nota:

  • Por favor, mantenga los tres jumpers en el módulo L298N en su lugar (en caso de que la fuente de alimentación del motor sea ≤ 12 V).
  • El orden de los pines en los motores paso a paso puede variar entre los fabricantes. Por favor, consulte la tabla que se muestra a continuación para el cableado correcto.

Tabla de cableado entre ESP32 y el controlador L298N

ESP32 pins L298N pins
7 IN1
6 IN2
5 IN3
4 IN4

Tabla de cableado entre el controlador L298N y el motor paso a paso

¡Importante! Por favor, no se preocupe por el orden de los cables del motor paso a paso en la imagen del diagrama de cableado anterior. Es solo un ejemplo. El orden de los terminales en los motores paso a paso puede variar entre fabricantes. Asegúrese de que su cableado siga la tabla a continuación.

L298N pins Stepper motor pins Or Or
OUT1 A+ A A
OUT2 A- A C
OUT3 B+ B B
OUT4 B- B D

Antes de comprar un motor paso a paso, le recomendamos consultar la hoja de datos, las especificaciones o el manual del motor paso a paso. Asegúrese de que proporcionen la asignación entre el color y el nombre de cada pin. Por ejemplo, este motor paso a paso proporciona la asignación como se muestra en la imagen a continuación:

Mapeo de colores de las bobinas del motor paso a paso

Con base en ese mapeo, la tabla de cableado se convierte en:

L298N pins stepper motor pins wire color
OUT1 A black wire
OUT2 C green wire
OUT3 B red wire
OUT4 D blue wire

※ Nota:

En todas las tablas de cableado anteriores entre el motor paso a paso y el controlador L298N, podemos intercambiar OUT1 con OUT2, OUT3 con OUT4. Por lo tanto, hay más formas de hacer el cableado. Sin embargo, si los intercambiamos, la dirección de giro de los motores puede cambiar (de sentido horario a antihorario, y viceversa).

Cómo controlar un motor paso a paso usando un controlador L298N.

Controlar un motor paso a paso no es una tarea sencilla, especialmente cuando queremos controlarlo de manera no bloqueante. Afortunadamente, gracias a la biblioteca AccelStepper, controlar el motor paso a paso se vuelve pan comido.

Arduino IDE también tiene una biblioteca integrada Stepper. Sin embargo, no recomendamos usar esta biblioteca porque:

  • La biblioteca proporciona la función bloqueante. Significa que bloquea el ESP32 para que no realice otras tareas mientras controla el motor paso a paso.
  • No dispone de funciones suficientes.

En su lugar, le recomendamos que utilice la biblioteca AccelStepper. Esta biblioteca admite:

  • Aceleración
  • Desaceleración.
  • Conducción en paso completo y medio paso.
  • Varios motores paso a paso que funcionan simultáneamente, con avance independiente y concurrente en cada motor.
  • Desventaja: NO admite el control de micro-pasos

Cómo controlar la posición de un motor paso a paso mediante el controlador L298N

Podemos mover el motor paso a paso a la posición deseada utilizando:

stepper.moveTo(desiredPosition); // move motor one revolution

※ Nota:

La función stepper.moveTo() no es bloqueante. Este es un gran punto de la librería. Sin embargo, debemos prestar atención al usar esta función:

  • Llama a 'stepper.run()' tan frecuentemente como sea posible. Debe llamarse en la función void loop().
  • No uses delay() cuando el motor esté moviéndose.
  • No deben usarse las funciones Serial.print() y Serial.println() cuando el motor esté moviéndose. Estas funciones hacen que el motor paso a paso se mueva más despacio.

Cómo controlar la velocidad del motor paso a paso mediante el controlador L298N

Podemos controlar no solo la velocidad, sino también la aceleración y la desaceleración mediante algunas funciones simples.

stepper.setAcceleration(50.0); // set acceleration/deceleration stepper.setSpeed(200); // set desired speed

Cómo controlar la dirección del motor paso a paso mediante el controlador L298N

Si haces el cableado como se indica arriba, el motor girará en:

  • Dirección en sentido horario: si controlamos el motor desde una posición a una posición superior (Incremento de posición)
  • Dirección en sentido antihorario: si controlamos el motor desde una posición a una posición inferior (Decremento de posición)

Por ejemplo:

  • Si la posición actual es 100 y controlamos el motor a 200, el motor gira en sentido horario
  • Si la posición actual es -200 y controlamos el motor a -100, el motor gira en sentido horario
  • Si la posición actual es 200 y controlamos el motor a 100, el motor gira en sentido antihorario
  • Si la posición actual es -100 y controlamos el motor a -200, el motor gira en sentido antihorario

※ Nota:

Como se mencionó anteriormente, si intercambias OUT1 con OUT2, o OUT3 con OUT4, el incremento de la posición puede ser en sentido antihorario y el decremento de la posición puede ser en sentido horario.

Cómo detener un motor paso a paso

  • El motor paso a paso se detendrá automáticamente después de alcanzar la posición deseada.
  • El motor paso a paso puede forzarse a detenerse de inmediato en cualquier momento mediante la función stepper.stop().

Código ESP32 - Código de motor paso a paso

El código a continuación hace:

  • Gira el motor una revolución en sentido horario
  • Detén el motor durante 5 segundos
  • Gira el motor una revolución en sentido antihorario
  • Detén el motor durante 5 segundos
  • Ese proceso se repite una y otra vez
/* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp32/esp32-stepper-motor */ #include <AccelStepper.h> #define DEG_PER_STEP 1.8 #define STEP_PER_REVOLUTION (360 / DEG_PER_STEP) AccelStepper stepper(AccelStepper::FULL4WIRE, 19, 18, 17, 16); // ESP32 pin: GPIO19, GPIO18, GPIO17, GPIO16 long moveToPosition = STEP_PER_REVOLUTION; void setup() { Serial.begin(9600); stepper.setAcceleration(200.0); // set acceleration stepper.setSpeed(200); // set initial speed stepper.setCurrentPosition(0); // set position to 0 stepper.moveTo(STEP_PER_REVOLUTION); // move motor one revolution, in clockwise direction Serial.println("Motor moving in clockwise direction"); } void loop() { if (stepper.distanceToGo() == 0) { Serial.println("Motor is stopped"); delay(5000); // stop 5 seconds stepper.setCurrentPosition(0); // reset position to 0 moveToPosition = -1 * moveToPosition; // reverse direction stepper.moveTo(moveToPosition); // move motor one revolution if (stepper.distanceToGo() > 0) Serial.println("Motor moving in clockwise direction"); else if (stepper.distanceToGo() < 0) Serial.println("Motor moving in anticlockwise direction"); } // Serial.print(F("position: ")); // Serial.println(stepper.currentPosition()); stepper.run(); // MUST be called as frequently as possible }

Pasos R\u00e1pidos

  • Si es la primera vez que usas ESP32, consulta cómo configurar el entorno para ESP32 en Arduino IDE.
  • Realiza el cableado tal como se muestra en la imagen de arriba.
  • Conecta la placa ESP32 a tu PC mediante un cable micro USB.
  • Abre Arduino IDE en tu PC.
  • Selecciona la placa ESP32 correcta (p. ej. ESP32 Dev Module) y el puerto COM.
  • Haz clic en el icono Libraries en la barra izquierda del Arduino IDE.
  • Busca “AccelStepper”, luego encuentra la biblioteca AccelStepper de Mike McCauley
  • Haz clic en el botón Install para instalar la biblioteca AccelStepper.
Biblioteca de AccelStepper para ESP32
  • Copie el código anterior y ábralo con Arduino IDE
  • Haga clic en el botón Subir en Arduino IDE para cargar el código al ESP32
  • Verá:
    • El motor paso a paso da una revolución en la dirección horaria
    • El motor paso a paso se detiene 5 segundos
    • El motor paso a paso gira una revolución en la dirección antihoraria
    • El motor paso a paso se detiene 5 segundos
    • El proceso anterior se ejecuta repetidamente.
  • Vea el resultado en el monitor serie
COM6
Send
Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Explicación de código

¡Lee la explicación línea por línea en los comentarios del código fuente!

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!