Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

¿Eres fanático de la electrónica y la robótica? ¿Te gustaría aprender a controlar un motor paso a paso 28BYJ-48 con un controlador ULN2003 y Arduino? ¡Estás en el lugar correcto! En este artículo, te enseñaremos paso a paso cómo llevar a cabo esta emocionante y útil tarea. ¡No te lo pierdas!

Estamos rodeados de motores paso a paso sin siquiera darnos cuenta porque se utilizan en muchos objetos cotidianos, como persianas, impresoras 3D, reproductores de DVD, cámaras de seguridad y máquinas CNC. Estamos mucho más cerca de los motores paso a paso de lo que crees.

Los motores paso a paso son una combinación de motores de CC tradicionales y servomotores. Pueden girar continuamente como motores de CC y pueden colocarse con precisión (en pasos discretos) como servomotores.

Si recién está comenzando con los motores paso a paso, el 28BYJ-48 es una buena opción. Generalmente vienen con una placa controladora basada en ULN2003, lo que los hace muy fáciles de usar.

¿Sabes cómo funcionan estos motores paso a paso?

Los motores paso a paso utilizan un engranaje y electroimanes para mover la rueda un «paso» a la vez.

Cada pulso alto enviado activa la bobina y atrae los dientes más cercanos al engranaje. Esto hace que el motor gire en incrementos angulares precisos y fijos, llamados pasos.

El número de pasos que da el motor paso a paso en una rotación de 360 ​​grados es en realidad igual al número de dientes del engranaje.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

La forma en que pulsa estas bobinas determina cómo funciona el motor.

  • La secuencia de impulsos determina el sentido de rotación del motor.
  • La frecuencia de los pulsos determina la velocidad del motor.
  • El número de pulsos determina cuánto gira el motor.

Energizar las bobinas en el orden correcto hace que el motor gire.

El motor paso a paso 28BYJ-48

El 28BYJ-48 es un motor paso a paso unipolar de 5 cables que funciona a 5 V. Es perfecto para proyectos que requieren un posicionamiento preciso, como abrir y cerrar una ventilación.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

Dado que el motor no requiere escobillas de contacto, su movimiento es relativamente preciso y fiable.

A pesar de su pequeño tamaño, el motor ofrece un par decente de 34,3 mN.m a una velocidad de alrededor de 15 rpm. Proporciona un buen par incluso cuando está parado y lo mantiene mientras el motor esté encendido.

La única desventaja: tiene un consumo de energía relativamente alto y consume energía incluso cuando está parado.

Configuración de pines

El motor paso a paso 28BYJ-48 tiene cinco cables. La asignación de pines es la siguiente:

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

El 28BYJ-48 tiene dos bobinas, cada una con un grifo central. Estos dos grifos centrales están conectados internamente y conducidos al exterior como el quinto cable (cable rojo).

Un extremo de la bobina y el grifo central juntos forman uno faseEsto significa que 28BYJ-48 tiene un total de cuatro fases.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

El cable rojo siempre se coloca en ALTO, lo que significa que cuando el otro cable se coloca en BAJO, la fase se activa.

El motor paso a paso solo gira cuando las fases están en un orden lógico, conocido como Secuencia de pasos.

relación de reducción

Según la hoja de datos, cuando se opera el motor 28BYJ-48 en modo de paso completo, cada paso corresponde a una rotación de 11,25°. Entonces hay 32 pasos por revolución (360°/11,25° = 32).

Además, la caja de cambios del motor tiene una relación de reducción de 64:1. Esto da como resultado 2048 (32*64) pasos por revolución.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

el consumo de energía

El 28BYJ-48 normalmente consume alrededor de 240 mA.

Dado que el motor consume mucha energía, es mejor alimentarlo directamente desde una fuente de alimentación externa de 5 V en lugar del Arduino.

Cabe señalar que el motor consume electricidad para mantener su posición, incluso en ralentí.

Especificaciones técnicas

Aquí están las especificaciones:

Tensión de funcionamiento 5 VCC
Corriente de funcionamiento 240 mA (típico)
Número de fases 4
relación de reducción 64:1
Ángulo de paso 5,625°/64
frecuencia 100Hz
par motor >34,3 mN.m (120 Hz)
Par de autoposicionamiento >34,3 mNm
Par de fricción 600-1200 gf.cm
Par de apriete 300 gf.cm

Para obtener más información, consulte la hoja de datos a continuación.

La placa controladora ULN2003

Dado que el motor paso a paso 28BYJ-48 consume mucha energía, no puede controlarse directamente con un microcontrolador como Arduino. Se requiere un controlador IC como el ULN2003 para controlar el motor. Por lo tanto, este motor normalmente viene con una placa controladora basada en ULN2003.

Conocido por su capacidad de alta corriente y alto voltaje, el ULN2003 proporciona una mayor ganancia de corriente que un solo transistor y permite que la salida de bajo voltaje y baja corriente de un microcontrolador impulse un motor paso a paso de alta corriente.

El ULN2003 consta de un conjunto de siete pares de transistores Darlington, cada uno de ellos capaz de manejar una carga de hasta 500 mA y 50 V. Este tablero utiliza cuatro de los siete pares.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

La placa dispone de cuatro entradas de control y una conexión de alimentación.

Además, hay un conector Molex que es compatible con el conector del motor, por lo que puedes conectar el motor directamente a él.

La placa tiene cuatro LED que indican actividad en las cuatro líneas de entrada de control. Proporcionan una buena visualización durante la operación de paso.

Hay un puente ON/OFF en la placa para desactivar el motor paso a paso si es necesario.

Asignación de pines de la placa controladora del motor paso a paso ULN2003

La placa controladora del motor paso a paso ULN2003 tiene la siguiente distribución de pines:

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

IN1-IN4 Son pines de entrada para el control del motor. Conéctelos a los pines de salida digital del Arduino.

Dimensiones es el pin de tierra.

VCC El pin suministra energía al motor. Dado que el motor consume mucha energía, es mejor utilizar una fuente de alimentación externa de 5 V que la del Arduino.

Conector de motor Aquí es donde se enchufa el motor. El enchufe está encriptado y por lo tanto sólo encaja en una dirección.

Cableado del motor paso a paso 28BYJ-48 y el controlador ULN2003 a un Arduino

¡Conectemos el motor a nuestro Arduino!

Las conexiones son sencillas. Comience conectando una fuente de alimentación externa de 5 V al controlador ULN2003.

Advertencia:

El motor paso a paso se puede alimentar directamente desde el Arduino, pero esto no se recomienda ya que el motor puede generar ruido eléctrico en sus líneas eléctricas que pueden dañar el Arduino.

Conecte los conectores IN1, IN2, IN3 e IN4 de la placa del controlador a los pines digitales 8, 9, 10 y 11 de Arduino. Luego conecte el motor paso a paso al controlador ULN2003.

Finalmente, asegúrese de que su circuito y Arduino tengan una base común.

La siguiente tabla enumera las asignaciones de pines:

controlador ULN2003 arduino
EN 1 octavo
EN 2 9
EN 3 10
IN4 11
Dimensiones Dimensiones

La siguiente imagen muestra cómo se construye el circuito.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

Código de ejemplo 1 de Arduino: uso de la biblioteca paso a paso incorporada

Para nuestro primer experimento utilizamos el biblioteca paso a paso arduinoque viene con el IDE de Arduino.

La biblioteca de motores paso a paso Arduino gestiona la secuencia de pasos y le permite controlar una amplia gama de motores paso a paso unipolares y bipolares.

Aquí hay un esquema simple que hace girar el motor lentamente en una dirección y luego rápidamente en la dirección opuesta.

//Includes the Arduino Stepper Library
#include <Stepper.h>

// Defines the number of steps per rotation
const int stepsPerRevolution = 2038;

// Creates an instance of stepper class
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {
    // Nothing to do (Stepper Library sets pins as outputs)
}

void loop() {
	// Rotate CW slowly at 5 RPM
	myStepper.setSpeed(5);
	myStepper.step(stepsPerRevolution);
	delay(1000);
	
	// Rotate CCW quickly at 10 RPM
	myStepper.setSpeed(10);
	myStepper.step(-stepsPerRevolution);
	delay(1000);
}

Explicación del código:

El boceto comienza con la integración de la biblioteca paso a paso integrada.

#include <Stepper.h>

A continuación, una constante stepsPerRevolution se define, que contiene el número de “pasos” que el motor necesita para una revolución. En nuestro caso es 2038.

const int stepsPerRevolution = 2038;

La secuencia de pasos del motor paso a paso unipolar 28BYJ-48 es IN1-IN3-IN2-IN4. Usaremos esta información para controlar el motor creando una instancia de la biblioteca de motores paso a paso. myStepper con el orden de pines 8, 10, 9, 11.

Asegúrate de hacerlo correctamente, de lo contrario el motor no funcionará correctamente.

Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);

Dado que la biblioteca paso a paso configura internamente los cuatro pines de control como salidas, no hay nada que configurar en la función de configuración y, por lo tanto, permanece vacía.

void setup() {
}

En la función de bucle usamos el setSpeed() Función para establecer la velocidad a la que debe moverse el motor paso a paso y la step() Función para especificar cuántos pasos dar.

Pasar un número negativo al step() La función hace que el motor gire en la dirección opuesta.

El primer fragmento de código hace que el motor gire muy lentamente en el sentido de las agujas del reloj, mientras que el segundo hace que gire muy rápidamente en el sentido contrario a las agujas del reloj.

void loop() {
	// Rotate CW slowly at 5 RPM
	myStepper.setSpeed(5);
	myStepper.step(stepsPerRevolution);
	delay(1000);
	
	// Rotate CCW quickly at 10 RPM
	myStepper.setSpeed(10);
	myStepper.step(-stepsPerRevolution);
	delay(1000);
}

Tenga en cuenta: step() es una función de bloqueo. Esto significa que Arduino esperará hasta que el motor deje de funcionar antes de pasar a la siguiente línea de su boceto. Por ejemplo, si establece la velocidad en 1 rpm en un motor de 100 pasos y lo activa step(100)ejecutar esta función lleva un minuto completo.

Código de muestra 2 de Arduino: uso de la biblioteca AccelStepper

La biblioteca Arduino Stepper es perfecta para aplicaciones simples de un solo motor. Sin embargo, si desea controlar varios motores paso a paso, necesita una biblioteca más potente.

Para nuestro próximo experimento usaremos una biblioteca extendida de motores paso a paso: el Biblioteca AccelStepper. Supera a la biblioteca paso a paso estándar de Arduino de las siguientes maneras:

  • Soporta aceleración y frenado.
  • Admite conducción a medio paso.
  • Admite múltiples motores paso a paso al mismo tiempo, con pasos simultáneos independientes en cada motor paso a paso.

Esta biblioteca no está incluida en el IDE de Arduino, por lo que debes instalarla primero.

instalación de la biblioteca

Para instalar la biblioteca, navegue hasta Bosquejo > Incluir biblioteca > Administrar bibliotecas… Espere a que el administrador de la biblioteca descargue el índice de la biblioteca y actualice la lista de bibliotecas instaladas.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

Filtra tu búsqueda ingresando 'paso de aceleración'. Haga clic en la primera entrada y luego seleccione Instalar.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

código arduino

Aquí hay un boceto simple que acelera el motor paso a paso en una dirección y luego lo desacelera hasta que se detiene. Después de una revolución, el motor invierte su sentido de rotación y repite el proceso.

// Include the AccelStepper Library
#include <AccelStepper.h>

// Define step constant
#define MotorInterfaceType 4

// Creates an instance
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper myStepper(MotorInterfaceType, 8, 10, 9, 11);

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position
	myStepper.setMaxSpeed(1000.0);
	myStepper.setAcceleration(50.0);
	myStepper.setSpeed(200);
	myStepper.moveTo(2038);
}

void loop() {
	// Change direction once the motor reaches target position
	if (myStepper.distanceToGo() == 0) 
		myStepper.moveTo(-myStepper.currentPosition());

	// Move the motor one step
	myStepper.run();
}

Explicación del código:

El boceto comienza incluyendo la biblioteca AccelStepper recién instalada.

#include <AccelStepper.h>

Luego especificamos el tipo de interfaz del motor para la biblioteca AccelStepper. En este caso manejaremos un motor paso a paso de cuatro cables en modo de paso completo, por lo que configuramos eso MotorInterfaceType Constante en 4. Si desea operar el motor en modo de medio paso, establezca la constante en 8.

#define MotorInterfaceType 4

A continuación, creamos una instancia de la biblioteca paso a paso llamada myStepper con el tipo de interfaz de motor apropiado y una secuencia de pines de 8, 10, 9, 11. (Tenga en cuenta que la secuencia de pasos para estos motores es IN1-IN3-IN2-IN4).

AccelStepper myStepper(MotorInterfaceType, 8, 10, 9, 11);

En la función de configuración, la velocidad máxima permitida del motor se establece en 1000 (el motor acelera a esta velocidad durante el funcionamiento). Luego se ajusta la tasa de aceleración/desaceleración para acelerar y desacelerar los movimientos del motor paso a paso.

La velocidad constante se establece en 200. Y dado que el 28BYJ-48 realiza 2038 pasos por revolución, la posición objetivo también se establece en 2038.

void setup() {
	myStepper.setMaxSpeed(1000.0);
	myStepper.setAcceleration(50.0);
	myStepper.setSpeed(200);
	myStepper.moveTo(2038);
}

En la función de bucle a if La instrucción se utiliza para determinar qué tan lejos debe viajar el motor (leyendo el distanceToGo propiedad) antes de que se alcance la posición objetivo (determinada por moveTo). Si eso distanceToGo llega a cero, el motor gira en la dirección opuesta mediante el moveTo Posición al negativo de su posición actual.

En la parte inferior del bucle notarás que el run() se llama la función. Esta es la función más importante porque el paso a paso no se moverá si no está en funcionamiento.

void loop() {
	// Change direction once the motor reaches target position
	if (myStepper.distanceToGo() == 0) 
		myStepper.moveTo(-myStepper.currentPosition());

	// Move the motor one step
	myStepper.run();
}

Código de ejemplo 3 de Arduino: controle dos motores paso a paso 28BYJ-48 simultáneamente

En nuestro próximo experimento intentaremos hacer funcionar dos motores paso a paso 28BYJ-48 simultáneamente.

alambrado

Agreguemos un segundo motor paso a paso 28BYJ-48 a la configuración.

Conecte VCC del controlador ULN2003 a 5V y GND a tierra. Ahora conecte IN1, IN2, IN3 e IN4 a los pines digitales 4, 5, 6 y 7 de Arduino.

La siguiente tabla enumera las asignaciones de pines:

ULN2003 conductor 1 arduino
EN 1 octavo
EN 2 9
EN 3 10
IN4 11
Dimensiones Dimensiones
ULN2003 controlador 2 arduino
EN 1 4
EN 2 5
EN 3 6
IN4 7
Dimensiones Dimensiones

La siguiente imagen muestra cómo se construye el circuito.

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

código arduino

Aquí hay un boceto que impulsa un motor en modo de paso completo y el otro en modo de medio paso mientras acelera y desacelera. Después de una revolución, su dirección de rotación cambia.

// Include the AccelStepper Library
#include <AccelStepper.h>

// Define step constants
#define FULLSTEP 4
#define HALFSTEP 8

// Creates two instances
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper stepper1(HALFSTEP, 8, 10, 9, 11);
AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7);

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position for motor 1
	stepper1.setMaxSpeed(1000.0);
	stepper1.setAcceleration(50.0);
	stepper1.setSpeed(200);
	stepper1.moveTo(2038);

	// set the same for motor 2
	stepper2.setMaxSpeed(1000.0);
	stepper2.setAcceleration(50.0);
	stepper2.setSpeed(200);
	stepper2.moveTo(-2038);
}

void loop() {
	// Change direction once the motor reaches target position
	if (stepper1.distanceToGo() == 0) 
		stepper1.moveTo(-stepper1.currentPosition());
	if (stepper2.distanceToGo() == 0) 
		stepper2.moveTo(-stepper2.currentPosition());

	// Move the motor one step
	stepper1.run();
	stepper2.run();
}

Explicación del código:

El boceto comienza con la integración de la biblioteca AccelStepper.

#include <AccelStepper.h>

Dado que un motor funciona en modo de paso completo y el otro en modo de medio paso, se definen las dos constantes siguientes.

#define FULLSTEP 4
#define HALFSTEP 8

Luego se crean dos objetos AccelStepper, uno para cada motor.

AccelStepper stepper1(HALFSTEP, 8, 10, 9, 11);
AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7);

En la función de configuración, la velocidad máxima permitida para el primer motor se establece en 1000. Luego se ajusta la tasa de aceleración/desaceleración para agregar aceleración y desaceleración a los movimientos del motor paso a paso. La velocidad constante se establece en 200. Y dado que el 28BYJ-48 realiza 2038 pasos por revolución, la posición objetivo se establece en 2038.

Para hacer que el segundo motor paso a paso gire en la dirección opuesta, seguimos exactamente el mismo procedimiento que para el primer motor paso a paso, excepto que establecimos la posición objetivo en -2038.

void setup() {
    // settings for motor 1
    stepper1.setMaxSpeed(1000.0);
    stepper1.setAcceleration(50.0);
    stepper1.setSpeed(200);
    stepper1.moveTo(2038);

    // settings for motor 2
    stepper2.setMaxSpeed(1000.0);
    stepper2.setAcceleration(50.0);
    stepper2.setSpeed(200);
    stepper2.moveTo(-2038);
}

En la función de bucle hay dos if Se utilizan instrucciones, una para cada motor, para determinar qué tan lejos deben viajar los motores (leyendo el distanceToGo propiedad) para alcanzar su posición objetivo (determinada por moveTo). Si eso distanceToGo llega a cero, los motores reciben instrucciones de girar en la dirección opuesta mediante sus moveTo Posición a un valor negativo.

Finalmente, esto run() Se llama a la función para hacer girar los motores.

void loop() {
	// Change direction once the motor reaches target position
	if (stepper1.distanceToGo() == 0) 
		stepper1.moveTo(-stepper1.currentPosition());
	if (stepper2.distanceToGo() == 0) 
		stepper2.moveTo(-stepper2.currentPosition());

	// Move the motor one step
	stepper1.run();
	stepper2.run();
}


Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino

Introducción

Nos rodean motores paso a paso sin siquiera darnos cuenta, ya que se utilizan en tantos artículos cotidianos, como cortinas, impresoras 3D, reproductores de DVD, cámaras de seguridad y máquinas CNC. Estamos mucho más cerca de los motores paso a paso de lo que pensamos.

Los motores paso a paso se encuentran en algún punto intermedio entre un motor convencional de corriente continua y un motor servo. Pueden rotar continuamente como los motores de corriente continua y posicionarse precisamente (en pasos discretos) como los motores servo.

Motor paso a paso 28BYJ-48

El 28BYJ-48 es un motor paso a paso unipolar de 5 cables que funciona con 5V. Es perfecto para proyectos que requieren un posicionamiento preciso, como abrir y cerrar una compuerta.

A pesar de su tamaño pequeño, el motor proporciona un par decente de 34.3 mN.m a una velocidad de alrededor de 15 RPM. Proporciona un buen par incluso en reposo y lo mantiene siempre que el motor reciba energía.

Especificaciones técnicas:

  • Voltaje de operación: 5VDC
  • Corriente de operación: 240mA (típico)
  • Número de fases: 4
  • Relación de reducción de engranajes: 64:1
  • Ángulo de paso: 5.625°/64

Controlador ULN2003

Debido a que el motor 28BYJ-48 consume una cantidad significativa de energía, no se puede controlar directamente con un microcontrolador como Arduino. Se requiere un controlador IC como el ULN2003; por lo tanto, este motor generalmente viene con una placa de controlador basada en ULN2003.

El ULN2003, conocido por su capacidad de corriente y voltaje alto, proporciona una mayor ganancia de corriente que un solo transistor y permite que la salida de baja corriente y voltaje de un microcontrolador controle un motor paso a paso de alta corriente.

La placa ULN2003 consiste en una matriz de siete pares de transistores Darlington, cada uno de los cuales puede conducir una carga de hasta 500 mA y 50V. Esta placa utiliza cuatro de los siete pares.

Código de ejemplo de Arduino

Para comenzar con los motores paso a paso 28BYJ-48 y controladores ULN2003 con Arduino, aquí hay ejemplos de código para familiarizarse con su funcionamiento.

Ejemplo de código 1 – Usar la biblioteca Stepper integrada

Este código utiliza la biblioteca Stepper de Arduino para controlar un motor paso a paso en una dirección lenta y luego en la dirección opuesta rápidamente.

Código:

  1. Incluye la biblioteca Stepper de Arduino.
  2. Define el número de pasos por revolución.
  3. Crea una instancia de la clase Step con los pines específicos.
  4. Configura la velocidad y realiza los movimientos del motor.

Ejemplo de código 2 – Usar la biblioteca AccelStepper

Este código utiliza la biblioteca AccelStepper para acelerar y decelerar el motor paso a paso en una dirección y luego detenerlo. Después de una revolución, el motor invierte su dirección de giro y repite el proceso.

Código:

  1. Incluye la biblioteca AccelStepper.
  2. Configura la velocidad, aceleración y posición objetivo.
  3. Cambia la dirección una vez que el motor alcanza la posición objetivo.
  4. Mueve el motor un paso.

Ejemplo de código 3 – Controlar dos motores paso a paso simultáneamente

En este último código, se controlan dos motores paso a paso 28BYJ-48 simultáneamente, uno en modo de paso completo y el otro en modo de medio paso.

Código:

  1. Incluye la biblioteca AccelStepper.
  2. Crea dos instancias para cada motor.
  3. Configura la velocidad, aceleración y posición objetivo para cada motor.
  4. Cambia la dirección de cada motor y mueve los motores un paso.

Con estos ejemplos de código y la información proporcionada sobre el motor paso a paso 28BYJ-48 y el controlador ULN2003, estarás listo para comenzar a experimentar y controlar estos motores con tu Arduino. ¡Diviértete aprendiendo y creando proyectos con motores paso a paso!

1 comentario en «Controle el motor paso a paso 28BYJ-48 con controlador ULN2003 y Arduino»

Deja un comentario