viernes, 19 de febrero de 2016

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. Este 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


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


     
Por otra parte, las bobinas del motor se activan con un mínimo de 55 mA por, lo que no podemos activarlas directamente desde un pin, sino que habremos de utilizar el adaptador, que incluye una matriz de transistores Darlington con lo que podemos sacar de los pines del adaptador la corriente necesaria. Se realizan las conexiones de la siguiente manera:


Diagrama de conexión


pineado




adaptador
IN1
IN2
IN3
IN4
ARDUINO
12
11
10
9







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. Con este criterio, definimos el código que cargamos en el Arduino IDE. 

Os adjunto el código a continuación, aparte de ofreceros un vídeo en el que podemos observar su funcionamiento con todo detalle:



/*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 ;

   }