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




