martes, 29 de marzo de 2016

Arduino Tutorial 23: Control de un motor paso a paso por medio de un pololu A4988

Muy buenas, en nuestra entrada anterior acerca de tutoriales Arduino os enseñamos como funcionaba un motor paso a paso y como controlarlo por Arduino. Pues bien, el siguiente paso a tomar una vez estudiado los motores paso a paso será como controlar un motor paso a paso por medio de un stepper o controlador de motor paso a paso.

Diagrama de funcionamiento
El stepper A4988 es ideal para controlar motores paso a paso.

En concreto el modelo que vamos a emplear es el A4988, ofrecido por la marca Pololu, que es bastante conocido dentro del mundo del CNC en general y de las impresoras 3D en particular, por ser un controlador de pasos con una buena resolución (de hasta 1/16) y un precio asequible. Adjunto una tabla con sus características, observar el datasheet para más documentación.

Imagen de un Pololu A4988
Una muestra de un pololu A4988 ya soldado.


Este tipo de controlador de pasos opera desde 8 a 35 V, por lo que lo consideramos apto para los motores de 12 V que pretendemos mover. También, según las especificaciones, el A4988 puede proporcionar hasta 2 A de intensidad, 1 si se usa sin disipador térmico, y que serán regulables por medio de un potenciómetro, para ajustarlo según nuestras necesidades.

Tabla de características
Tabla de características

 
Diagrama de conexión

En este caso, el diagrama de conexión que emplearemos será muy similar al mostrado arriba, pero vamos a mostrar aparte el que proporciona el fabricante por si acaso no queda lo suficientemente claro:

Esquema de circuito
Esquemático de conexiones

Lo que pretendemos es hacer girar el motor paso a paso en un sentido para después hacerlo en el otro. Utilizamos un condensador para compensar los posibles picos que se puedan producir en el transformador que usaremos de alimentación. 

Otro esquemático, más detallado, que puede encontrarse en la documentación oficial de la web.
Con el Arduino establecemos tres conexiones, Dir, que manda la dirección a derechas o a izquierdas, Step, que se usa para saber el número de pasos del micro y reset, para ponerlo a High o Low, es decir, para mantenerlo apagado en caso de no necesitarlo.

A continuación os dejo un par de vídeos para que veáis su funcionamiento: 



Código Arduino


/*Control de un driver pololu A4988 con Arduino.
 * El objetivo de este código es el de controlar un motor, ya sea unipolar o bipolar con un driver A4988 por medio de Arduino como plataforma microcontroladora.
 * Cada uno de los motores representará un eje de nuestro CNC, ya sea el eje X o Y.
 * Este circuito necesita el uso de una fuente de alimentación de 12V externa.
 * Habrá que definir el valor de la tensión para lograr que el motor no se achicharre, para ello habrá que regular el pololu. 
 */

#define VELOCIDAD 1700    // Mas que la velocidad, es el tiempo de espera que se ocurre entre el apagado y el encendido de los pasos

int steps = 11;       //Posición del pin contador de pasos
int direccion = 9;    //Posición del pin dirección
int reset = 10;       //Posición del reset
int pasos = 3500;     //Cantidad de pasos a meter, con mi motor he calculado que se produce un desplazamiento de 0.13 mm/paso. Puede variar para cada motor.

// La rutina de inicialización
void setup() {               
  // initialize the digital pin as an output.
  pinMode(steps, OUTPUT);
  pinMode(direccion, OUTPUT);
  pinMode(reset, OUTPUT);
}

// La rutina que se repite cíclicamente
void loop() {
  //De primeras damos señal de que el motor esté apagado. Esperamos 100ms y lo encendemos. Colocamos la dirección a HIGH.
  digitalWrite(reset, LOW);    //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  delay(100);
  digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
  digitalWrite(direccion, HIGH);  
  //Se repite un bucle hasta final de carril.
  for (int i = 0; i<pasos; i++)       //Equivale al numero de vueltas (200 es 360º grados) o micropasos
  {
    digitalWrite(steps, HIGH);  // This LOW to HIGH change is what creates the
    digitalWrite(steps, LOW); // al A4988 de avanzar una vez por cada pulso de energia. 
    delayMicroseconds(VELOCIDAD);     // Regula la velocidad, cuanto mas bajo mas velocidad.
  } 

  //Volvemos a dar señal de que el motor esté apagado. Esperamos 100ms y lo encendemos. Esta vez la dirección es LOW, avanzará en la dirección opuesta.
  digitalWrite(reset, LOW);   //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  delay(100);
  digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
  digitalWrite(direccion, LOW);
  for (int i = 0; i<pasos; i++)       //Equivale al numero de vueltas (200 es 360º grados) o micropasos
  {  
    digitalWrite(steps, LOW);   // LOW to HIGH hace que el motor avance ya que da la orden
    digitalWrite(steps, HIGH);    // al A4988 de avanzar una vez por cada pulso de energia.
    delayMicroseconds(VELOCIDAD);         // Regula la velocidad, cuanto mas bajo mas velocidad.
  }
}