Proyecto 10.2 - MC3479  Stepper Motor Driver. Part 1

31 de julio de 2016

En el Proyecto 10.1 Basics of Steppers Motors, vimos una introducción a los motores paso a paso. Utilizamos para su control un CI L293D y un Shield de Adafruit. El circuito integrado L293D admite motores de hasta 36V y 600mA. La interfaz con Arduino necesita cuatro hilos de conexión.  

En el siguiente tutorial vamos a emplear un MC3479P de ON Semiconductor. Este driver permite conectar directamente pequeños motores paso a paso de hasta 16.5V y 350mA y solo necesita dos señales para su funcionamiento, es decir, podríamos controlar hasta siete motores con un solo Arduino. 

Emplear uno u otro driver dependerá de los requisitos de cada proyecto.

Esquema

El circuito de conexión es muy sencillo. Las resistencias R1 y R2 son pull-down. La velocidad de giro se selecciona mediante el potenciómetro P1.

La interfaz con Arduino consta de dos señales: DIR para controlar el sentido de giro y STEP para la velocidad. El circuito formado por R4, R3 y el transistor 2N2222 tiene la doble función de habilitar / deshabilitar el driver y además limitar la corriente máxima que circula por las bobinas del motor. Consulta el datasheet del fabricante para más información.

Para calcular la resistencia R3 (RB según datasheet) que limita la corriente máxima que suministra el driver, necesitamos saber la corriente que consume el motor paso a paso. Con ese dato se calcula de manera aproximada IBS según la tabla de la figura 11 del datasheet. 

Y calculamos RB con la fórmula: RB=(VM-0,7) / IBS. Como el valor no saldrá exacto, poner la resistencia inmediatamente superior.

El circuito necesita de dos tensiones de alimentación: 5V para las señales lógicas y otra tensión VM que dependerá del motor que vayamos a conectar.

En este caso el motor paso a paso funciona con 12V, por lo que aprovecharemos esos 12V para para alimentar también el Arduino y mediante el regulador interno de 5V del Arduino, alimentamos el driver.

Sketch

El código aquí mostrado lo he modificado a partir del original de Lewis Loflin

Es un ejemplo sencillo para comprobar que el motor funciona correctamente y servirá como punto de partida para otros proyectos más complejos.

Al cargar el sketch, el motor girará en bucle una vuelta a derechas y otra a izquierdas cada 500ms.

/* 

  MC3479 Stepper Motor Diver

  Test Single Motor. 

  Turn CW & CCW in a loop.

  

  Based on the original sketch by Lewis Loflin

  http://www.bristolwatch.com/arduino/arduino5.htm

  

  Modified by Angel M.

  https://sites.google.com/site/angmuz/

*/

//  Outputs

#define Mc3479_clk 10 // connect to Mc3479 pin 7 STEP

#define Mc3479_dir 11 // connect to Mc3479 pin 10 DIR

#define Mc3479_enable 9

int temp;

void   setup() {

        

     pinMode(Mc3479_clk, OUTPUT);

     pinMode(Mc3479_dir, OUTPUT);

     pinMode(Mc3479_enable, OUTPUT);

     

     digitalWrite(Mc3479_clk, LOW);

     digitalWrite(Mc3479_dir, LOW);

     digitalWrite(Mc3479_enable, LOW);

     

     digitalWrite(Mc3479_enable, HIGH); // Motor ENABLE

     

   }

   

   void loop()   {     

        

     temp = analogRead(0) / 2; // 0V = max speed; 5V = min speed

     toggle(Mc3479_clk);

     delay(3);

     toggle(Mc3479_clk);

     delay(temp);    

     

     digitalWrite(Mc3479_dir, LOW); // CW

     steps(96); // 96 steps = 1 turn

     delay(500);

         

     digitalWrite(Mc3479_dir, HIGH); // CCW

     steps(96); // 96 steps = 1 turn

     delay(500);    

     

  }

  

  

  

  void steps(int j) {

    for(int i=0; i<j; i++)  {

      digitalWrite(Mc3479_clk,1);

      delay(3);

      digitalWrite(Mc3479_clk,0);

      delay(analogRead(0) / 2);

    }  // end for

    

  }  // end steps  

    

 void toggle(int pinNum) {  

  int pinState = digitalRead(pinNum);

  pinState = !pinState;

  digitalWrite(pinNum, pinState); 

}


Links

Arduino Interface MC3479 Stepper Motor Controller by Lewis Loflin. http://www.bristolwatch.com/arduino/arduino5.htm

Adafruit, All about stepper motors