fbpixel
Etiquetas: , , ,
4.6
(26)

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

  • Computadora
  • Arduino UNO
  • USB cable
  • ULN2003APG x1 or H-Bridge SN754410NE x1
  • Breadboard x1
  • Paso a paso x1
  • jumper cables

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: 26

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

Ya que has encontrado útil este contenido...

¡Sígueme en los medios sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?