Descrición
Para estas prácticas utilizaremos un motor paso a paso unipolar de pequeno tamaño, o 28BYJ-48, xunto co adaptador que vén con el cando o mercamos, que contén o controlador ULN2003AN. Ten 32 pasos/volta, unha redutora 1/64 e un par de 34Nm.
Os motores paso a paso ou steppers permiten controlar de forma moi precisa a velocidade e o xiro. Son motores sen vasoiriñas que funcionan con corrente continua. Constan dunha serie de devanados ou bobinados dispostos de tal xeito que cando se aplica corrente sobre algún deles, o rotor xira un “paso”, que é unha rotación nun ángulo que dependerá do fabricante. Dependendo do número de pulsos que enviemos xirará un determinado ángulo, e dependendo da frecuencia deses pulsos xirará a máis ou menos velocidade.
Para entender como funciona observa as seguintes imaxes. Na primeira imaxe aplicamos unha corrente á bobina superior, que funciona coma un electroimán atraendo o eixe magnetizado. Na segunda imaxe aplicamos unha corrente á bobina da dereita, e o rotor oriéntase cara a ela. O rotor moveuse un paso.
Na terceira imaxe aplicamos a mesma corrente nas dúas bobinas, e iso fai que o rotor se bloquee no medio do camiño entre as dúas. É co que se coñece como medio paso.
Nestas imaxes de prometec.net podemos ver como sería o movemento continuo dun motor
1 paso activando 1 bobina |
1 paso activando 2 bobinas |
1/2 paso activando 2 e 1 bobina |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Maior velocidade, menor par | Menor velocidade, maior par | velocidade e par intermedios, dobre nº de pasos por volta, maior precisión |
Mediante o controlador ULN2003AN enviamos os pulsos necesarios para conseguir o movemento que queiramos en ángulo e velocidade.
O motor paso a paso co que imos traballar é o 28BYJ-48. Nesta páxina tes unha descrición pormenorizada do mesmo.
Conexión
Para conectar o driver ao arduino UNO necesitamos cables macho femia.
- IN1: pin 8
- IN2: pin 9
- IN3: pin 10
- IN4: pin 11
- GND e VCC (5V). Podes conectar o driver a unha fonte externa. Lembra, nese caso, unir os GND da fonte e do arduino.
Configuración
O primeiro que debemos establecer e o número de pasos por revolución. A maneira de calculalo é multiplicando os pasos por ciclo (4) polo número de ciclos que require unha volta completa (8) e a redución (64): 4 x 8 x 64 = 2048 pasos/revolución
Imos ver dúas maneiras de programar o noso motor paso a paso: establecendo manualmente a secuencia de pulsos ou usando a librería Stepper, que simplifica a programación, pero funciona peor có método manual.
1. Manual
Temos definidas as tres secuencias de pasos posibles. Debes comentar e descomentar segundo a que desexes usar. Lembra que no caso de usar medio paso, para dar unha volta completa necesitas o dobre número de pasos.
// Variables const int motorPin1 = 8; // In1 const int motorPin2 = 9; // In2 const int motorPin3 = 10; // In3 const int motorPin4 = 11; // In4 int motorSpeed = 1350*2; // tempo de agarda en microsegundos int pasosPorRevolucion = 2048; // pasos para unha volta completa int contador = 0; // contador para os pasos //Táboas de secuencia de acendido das bobinas (descomentar a que vaias usar) //secuencia 1-fase const int numSteps = 4; const int pasos[4] = { B1000, B0100, B0010, B0001 }; //secuencia 2-fases //const int numSteps = 4; //const int pasos[4] = { B1100, B0110, B0011, B1001 }; //secuencia media fase //const int numSteps = 8; //const int pasos[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 }; // Configuración void setup(){ pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); Serial.begin(9600); } // Función que activa as bobinas correspondentes void setOutput(int step){ digitalWrite(motorPin1, bitRead(pasos[step], 0)); digitalWrite(motorPin2, bitRead(pasos[step], 1)); digitalWrite(motorPin3, bitRead(pasos[step], 2)); digitalWrite(motorPin4, bitRead(pasos[step], 3)); } void loop(){ }
2. Librería
A librería Stepper xa vén integrada no arduino, pero só admite o método de paso completo. Se queremos máis precisión hai outras librerías, pero en principio para o que queremos facer chéganos ben con esta.
#include <Stepper.h> const int pasosPorRevolucion = 2048; // nº de pasos por revolución Stepper motor(pasosPorRevolucion, 8,10,9,11); // Iniciamos o motor paso a paso void setup() { motor.setSpeed(3); // establecemos a velocidade en rpm Serial.begin(9600); // Iniciamos a consola serie } void loop(){ }
Indicamos tamén un nome para o noso motor paso a paso e os pins aos que está conectado.
A velocidade indicámola coa instrución motor.setSpeed(5); A máis velocidade pode que non funcione, xa que estes motores necesitan un tempo mínimo entre paso e paso para activar as bobinas e xirar. Lembra que estes motores son moi precisos, pero lentos.
Nos seguintes exemplos podes ver diferentes maneiras de programar o movemento, dentro do loop(). Primeiro poñemos o exemplo sen librería e despois con librería.
Prácticas
1. nº de pasos
Neste programa facemos que o motor xire 1/4 de volta (2024/4=512) cada 2 segundos:
1. Modo manual
void loop() { for (int i = 0; i < 512; i++) { contador++; if (contador >= numSteps) { contador = 0; } setOutput(contador); delayMicroseconds(motorSpeed); } delay(2000); }
2. Con librería Stepper
void loop() { motor.step(512); // mover 1/4 de volta delay(2000); }
Se queremos que o motor xire no sentido contrario debemos poñer o nº de pasos en negativo.
2. Volta completa
Imos facer que xire unha volta completa nun sentido, agarde 1 segundo, e xire 1 volta en sentido contrario, e así sucesivamente.
1. Modo manual
void loop() { // sentido horario for (int i = 0; i < pasosPorRevolucion; i++) { contador++; if (contador >= numSteps) { contador = 0; } setOutput(contador); delayMicroseconds(motorSpeed); } delay(1000); // sentido antihorario for (int i = 0; i < pasosPorRevolucion; i++){ contador--; if (contador < 0) { contador = numSteps - 1; } setOutput(contador); delayMicroseconds(motorSpeed); } delay(1000); }
2. Con librería Stepper
void loop() { // unha volta nun sentido Serial.println("horario"); motor.step(pasosPorRevolucion); delay(1000); // Unha volta en sentido contrario Serial.println("antihorario"); motor.step(-pasosPorRevolucion); delay(1000); }
3. potenciómetro
Agora imos facer que o motor xire segundo movemos un potenciómetro.
No inicio debemos definir unha variable “previous”
int previous = 0;
Cando movemos o potenciómetro o motor xirará segundo a lectura do potenciómetro
1. Modo manual
void loop() { int pot = analogRead(A0); Serial.println("pot:" + String(pot) + " - previous:" + String(previous)); for (int i = 0; i < abs(pot-previous); i++) { if ( (pot-previous) > 0){ contador++; if (contador >= numSteps) { contador = 0; } } else { contador--; if (contador < 0) { contador = numSteps - 1; } } setOutput(contador); delayMicroseconds(motorSpeed); } previous=pot; delay(100); }
2. Con librería Stepper
void loop() { int pot = analogRead(0); motor.step(pot-previous); previous=pot; delay(100); }
4. Contrar pasos
Neste programa imos facer que o motor se mova moi lentamente, paso a paso, e imos visualizar na consola o número de pasos que deu. Debemos empezar, no inicio do programa, definindo unha variable na que iremos rexistrando os pasos.
int contaPasos = 0;
Despois facemos que o motor xire un paso e imos engadindo os valores na variable.
1. Modo manual
void loop() { Serial.print("pasos:"); Serial.println(contaPasos); contador++; if (contador >= numSteps) { contador = 0; } setOutput(contador); delayMicroseconds(motorSpeed); contaPasos++; delay(10); }
2. Con librería Stepper
void loop() { motor.step(1); Serial.print("pasos:"); Serial.println(contaPasos); contaPasos++; delay(10); }
Propostas
- Fai que o motor paso a paso xire continuamente paso a paso e pare cando prememos nun pulsador ou se active un sensor nunha posición determinada. Podes usar a función de control while.
- Fai que o motor paso a paso se mova un nº de pasos indicado a través da consola.
Deseño 3D
Se vas utilizar un motor 28BYJ-48 nos teus proxectos, pode servirte de axuda este esquema coas dimensións