Motores paso a paso

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
A B C D
paso1 1 0 0 0
paso2 0 1 0 0
paso3 0 0 1 0
paso4 0 0 0 1
A B C D
paso1 1 1 0 0
paso2 0 1 1 0
paso3 0 0 1 1
paso4 1 0 0 1
A B C D
paso1 1 0 0 0
paso2 1 1 0 0
paso3 0 1 0 0
paso4 0 1 1 0
paso5 0 0 1 0
paso6 0 0 1 1
paso7 0 0 0 1
paso8 1 0 0 1
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.

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.