Tutorial Motor a pasos 2BYJ-48 y Driver ULN2003 Arduino Mejorado
Publicado por Victor Arrieta en
Explorando el Motor Paso a Paso 28BYJ-48 con Arduino y ULN2003
Bienvenido a nuestro tutorial mejorado, resultado de pruebas y experiencias con el motor 28BYJ-48, Arduino y el módulo ULN2003. Compartimos conocimientos valiosos para que aproveches al máximo este componente.
Explora las fascinantes capacidades de este motor unipolar de 5V, con consejos y trucos para incorporarlo en tus proyectos de manera efectiva. Acompáñanos en este viaje donde combinamos la precisión técnica con la pasión por la creatividad.
El motor a pasos 28BYJ-48, operando a 5V, se presenta como un motor unipolar con 4 bobinas internas. Aunque podríamos activar sus bobinas secuencialmente mediante transistores, optaremos por explorar el uso del módulo más comúnmente asociado: el ULN2003. Este módulo cuenta con un conector hembra que encaja perfectamente con el motor, además de leds que indican qué bobinas están activadas en cada momento.
Al consultar el datasheet del motor, encontramos información clave:
- Rated Voltage: 5V DC
- Number of Phases: 4
- Stride Angle: 5.625°/64
- Pull in torque: 300 gf.cm
- Insulated Power: 600VAC/1mA/1s
- Coil: Unipolar 5 lead coil
Aunque detalles como la reductora 1/64 y el avance de 5.625 grados por paso pueden parecer técnicos, esta información es fundamental para comprender y controlar eficientemente el motor en nuestros proyectos.
Ejemplo Práctico con Arduino UNO
Para aplicar este conocimiento, se presenta un ejemplo de conexión con Arduino UNO. El módulo ULN2003 puede ser alimentado con voltajes que van desde 5V hasta 12V, dependiendo de la especificación indicada en el propio módulo.
Ejemplo de Código Arduino
/* La idea es activar cada una de las fases o bobinas del motor
(o varias simultáneamente) en secuencia, elevando a HIGH o
alto el pin correspondiente del Arduino (pines del 8 al 11). */
// Definimos nuestras variables que indican los pines donde
// conectamos al Arduino
#define IN1 11
#define IN2 10
#define IN3 9
#define IN4 8
/* Definimos una matriz de 8 filas por 4 columnas, donde las
columnas representan cada una de las bobinas del motor.
Cada vez que una celda contiene el valor 1, significa que
la bobina correspondiente se activa. Utilizamos 8 filas
para realizar medios pasos, con el objetivo de lograr
un movimiento más preciso. */
int Matriz [ 8 ][ 4 ] =
{ {1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};
//Definimos variables de control para nuestro programa
int steps_left=4092;
boolean Direction = true;
int Steps = 0;
//En el setup del programa definimos los pines
//como salidas
void setup() {
// put your setup code here, to run once:
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
/*Creamos una función llamada paso() que avanza un paso
cada vez que la invocamos y que controle en que punto de
la secuencia estamos. Usamos la variable Steps para saber
en cuál de los 8 estados posibles de la matriz estamos y
escribimos en las bobinas los valores que corresponden a
esa situación.*/
void paso()
//Avanza un paso
{ digitalWrite( IN1, Matriz[Steps][ 0] );
digitalWrite( IN2, Matriz[Steps][ 1] );
digitalWrite( IN3, Matriz[Steps][ 2] );
digitalWrite( IN4, Matriz[Steps][ 3] );
SetDirection();
}
//Entonces el ciclo principal queda así:
void loop() {
// put your main code here, to run repeatedly:
while(steps_left>0)
{
paso() ; // Avanza un paso
steps_left-- ; // Actualizamos para saber
que va un paso menos
delay (1) ;
}
delay(300);
//Direction =! Direction;
// Invertimos la direceccion
de giro
steps_left = 1023;
delay(250) ;
}
}
/*Usamos Steps_left para definir el número de pasos que
queremos girar, y por eso mientras queden pasos
pendientes seguimos en el while, que lo que hace es
avanzar un paso, disminuir el número de pasos
pendientes y hacer un delay
que controla la velocidad de giro.
Cuando acaba el while, hacemos un delay para poder ver el
final e invertimos el valor de direction para cambiar la
dirección de giro.
Con la función SetDirection() vamos a controlar la
dirección de giro y el valor de Steps de la siguiente
manera: /*
void SetDirection()
{
if(Direction)
Steps++;
else
Steps--;
if (Steps>7)
Steps=0 ;
if (Steps<0)
Steps=7 ;
}
En el siguiente código el motor hace un movimiento de una vuelta en sentido horario, hace una pausa y luego hace una vuelta en sentido antihorario y sigue así infinitamente:
Código de Arduino
#define IN1 11
#define IN2 10
#define IN3 9
#define IN4 8
const int inputPin = 2;
int value = 0;
int Matriz [ 8 ][ 4 ] =
{ {1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};
int steps_left=4092;
boolean Direction = true;
int Steps = 0;
// Define el paso actual de la secuencia
void setup() {
// put your setup code here, to run once:
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(inputPin, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
value = digitalRead(inputPin);
//leemos el botón: false = LOW
//if (value == HIGH)
// esto es que han pulsado el botón
{
while(steps_left>0)
{
paso() ; // Avanza un paso
steps_left-- ; // Un paso menos
delay (1) ;
}
delay(300);
Direction =! Direction;
// Invertimos la direceccion de giro
steps_left = 4092;
delay(250) ;
}
}
void paso() //Avanza un paso
{ digitalWrite( IN1, Matriz[Steps][ 0] );
digitalWrite( IN2, Matriz[Steps][ 1] );
digitalWrite( IN3, Matriz[Steps][ 2] );
digitalWrite( IN4, Matriz[Steps][ 3] );
SetDirection();
}
void SetDirection()
{
if(Direction)
Steps++;
else
Steps--;
if (Steps>7)
Steps=0 ;
if (Steps<0)
Steps=7 ;
}
/*En el anterior código para dar una vuelta completa
hicimos la variable int steps_left=4092, porque
4092? Como vimos en el datasheet avanza 5.625
grados por paso, como son 8 medios paso, avanzamos
11.36 grados cada vez que avanzamos las 8 filas
de la matriz. Una vuelta completa son 360 grados,
y 4092/11.36=360.*/
Compartir esta publicación
- Etiquetas: Motor, Paso a Paso, Tutorial