9 feb. 2015

CONTROL DE UN MOTOR PASO A PASO CON ARDUINO

Con esta práctica vamos a aprender a controlar un motor paso a paso con ARDUINO. Vamos a trabajar con el motor paso a paso 28BYJ-48 y el driver ULN2003 (ambos los podéis conseguir fácilmente y por un módico precio en internet)

Para controlar el motor lo podemos hacer de tres formas diferentes:
1. Sin utilizar ninguna libreria.
2. Utilizando la librería estandar de arduino "stepper.h"
3. Utilizando la librería "CustomStepper.h"

Veamos algunos ejemplos con cada una de estas opciones:

1. SIN UTILIZAR NINGUNA LIBRERÍA.

/* Control de motor paso a paso bipolar sin utilizar librerias
* ------------------------------------------------------------
*/

/*Declaramos la correspondencia entre pines del ARDUINO y el driver
ULN2003.
*/
int motorPin1 = 8;  //pin8----1N4
int motorPin2 = 9;  //pin8----1N3
int motorPin3 = 10; //pin8----1N2
int motorPin4 = 11; //pin8----1N1

//Definimos la función que provocará el giro antihorario
/* El parámetro de entrada "delayTime" definirá la velocidad de giro
*/
void gira_antihorario(int delayTime)
{
digitalWrite(motorPin1, HIGH); // Los pines se activan en secuencia
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, HIGH);
delay(delayTime);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(delayTime);  
}
//Definimos la función que provocará el giro horario
void gira_horario(int delayTime)
{
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(delayTime); 
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, HIGH);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, HIGH); // Los pines se activan en secuencia
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
}

void setup() { 
pinMode(motorPin1, OUTPUT); // Configuración de los PINes como salida digital
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);

}

void loop() 
//gira media vuelta en sentido antihorario rápido
 for (int i=0; i <= 265; i++){
      gira_antihorario(2); 
   } 
delay(2000);//espera 2 segundos
//gira media vuelta en sentido horario lento
 for (int i=0; i <= 265; i++){
      gira_horario(18); 
   } 
delay(2000);//espera 2 segundos

2.UTILIZANDO LA LIBRERÍA  ESTÁNDAR "Stepper.h"

Para profundizar y ver todas las posibilidades de la esta librería, consultad el siguiente enlace.

#include <Stepper.h>
#define STEPS 200 //360° divided by step angle

Stepper stepper(STEPS, 8, 9, 10, 11); 

void setup(){ 
  stepper.setSpeed(60); //RPMs 

void loop(){ 
  stepper.step(100); 
  delay(1000); 
  stepper.step(-100); 
  delay(1000); 


3.UTILIZANDO LA LIBRERÍA "CustomStepper.h"

En este tercer ejemplo lo que hará el programa es controlar el ángulo de giro, girando 90º cada 2 segundos.
Para ello hay que descargarse la librería del siguiente enlace, descomprimir la carpeta, copiar la carpeta CustomStepper dentro de la carpeta Arduino->Libraries de vuestro ordenador y arrancar de nuevo el IDE arduino.
Para profundizar y ver todas las posibilidades de la esta librería, consultad el siguiente enlace.

// Control motor paso a paso unipolar con la libreria "CustomStepper.h"
   
#include <CustomStepper.h>  
   
//Define los parametros caracteristicos del motor 
CustomStepper stepper(8, 9, 10, 11, (byte[]){8, B1000, B1100, B0100, 
B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 12, CW);  
   
void setup()  
{  
  //Define la velocidad del  motor  
  stepper.setRPM(16);  
  //Define el numero de pasos por vuelta  
  stepper.setSPR(4075.7728395);  
}  
   
void loop()  
{  
 if (stepper.isDone())  
 {  
   delay(2000); //para que gire a intervalos de 90º, con pausas de 2 segundos
   //si se quita gira de forma continua
   
   //Define el sentido de rotación (CW = Horario o CCW = Antihorario)  
   stepper.setDirection(CCW);  
   //Define el angulo de rotación  
   stepper.rotateDegrees(90); 
   
  }  

  stepper.run();  // imprescindible para que funcione la libreria  
}   

No hay comentarios:

Publicar un comentario