Motor paso a paso 28BYJ-48 con Arduino y driver ULN2003


arduino-motor-paso-paso-28byj-48-uln2033

¿Qué es un motor 28BYJ-48 y un ULN2003?

El 28BYJ-48 es un pequeño motor paso a paso unipolar de bajo precio. Las características eléctricas del 28BYJ-48 son modestas, pero incorpora un reductor integrado que lo convierte en un componente mucho más útil e interesante.

El 28BYJ-48 tiene un paso de 5.625 grados (64 pasos por vuelta). El reductor interno tiene una relación de 1/64. Combinados, la precisión total es de 4096 pasos por vuelta, equivalente a un paso de 0.088º, que es una precisión muy elevada.

En realidad la relación del reductor no es exactamente 1/64 por lo que el número de pasos es 4076 por vuelta (equivalente a un reductor de 1/63.6875)

La alimentación del motor es 5V o 12V según modelo, siendo más habitual el modelo de 5V. Físicamente ambos modelos son idénticos, por lo que para saber la tensión nominal deberemos mirar la etiqueta del motor.

Anuncio:

El 28BYJ-48 tiene un par máximo tras el reductor de 3N•cm (0.3Kgf•cm). La frecuencia máxima es de 100Hz, lo que supone unos 40 segundos por vuelta, o equivalentemente una velocidad de giro máxima en torno a 1.5 rpm.

La resistencia y el consumo eléctrico varían con el modelo de 28BYJ-48. En los modelos de 5V es de 60 Ohm, lo que supone un consumo de 83mA. Los modelos de 12V tienen resistencias de 130-380 Ohm, y consumos de 71 a 32mA.

Para el control podemos emplear una placa con integrado ULN2003. Normalmente el 28BYJ-48 se suministra con esta placa, y ambos dispositivos disponen clemas para una conexión sencilla.

El 28BYJ-48 es un motor ampliamente utilizado en aplicaciones industriales, como el control de válvulas hidráulicas y neumáticas.

En el campo de los hobbies, podemos usar el 28BYJ-48 para hacer pequeños robots articulados, brazos robóticos, posicionar sensores, o girar la mesa de un escanner.

Puedes consultar más sobre los detalles del funcionamiento de un motor paso a paso, así como otros tipos de motores en

PRECIO

El 28BYJ-48 es un motor muy barato. Podemos encontrar 28BYJ-48 por unos 1.2€ en vendedores internacionales de eBay o AliExpress.

Normalmente querremos adquirirlo junto con el controlador ULN2003. Podemos encontrar kits con ambos componentes de forma conjunta por 1.60€.

arduino-motor-paso-paso-28byj-48-uln2033-componente

¿COMO FUNCIONA EL 28BYJ-48 CON ULN2003?

Para el control del 28BYJ-48 vamos a usar una placa con el integrado ULN2003. El ULN2003 es una agrupación de 7 Par Darlington de los cuales usaremos 4, uno por cada fase del motor paso a paso.

Un par Darlington es un dispositivo que nos permite suministrar una corriente superior a las que podríamos usando las salidas de Arduino directamente.

Más información en

El 28BYJ-48 es un motor unipolar, por lo que no necesitamos invertir la corriente que atraviesa las bobinas para hacerlo funcionar. Por tanto, no necesitamos un controlador complicado como el A4988 o el DRV8825, ni siquiera un simple puente-H como el L298N.

Aplicando un control todo o nada, es decir, encendiendo por completo o apagando por completo una bobina, únicamente tenemos que activar las bobinas en la secuencia correcta.

Existen varias secuencias posibles, y acontinuación vamos a ver las tres más empleadas.

Secuencia 1-fase

En secuencia de 1-fase encendemos una única bobina cada vez.

arduino-motor-paso-paso-secuencia-1-fase

Llevando esta secuencia de encendido a una tabla, que posteriormente usaremos para el código, la secuencia quedaría de la siguiente forma,

PasoABA’B’
1ONOFFOFFOFF
2OFFONOFFOFF
3OFFOFFONOFF
4OFFOFFOFFON

Secuencia 2-fases

En la secuencia en 2-fases encendemos dos bobinas correlativas en cada fase. Al hacer trabajar dos bobinas simultáneamente en cada paso el campo magnético generado es superior (un 41% más) por lo que el motor tiene más par y, en general, presenta un mejor comportamiento. Como punto negativo, aumentamos el consumo energético al doble.

arduino-motor-paso-paso-secuencia-2-fases

Que expresado en forma de tabla resulta,

PasoABA’B’
1ONONOFFOFF
2OFFONONOFF
3OFFOFFONON
4ONOFFOFFON

Secuencia medio pasos

La última secuencia que vamos a ver es la secuencia en medio paso (half-step). Aquí encendemos alternativamente uno y dos bobinas.

Con esta secuencia conseguimos una precisión de la mitad del paso. El par desarrollado varía ya que en algunos pasos activamos dos bobinas y en otras solo una, pero a la vez el giro se encuentra más “guiado”, por lo que en general ambos efectos se compensan y el funcionamiento es bueno, salvo en aplicaciones donde estemos muy al límite del par máximo.

arduino-motor-paso-paso-secuencia-medio-paso

Expresando la secuencia en forma de tabla resulta

Medio-pasoABA’B’
1ONOFFOFFOFF
2ONONOFFOFF
3OFFONOFFOFF
4OFFONONOFF
5OFFOFFONOFF
6OFFOFFONON
7OFFOFFOFFON
8ONOFFOFFON

Esquema de montaje

La conexión del 28BYJ-48 a Arduino a través del módulo ULN2003 es bastante sencilla.

arduino-motor-paso-paso-28byj-48-uln2033-esquema

En primer lugar, conectamos el 28BYJ-48 a la placa con el integrado ULN2003 con la clema de conexión incorporada. Los terminales solo encajan en una posición, por lo que no hay riesgo de conectarlo incorrectamente.

Por otro lado, alimentamos el módulo aplicando la tensión de alimentación entre Vcc y GND del módulo. Existen modelos de 28BYJ-48 de tensiones nominales 5 o 12V. Deberéis aplicar la tensión que corresponde con vuestro motor.

En el caso de motores de tensión nominal 5V, podemos alimentar directamente desde la salida de 5V de Arduino.

No exceder la tensión de alimentación de vuestro modelo de 28BYJ-48, o lo dañaréis permanente.

Finalmente, conectamos los pines IN1, IN2, IN3 e IN4 a cuatro salidas digitales de Arduino. Al activar cada una de las señales activaremos el par Darlington correspondiente, provocando el encendido de la bobina.

La conexión, vista desde Arduino, quedaría de la siguiente manera,

arduino-motor-paso-paso-28byj-48-uln2033-conexion

EJEMPLOS DE CODIGO

Hacer funcionar un motor paso unipolar no es difícil, simplemente tenemos que emplear las secuencias que hemos visto correctamente.

Sin embargo, sí es un código en el que conviene que seamos (al menos) medianamente organizados, o puede empezar a crecer en número de líneas rápidamente, haciéndolo más lento, más difícil de usar y de mantener.

Por un lado, dado que vamos a que vamos a usar frecuentemente el código para cambiar de paso en uno u otro sentido, conviene que lo aislemos en dos funciones independientes, clockwise() y anticlockwise()

Por otro lado, vamos a almacenar la secuencia de encendido en una tabla de lookup. En el código aparecen las tres secuencias, simplemente descomentar la que queráis emplear. Por defecto está descomentada la de medio-paso, que es la recomendada por el fabricante.

Finalmente, tenemos una función setOutput() que fija la salida al motor en un paso determinado de la secuencia.

//definicion de pins
const int motorPin1 = 8;    // 28BYJ48 In1
const int motorPin2 = 9;    // 28BYJ48 In2
const int motorPin3 = 10;   // 28BYJ48 In3
const int motorPin4 = 11;   // 28BYJ48 In4
                   
//definicion variables
int motorSpeed = 1200;   //variable para fijar la velocidad
int stepCounter = 0;     // contador para los pasos
int stepsPerRev = 4076;  // pasos para una vuelta completa

//tablas con la secuencia de encendido (descomentar la que necesiteis)
//secuencia 1-fase
//const int numSteps = 4;
//const int stepsLookup[4] = { B1000, B0100, B0010, B0001 };

//secuencia 2-fases
//const int numSteps = 4;
//const int stepsLookup[4] = { B1100, B0110, B0011, B1001 };

//secuencia media fase
const int numSteps = 8;
const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };


void setup()
{
  //declarar pines como salida
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop()
{
  for (int i = 0; i < stepsPerRev * 2; i++)
  {
    clockwise();
    delayMicroseconds(motorSpeed);
  }
  for (int i = 0; i < stepsPerRev * 2; i++)
  {
    anticlockwise();
    delayMicroseconds(motorSpeed);
  }
  delay(1000);
}

void clockwise()
{
  stepCounter++;
  if (stepCounter >= numSteps) stepCounter = 0;
  setOutput(stepCounter);
}

void anticlockwise()
{
  stepCounter--;
  if (stepCounter < 0) stepCounter = numSteps - 1;
  setOutput(stepCounter);
}

void setOutput(int step)
{
  digitalWrite(motorPin1, bitRead(stepsLookup[step], 0));
  digitalWrite(motorPin2, bitRead(stepsLookup[step], 1));
  digitalWrite(motorPin3, bitRead(stepsLookup[step], 2));
  digitalWrite(motorPin4, bitRead(stepsLookup[step], 3));
}
Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github.



4.4 9 votes
Article Rating

Anuncio:

Previous Controlar un servo de rotación continua con Arduino
Next Controlar dos motores DC con Arduino y driver TB6612FNG
21 Comments
oldest
newest
Inline Feedbacks
View all comments
Carlos De La Concepción
6 years ago

Se podría controlar con 4 botones? Por ejemplo: Botón A clockwise velocidad A; Botón B anticlockwise velocidad A; Botón C clockwise velocidad B; Botón D anticlockwise velocidad B. Estoy intentando hacer un proyecto con este motor y seria fabricar un mando con 4 botones para hacer girar el motor, pero que a la vez se pudiera conectar al PC y usar cualquiera de los dos formas de controlarlo. Gracias

luisllamas
6 years ago

Por supuesto, mete una variable que sea el estado. En el loop (o por interrupciones a ser posible) lees los pulsadores y cambias el estado. Y finalmente en función del estado realizas una de las acciones que propones.

luisllamas
5 years ago

No uses la clase Stepper, usa el código de mi entrada. La clase Stepper es peor que un catarro mal curado 😀

luisllamas
5 years ago

Por supuesto 😀
Échale un ojo a la entrada sobre RTC https://www.luisllamas.es/reloj-y-calendario-en-arduino-con-los-rtc-ds1307-y-ds3231/

Saul Salcedo Balderas
5 years ago

Hola, si quiero poner un botón y cuando esté sea presionado prenda el motor cierto tiempo y después se apague y se mantenga apagado hasta que se vuelva a presionar el botón, este código me sirve para esto?.
Gracias.

Oscar Corte
5 years ago

Hola Luis. Antes que nada mil gracias por esta información, es autenticamente buena, me ha ayudado mucho pues soy aficionado principiante, y por lo mismo quisiera preguntar al respecto de un par de dudas: ¿por qué en el código el número de pasos por vuelta se multiplica por 2 ((int i = 0; i < stepsPerRev * 2; i++)) ? Me encuentro en México y compré en una tienda local exactamente el mismo motor que ilustras 28BYJ-48, pero viene especificado como unipolar en oposición a lo que aclaras en este tutorial. ¿Tendrá que ver esto con mi anterior pregunta? Al… Read more »

Jose Sanhueza
5 years ago

Hola, necesito controlarlo mediante un control remoto, pero el programa que hice no funciona.

ramon
5 years ago

Hola Luis. Creo que la tabla de la SECUENCIA 2-FASES no se corresponde con el dibujo.
Pero de todas manera muy buen trabja. Saludos

Gerardo Garcia Rivera
5 years ago

Yo tengo una duda, he escuchado que este modulo con este integrado módulo ULN2003, es muy bueno controlando motores unipolares, como los que se encuentran en las impresoras de inyección de tinta. Lo lei en un foro en italiano de Arduino, ya que tengo unos motores rescatados de impresoras Epson, en concreto son marca Moatech SP-42RD-110M(LF). Pero veo que este tiene cinco hilos en vez de 4, ahí como los conectarías a este Driver?. Los colores de los cables son negro, amarillo, rojo y café. Ya intenté buscar el esquematico del motor y encontré uno, pero no dice de que… Read more »

Samuel Luna
5 years ago

disculpa como puedo aumentar la velocidad

Nestor
4 years ago
Reply to  Samuel Luna

Lo máximo que la pude aumentar haciendo pruebas, fue en motorSpeed=800

Mario
4 years ago

Hola buenas tardes, soy nuevo en la electronica, y soy muy aficionado a todo esto, me podrian decir como le hago y donde meto el codigo para hacer funcionar el motor

Rafa V
4 years ago

Hola, enhorabuena por el blog.
Creo que en la secuencia de 1 fase, el dibujo 3 está mal. Pone A y debería ser A’.
Saludos

Motor Paso a Paso con Arduino | Aprendiendo Arduino
4 years ago
jose alberto
4 years ago

disculpa si quiero usar dos motores paso, que puedo hacer para que ambos giren en sentido contrario al mismo tiempo

Pablo
3 years ago

Hola Luis, voy a empezar de cero en esto con el motor y driver que comentas. Haré un pequeño rogbot, un brazo que gira 90 grados pulsando un boton y vuelve a la posicion inicial con una nueva pulsación. No he comprado nada y mi duda es si la placa de arduino se debe quedar en el robot para que funcione. No se si es posible lo que yo quiero, que el robot tenga: estuche de pilas para alimentación, pulsador, servo y driver.
Muchas gracias por los tutoriales y por tu ayuda.

Gonzalo
2 years ago

Tengo una duda, como haces para calcular la velocidad? Cuando cambio el valor de 1200 a 500, el motor se queda parado y tan solo empieza a vibrar

Edwin Ardila
2 years ago

Excelente Gracias