jueves, 12 de marzo de 2015

ARDUINO + NEMA17(MOTOR PASO A PASO) + EASYDRIVER

Vamos a ver cómo podemos utilizar un motor paso a paso con Arduino y el driver de motores easy driver.

Un motor paso a paso es un motor el cual tiene definido una serie de pasos para poder dar una vuelta en concreto. Nosotros podemos ir mandando impulsos que hacen que se activen las bobinas y que el motor vaya dando pasos.  De esta manera siempre podemos saber en qué posición está.

Los motores paso a paso pueden ser unipolares o bipolares. Los bipolares disponen de dos bobinas para hacer el giro (por lo que tienen 4 cables). Los unipolares tienen un cable más para cada una de estas bobinas (común), por lo que los motores unipolares tienen 5 o 6 cables.

Se dice que los motores bipolares tienen más torque que los unipolares, por el contrario son más dificiles de manejar.

El motor que voy a usar para este ejemplo es el NEMA 17. Este motor es muy conocido porque forma parte de la impresora 3D Prusa i3. El motor en cuestión es el que se muestra bajo como podéis ver sólo tiene 4 cables por lo que es un motor bipolar.



El Easydriver es el encargado de gobernar los motores. Este driver monta el chip A3967. El driver básicamente es un puente en H que tiene por un lado las entradas de 0 y 5 voltios para alimentar el propio chip y por otro lado tiene una entrada de hasta 35 voltios qué es la que usa para poder alimentar a los motores cuando Arduino se lo diga, mediante un par de cables que se conectan con arduino.



El esquema queda de la siguiente manera:



Las conexiones quedarían como se muestran en la imagen de arriba.

Easy driver se conecta con arduino mediante 3 pines. Son los tres pines que vemos abajo a la derecha (GND, STER, DIR).Gnd se engancha al pin de tierra, mientras que los otros dos los enganchamos a los pines 8 y 9 de arduino. Estos dos últimos son los encargados de decirle al driver la dirección y cuantos pasos tiene que dar el motor.

En la parte de arriba a la derecha vemos dos conexiones más (GND y M+). Aquí tenemos las entradas de la bateria que va a mover los motores. En mi caso como vamos a usar los nema17 usaremos una entrada de 12v (8-30V).

Los últimos cables que vemos conectados son los que hay arriba a la izquierda. Estos 4 cables son los que van a conectar al driver de motores Easydriver con el motor paso a paso. Hay que recordar que estamos conectando un motor bipolar (nema 17) y por eso disponemos de 4 cables. Si el motor fuera unipolar dispondríamos de 5 o 6.

La forma de conectar los cables del motor tiene orden. Es decir, hay que conectar en los dos primeros los cables de la bobina 1 y en los dos siguientes los cables de la bobina 2. Para saber que cables pertenecen a cada una de las bobinas en cada motor, lo mejor sería leerse el datasheet del motor. Si no disponéis de él, podéis con un tester medir la resistencia de los 4 cables entre ellos. Los pares que no tengan resistencia son los cables de la misma bobina.

Si vais a utilizar el motor pololu nema-17 los colores os quedarían como en la imagen de arriba. Es decir, la secuencia negro-verde-rojo-azul.


Funcionamiento:

Para ver su funcionamiento vamos a hacer tres programas sencillos:

1 – Un paso del motor cada milisegundo

2 – Una vuelta hacia un sentido y otra vuelta hacia el sentido contrario.

3 – Aceleración del motor


1-
void setup() {               
  pinMode(8, OUTPUT);    
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

void loop() {
  digitalWrite(9, HIGH);
  delay(1);         
  digitalWrite(9, LOW);
  delay(1);         
}




2-
//Contador de numero de pasos
int Distancia = 0; 

void setup() {               
  pinMode(8, OUTPUT);    
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

void loop() {
  // El motor da un paso
  digitalWrite(9, HIGH);
  delayMicroseconds(100);         
  digitalWrite(9, LOW);
  delayMicroseconds(100);
  Distancia = Distancia + 1;  
 
  // Comprobamos si el motor ha dado una vuelta completa (1600 pasos)
  if (Distancia == 1600)
  {
    // Si ha dado la vuelta cambiamos el sentido de rotacin
    if (digitalRead(8) == LOW)
    {
      digitalWrite(8, HIGH);
    }
    else
    {
      digitalWrite(8, LOW);
    }
    //reiniciamos el contador de pasos
    Distancia = 0;
   
    //esperamos un segundo
    delay(1000);
  }
}



3-
int contador;
int pausa;

void setup() {               
  pinMode(8, OUTPUT);    
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  contador = 0;
  pausa = 400;
}

void loop() {
  //Contamos cada paso que damos
  contador = contador+1;
 
  //Si el motor ha dado dos vueltas reiniciamos el contador de pasos
  //y ponemos la nueva velocidad
  if (contador == 3200)
  {
    contador=0;
    pausa = pausa-100;
  } 
 
  //Si la pausa sigue siendo mayor que 100 mandamos impulso
  //Sino termina el programa
  if (pausa >= 100)
  {
    digitalWrite(9, HIGH);         
    delayMicroseconds(pausa);
    digitalWrite(9, LOW); 
    delayMicroseconds(pausa);  
  }
}

Video explicativo: