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
- Biblioteca Stepper.h
- Description of steppers
- Prerequisite: Programming with Arduino
Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código