Motor paso a paso 28BYJ-48 y AccelStepper

Objetivos

  • Montar un pequeño motor paso a paso 28BYJ-48 con su adaptador.
  • Escribir un primer programa de control utlizando la librería AccelStepper.

Material requerido

 arduino
  • Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.
 Img_3_4
  •  Una Protoboard.
 Img_3_6-300x185
  • Algunos cables de Protoboard.
FT68TVVHMMF4Z5P.LARGE_
  • Motor paso a paso 28BYJ-48 y adaptador

Motor paso a paso

Vamos a usar un pequeño motor paso a paso unipolar, muy común en el mundo Arduino por su pequeño tamaño y bajo coste, el 28BYJ-48 y el adaptador  que suele venir con él, basado en el chip ULN2003A.

FT68TVVHMMF4Z5P.LARGE_

El 28BYJ-48 tiene 64 pasos por vuelta y un reductor interno con una relación de 1/64. En conjunto hacen 4096 pasos por vuelta

Ya vimos como utilizar estos motores de forma manual en otra entrada, en ese caso se mandaban las señales una a una a cada bobina.

Ahora veremos como utilizar este motor paso a paso utilizando la librería AccelStepper.

Instalación de la biblioteca AccelStepper

Para controlar el motor paso a paso con lArduino, utilizaremos la librería AccelStepper. Esta librería permite mover fácilmente el motor un número definido de pasos, establecer su velocidad, aceleración y mucho más.

Puede consultar la documentación de la biblioteca AccelStepper aquí.

Pasos para instalar la librería AccelStepper en el IDE de Arduino:

Haz clic en el menú “Programa” -> Incluir librería -> Administrar bibliotecas… Busca “AccelStepper”. Instala la biblioteca AccelStepper de Mike McCauley. En este ejercicio se utilizó la versión 1.64.0.

image-1

Primer ejemplo de código

#include <AccelStepper.h>
#include <MultiStepper.h>

const int vuelta = 2048; // Cambia esto para ajustar el número de pasos por revolución.

// ULN2003 Motor Driver Pins
#define IN1 5 // puedes usar D1
#define IN2 4 // puedes usar D2
#define IN3 14 // puedes usar D5
#define IN4 12 // puedes usar D6

// initialize the stepper library
AccelStepper stepper(AccelStepper::HALF4WIRE, IN1, IN3, IN2, IN4);

void setup() {
    // initialize the serial port
    Serial.begin(115200);

    // set the speed and acceleration
    stepper.setMaxSpeed(500);
    stepper.setAcceleration(100);
    // set target position
    stepper.moveTo(vuelta);
}

void loop() {
    // check current stepper motor position to invert direction
    if(stepper.distanceToGo() == 0){
        stepper.moveTo(-stepper.currentPosition());
        Serial.println(«Changing direction»);
    }
    // move the stepper motor (one step at a time)
    stepper.run();
}

Explicación del código

En el código, primero se debe incluir la biblioteca AccelStepper.h.

#include <AccelStepper.h>

Se debe definir el número de pasos por revolución del motor paso a paso, en este caso es de 2048:

const int stepsPerRevolution = 2048; // cambiar esto para ajustar el número de pasos por revolución

Luego se deben definir los pines de entrada del motor. En este ejemplo, se conectan a los pines 5, 4, 14 y 12, pero se pueden usar cualquier pin.

Se debe inicializar una instancia de la biblioteca AccelStepper llamada stepper. Pasa como argumentos: AccelStepper::HALF4WIRE para indicar que se está controlando el motor paso a paso con cuatro cables y los pines de entrada. En el caso del motor paso a paso 28BYJ-48, el orden de los pines es IN1, IN3, IN2, IN4, puede ser diferente para otros motores.

AccelStepper stepper(AccelStepper::HALF4WIRE, IN1, IN3, IN2, IN4);

En el setup(), inicializa el Monitor Serial a una velocidad de baudios de 115200.

Usa el método setMaxSpeed() para establecer la velocidad máxima del motor paso a paso. Pasa como argumento la velocidad en pasos por segundo. La función run() acelerará hasta la velocidad establecida por esta función.

Se establece la aceleración usando el método setAcceleration(). Pasa como argumento la aceleración en pasos por segundo.

Luego, se usa el método moveTo() para establecer una posición objetivo. Luego, la función run() intentará mover el motor (como máximo un paso por llamada) desde la posición actual a la posición objetivo establecida por la llamada más reciente a esta función. Estamos estableciendo la posición objetivo en 2048 (que es una vuelta completa en el caso de este motor).

stepper.moveTo(vuelta);

En el loop(), haremos girar el motor paso a paso en sentido horario y antihorario.

Primero, verificamos si el motor ya ha alcanzado su posición objetivo. Para hacer eso, podemos usar la función distanceToGo() que devuelve los pasos desde la posición actual hasta la posición objetivo.

Cuando el motor alcanza su posición objetivo, significa que la función distanceToGo() devolverá 0 y la siguiente declaración if será verdadera.

if (stepper.distanceToGo() == 0){

Cuando el motor alcanza su posición objetivo, establecemos una nueva posición objetivo, que es la misma que la posición actual pero en dirección opuesta.

stepper.moveTo(-stepper.currentPosition());

Finalmente, llama a stepper.run() para mover el motor un paso a la vez en el loop().

stepper.run();

La función run() sondea el motor y lo mueve si es necesario, implementando aceleraciones y desaceleraciones para alcanzar la posición deseada. Debes llamar a esta función tan frecuentemente como sea posible, pero al menos una vez por el intervalo de tiempo mínimo de paso, preferiblemente en el loop().

Segundo ejemplo de código

#include <AccelStepper.h>

const int stepsPerRevolution = 2048;
// ULN2003 Motor Driver Pins
#define IN1 5 // puedes usar D1
#define IN2 4 // puedes usar D2
#define IN3 14 // puedes usar D5
#define IN4 12 // puedes usar D6
// Define el motor paso a paso y los pines que se utilizarán
AccelStepper stepper(AccelStepper::HALF4WIRE, IN1, IN3, IN2, IN4);

void setup() {
// Establece la velocidad máxima y la aceleración del motor
stepper.setMaxSpeed(1000);
stepper.setAcceleration(100);
}

void loop() {
// Mueve el motor 2048 pasos en una dirección
stepper.move(stepsPerRevolution );
stepper.runToPosition();

// Espera 1 segundo
delay(1000);

// Mueve el motor 2048 pasos en la dirección opuesta
stepper.move(-stepsPerRevolution );
stepper.runToPosition();

// Espera 1 segundo
delay(1000);
}

runToPosition()

Mueve el motor (con aceleración/desaceleración) a la posición objetivo y lo bloquea hasta que esté en la posición. No utilizar este método en bucles, ya que bloquea.

runToNewPosition()

runToNewPosition( long position)

Mueve el motor (con aceleración/desaceleración) a la nueva posición objetivo y lo bloquea hasta que esté en posición. No utilizar este método en bucles, ya que bloquea.