Arduino Tutorial 22: Control de un motor paso a paso 28 byj-48

Cuando nosotros trabajamos con un microcontrolador como Arduino, una de las principales ventajas que queremos aprovechar es su amplia aplicación en los motores, por eso hemos querido hacer una práctica sobre el control de motores paso a paso, como es el caso del motor unipolar 28byj-48. Lo primero que hay que saber, es que es un motor adherido a un adaptador, basado en una puerta inversora ULN 2003 A. Este adaptador es controlable con 5 o 12 V, lo que, para un primer ensayo con nuestro Arduino Uno es perfecto, pues nos permite utilizar la alimentación del Arduino Vcc.
Motor 28 byj-48
Motor 28 byj-48

Como ya decimos, el 28 byj-48 es un motor unipolar, ¿qué quiere decir unipolar? Quiere decir que todas las bobinas están conectadas por un común, como se representa en la figura.

 

Esquema de un motor unipolar
Esquema de un motor unipolar
  
PINEADO
ADAPTADORIN1IN2IN3IN4
ARDUINO1211109
Esquema de la conexión.
Esquema de la conexión.
Una vez que tenemos conectado el motor, debemos pensar en cómo lo pondremos en marcha. Debemos considerar que tenemos un motor de 4 fases, y que para que el eje del motor gire debemos activarlas secuencialmente.
 
Los gráficos anteriores únicamente muestran dos maneras de conectar el motor, de fase en fase, o de dos fases en dos fases. La primera conexión tendrá un menor par de desplazamiento pero también un menor consumo, la segunda opción nos proporciona un mayor par pero a su vez un mayor consumo.
 
Nosotros vamos a aplicar un modelo intermedio, alternando el uso de una y dos fases, estableciendo un ciclo de 8 pasos. Por lo tanto, con este criterio, definimos el código que cargamos en el Arduino IDE. 
 

Código Arduino

/*Control de un motor paso a paso 28 byj-48. 
 * 
 * Este motor unipolar es conectado mediante una puerta inversora ULN 2003 y conectado al Arduino. 
 * Este ejemplo nos servirá para ver como funciona un motor paso a paso, y darnos una primera idea
 * Este programa va encendiendo las fases del motor, primero una, luego esa misma y la siguiente, después la siguiente.
 * Con este parámetro, se consigue un motor equilibrado, que no consuma excesiva potencia y sin perder demasiado par. 
 */

#define VELOCIDAD 1000     //Tiempo en microsegundos que tarda el motor en dar un paso

#define IN1  12     //Definimos las entradas que componen nuestras bobinas. 
#define IN2  11
#define IN3  10
#define IN4  9

//Esta es la variable paso. Como vemos, es una matriz que incluye cada una de las cuatro fases durante un compendio de 8 ciclos, en los que vamos alternando la activación de uno o dos fases.
  
int Paso [ 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=2048;   // Variable que define el número de vueltas que va a dar el motor, en este valor da media vuelta. Con 4096 daría una vuelta completa.
boolean Direction = true;    //Define el sentido del motor.
int Steps = 0;       // Define el paso actual de la secuencia

void setup() {
     pinMode(IN1, OUTPUT);   //Declaramos como salidas las fases del motor
     pinMode(IN2, OUTPUT);
     pinMode(IN3, OUTPUT);
     pinMode(IN4, OUTPUT);
}
void loop()
   {
    while(steps_left>0)
        { 
           stepper() ;     // Avanza un paso
           steps_left-- ;  // Un paso menos
           delayMicroseconds(VELOCIDAD);
        }

     delay(300);
     Direction =! Direction;  // Invertimos la direceccion de giro
     steps_left = 2048;
   }

void stepper()            //Avanza un paso
   {  
      digitalWrite( IN1, Paso[Steps][ 0] );
      digitalWrite( IN2, Paso[Steps][ 1] );
      digitalWrite( IN3, Paso[Steps][ 2] );
      digitalWrite( IN4, Paso[Steps][ 3] );
    
      /* 
       * En funcion de la posición en la que estemos de la matriz se activan una fase u otra. 
       * Luego con setDirection avanzamos una posición o la retrocedemos.
       */

      SetDirection();
   }

void SetDirection()
   {  
      if(Direction)
         Steps++;
      else
         Steps--;

Steps = ( Steps + 8 ) % 8 ;
   }

 

Vídeo explicativo

 

Guardar

Guardar

Guardar

Guardar

GuardarGuardar

Guardar

Guardar

Guardar

Guardar

Guardar

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *