Motor paso a paso con Arduino 28BYJ-48 ULN2003

El objetivo de este tutorial es tener la primera toma de contacto con los famosos motores paso a paso, tan útiles que se pueden encontrar en muchas aplicaciones como robots o impresoras 3D.

¿Por qué? Esto es debido a su precisión, ya que puedes controlar el giro del eje del motor con bastante precisión. Su funcionamiento, de forma muy simplificada, es parecida a la de los servos, con la diferencia de que no existe la limitación de giro de 180 grados, sino que pueden dar vueltas completas como si un motor de corriente continua se tratase.  Y es justo esta su ventaja frente a los motores de corriente continua, una mayor precisión en el movimiento de los mismos. Por contra, son más complejos de usar, lo cual no son

recomendables en proyectos donde no se necesite la ya comentada alta precisión.

Motor de paso a paso 28BYJ-48 y su módulo controlador compatible ULN2003

Este motor venía con el starter kit que nos compramos para empezar en el mundo de Arduino. ¿No lo tienes? No te preocupes, son baratos y fáciles de encontrar por la red.

Es pequeño, ligero y funciona a 5V, lo que hace perfecto a la hora de usarlo con la placa Arduino (aunque el voltaje de entrada puede ampliarse hasta 12V).

En la hoja de catálogo de este componente, nos encontramos que ofrece un par decente a unas 15 RPM (revoluciones por minuto). De los dos modos "de paso" que tiene (half-step mode y full-step mode), vamos a usar el "hal-step mode"(el recomendado por el fabricante), que nos ofrece el uso de 8 señales de frecuencia de paso con unos resultados de  5.625 grados por paso, un total de 64 pasos por vuelta.

¿Cómo funciona?

El motor tiene 4 bobinas que son excitadas en una secuencia para hacer girar el eje.

En el modo elegido, primero excitamos la bobina 1, luego la 1 y la 2 a la vez, luego la 2... Y así hasta completar la secuencia. De ahí las 8 señales necesarias para el funcionamiento, tal y como muestra la figura:
A (Azul), B (Rosa), C (Amarillo), D (Naranja), E (Rojo)

 

Conexiones
 

La conexión entre el módulo y el motor es bastante intuitiva ya que tiene un conector con ranuras para guiar el acople entre los dos dispositivos.
Veremos en el módulo que existen 4 leds que indican qué bobina está actuando (mirar esquema de arriba).

Se recomienda el uso de baterías externas para la alimentación de 5V y no usar la salida de la placa Arduino, debido a que se necesita más corriente de la que el microcontrolador puede suministrar (92mA frente a los 40mA máximos que ofrece la placa)..

Los pines IN1, IN2, IN3 e IN4 son los que irán conectados a las salidas digitales del Arduino (pines digitales del 8 al 11 empezando por el IN1 con el 8).

Programa

Se va a usar un programa diferente al que viene pre-instalado en el IDE de Arduino , ya que dicho programa  usa el full-step mode y nosotros queremos utilizar, por recomendación del fabricante, el half-step mode.

 

 

// Este ejemplo demuestra que el motor 28BYJ-48 opera de forma
// bidireccional, usando un módulo ULN2003.
//La frecuencia de operación es 100Hz. Y la corriente de 92mA. 
////////////////////////////////////////////////

//declaración de las variables para los pines del motor
int motorPin1 = 8;    // Azul   - 28BYJ48 pin 1 motor
int motorPin2 = 9;    // Rosa   - 28BYJ48 pin 2 motor
int motorPin3 = 10;    // Amarillo - 28BYJ48 pin 3 motor
int motorPin4 = 11;    // Naranja - 28BYJ48 pin 4 motor
                        // Rojo   - 28BYJ48 pin 5 (VCC) motor

int motorSpeed = 1200;  //variable para fijar la velocidad del motor (el retraso entre cada secuencia)
int count = 0;          // cuenta de los pasos dados
int countsperrev = 512; // número de pasos por vuelta completa 
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

void setup() {
  //declare the motor pins as outputs
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  if(count < countsperrev )
    clockwise(); //sentido agujas del reloj
  else if (count == countsperrev * 2)
    count = 0;
  else
    anticlockwise(); //sentido antihorario
  count++;
}


//creación funciones giro horario y antihorario
void anticlockwise() 
{
  for(int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void clockwise()
{
  for(int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void setOutput(int out) //función secuencia giro
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

 

Related Articles

Este espacio lo he creado pensando en los entusiastas como tú, para compartir y centralizar documentación sobre temas que me apasionan: Arduino, impresoras 3D, Raspberry Pi, y mucho más.

Además, he querido fusionarlo con mi canal de YouTube, donde exploramos retro-informática, Raspberry Pi, consolas retro, electrónica y otras maravillas del mundo tecnológico. Este es tu sitio si disfrutas aprendiendo, creando y reviviendo lo mejor de la tecnología de ayer y hoy.

¡Bienvenido!