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 será fundamental para comprender y controlar eficientemente el motor en nuestros proyectos.

Ejemplo Práctico con Arduino UNO

Para poner en práctica este conocimiento, te presentamos un ejemplo de conexión con Arduino UNO. El módulo ULN2003 puede ser alimentado desde 5V hasta 12V, según la marca en el mismo.

Código Arduino

 

Ejemplo de Código Arduino

 


  /*La idea de que vamos a ir activando cada una de las
fases o bobinas de motor (O varias simultáneamente) en
secuencia levantando a HIGH o alto el pin de Arduino
correspondiente. (Pines de 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, las
columnas son cada una de las bobinas del motor, y cada
vez que sea 1 es que se activan, se hacen medios pasos,
por eso hacemos 8 filas, para intentar hacer el movimiento
más fino*/ 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.*/

© 2024 Tutorial de Arduino


Compartir esta publicación