Icono del sitio AranaCorp

Controla un motor paso a paso con Arduino

4.6
(47)

Uno de los objetivos principales en robótica es hacer que las cosas se muevan por sí mismas. Para dar movimiento a un robot, se utilizan motores eléctricos como los motores paso a paso, especialmente cuando se requiere precisión con un control de bucle abierto.

En este tutorial, estudiamos el uso de circuitos integrados para el control de motores paso a paso. Para simplificar su vida, hay escudos que integran estos ICs y permiten accionar varios motores (Motor Shield V1 y Motor Shield V2). También hay controladores de motor paso a paso para funciones más avanzadas y rendimiento como el A4988 o los TMCs que se utilizan a menudo en los CNCs.

requisito : Programación con Arduino

Material

Motores paso a paso

Los steppers tienen varias fases que, si se activan con la secuencia correcta de impulsos, pueden rotar en pasos discretos. Como se conoce la secuencia para moverse paso a paso, la posición del rotor puede mantenerse en la memoria y, por lo tanto, controlar con precisión el motor sin sensor.

Hay dos tipos principales de steppers unipolar (5 o 6 cables) y bipolar (4 cables) que tienen características diferentes, como el número de pasos por revolución. Esas características deben ser conocidas e implementadas en el código para poder controlar el paso a paso correctamente.

Transistor

Para controlar los motores paso a paso, se puede utilizar tanto la red de transistores como el puente H para aplicar la secuencia correcta de impulsos a las bobinas o fases del motor paso a paso.

Para el ejemplo unipolar, utilizamos la red de transistores ULN2003A

Para el ejemplo bipolar, utilizamos un puente H, SN754410NE.

Ejemplo con stepper 28BYJ-48

Esquemas

Los steppers requieren una fuente de alimentación de 3V, 5V o más. Se debe preferir la fuente de alimentación externa, especialmente si el motor requiere más de 5V. En este caso, el stepper se puede alimentar con el pin 5V de la placa y el Arduino se puede alimentar a través del cable USB.

Código

Para controlar un motor unipolar, utilizamos una secuencia de 8 pasos. El paso a paso 28BYJ-48 describe una rotación en 2048 pasos.

#define IN1  11
#define IN2  10
#define IN3  9
#define IN4  8

int Steps = 0;
int Direction = 0;
int number_steps=512;//= 2048/4


void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT); 
pinMode(IN2, OUTPUT); 
pinMode(IN3, OUTPUT); 
pinMode(IN4, OUTPUT); 
// delay(1000);

}
void loop()
{
  //1 rotation counter clockwise
  stepper(number_steps);
  delay(1000);

  //1 rotation clockwise
  stepper(-number_steps);
  delay(1000);

  //Keep track of step number
  for(int thisStep=0;thisStep<number_steps;thisStep++){
    stepper(1);
  }
  delay(1000);

  for(int thisStep=number_steps;thisStep>0;thisStep--){
    stepper(-1);
  }
  delay(1000);
}

void stepper(double nbStep){
  if(nbStep>=0){
      Direction=1;
  }else{
      Direction=0;
      nbStep=-nbStep;
  }
  for (int x=0;x<nbStep*8;x++){
    switch(Steps){
       case 0:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, HIGH);
       break; 
       case 1:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, HIGH);
         digitalWrite(IN4, HIGH);
       break; 
       case 2:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, HIGH);
         digitalWrite(IN4, LOW);
       break; 
       case 3:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, HIGH);
         digitalWrite(IN3, HIGH);
         digitalWrite(IN4, LOW);
       break; 
       case 4:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, HIGH);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, LOW);
       break; 
       case 5:
         digitalWrite(IN1, HIGH); 
         digitalWrite(IN2, HIGH);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, LOW);
       break; 
         case 6:
         digitalWrite(IN1, HIGH); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, LOW);
       break; 
       case 7:
         digitalWrite(IN1, HIGH); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, HIGH);
       break; 
       default:
         digitalWrite(IN1, LOW); 
         digitalWrite(IN2, LOW);
         digitalWrite(IN3, LOW);
         digitalWrite(IN4, LOW);
       break; 
    }
  delayMicroseconds(1000);
  if(Direction==1){ Steps++;}
  if(Direction==0){ Steps--; }
  if(Steps>7){Steps=0;}
  if(Steps<0){Steps=7; }
} 
} 

Biblioteca

Existe una biblioteca para controlar el movimiento de los motores paso a paso: Stepper.h.

#include <Stepper.h> 

double stepsPerRevolution = 2048;

Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);  // Pin inversion to make the library work

void setup() { 
  myStepper.setSpeed(10);  
  Serial.begin(9600); 
  } 
  
  void loop() {  
    // 1 rotation counterclockwise:  
    Serial.println("counterclockwise");    
    myStepper.step(stepsPerRevolution);  
    delay(1000); 
     
   // 1 rotation clockwise: 
   Serial.println("clockwise");  
   myStepper.step(-stepsPerRevolution); 
   delay(1000); 
}

Este es el ejemplo de la biblioteca que tuvo que modificarse para que este paso a paso en particular (28BYJ-48 130061869) funcione. Los pasos pueden ser bastante diferentes, verifique las hojas de datos y juegue un poco con los parámetros para que el código funcione para su aplicación.

Ejemplo con stepper 42HS34

Esquemas

En este caso, el paso a paso se puede alimentar con el pin 3V3 de la placa y el Arduino se puede alimentar a través del cable USB.

Código

Para controlar un motor bipolar utilizamos una secuencia de 4 pasos. El stepper 42HS34 describe una rotación en 200 pasos.

#define IN1  11
#define IN2  10
#define IN3  9
#define IN4  8

int Steps = 0;
int Direction = 0;
int number_steps=50; //= 200/4

void setup() {
  Serial.begin(9600);
  pinMode(IN1, OUTPUT); 
  pinMode(IN2, OUTPUT); 
  pinMode(IN3, OUTPUT); 
  pinMode(IN4, OUTPUT); 
}

void loop()
{
  //1 rotation counter clockwise
  stepper4(number_steps);
  delay(1000);

  //1 rotation clockwise
  stepper4(-number_steps);
  delay(1000);

  //Keep track of step number
  for(int thisStep=0;thisStep<number_steps;thisStep++){
    stepper4(1);
  }
  delay(1000);

  for(int thisStep=number_steps;thisStep>0;thisStep--){
    stepper4(-1);
  }
  delay(1000);
}

void stepper4(double nbStep){
  if(nbStep>=0){
      Direction=1;
  }else{
      Direction=0;
      nbStep=-nbStep;
  }
  for (int x=0;x<nbStep*4;x++){
    switch (Steps) {
      case 0:  // 1010
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
      break;
      case 1:  // 0110
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
      break;
      case 2:  //0101
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
      break;
      case 3:  //1001
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
      break;
    }
  delayMicroseconds(2000);
  if(Direction==1){ Steps++;}
  if(Direction==0){ Steps--; }
  if(Steps>3){Steps=0;}
  if(Steps<0){Steps=3; }
} 
} 

Biblioteca

Existe una biblioteca para controlar el movimiento de los motores paso a paso: Stepper.h.

#include <Stepper.h>

const int stepsPerRevolution = 200;  

Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  myStepper.setSpeed(100);
  Serial.begin(9600);
}

void loop() {
  // 1 rotation clockwise: 
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(2000);

  // 1 rotation counterclockwise:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(2000);
}

Los steppers pueden tener diferentes características. Si no puede controlar su motor con este tutorial, no dude en dejar un comentario o contactarnos. Estaremos encantados de ayudarte.

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 4.6 / 5. Recuento de votos: 47

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Salir de la versión móvil