Etiquetas: , , ,

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.

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. (Notas sobre differentes tipos de steppers 28BYJ-48)

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

Description of steppers

Prerequisite: Programming with Arduino