Duda con 3 motores 28BYJ-48

Hola,

Estoy intentando controlar 3 motores paso a paso 28BYJ48, cada uno con su correspondiente placa driver ULN2003, para que funcionen a la vez.

Aunque he leído y releído mucho sobre estos motores hay cosas que no me quedan muy claras, ya que hay ejemplos que no he logrado hacer funcionar.
Las pruebas las estoy haciendo con sólo 2 motores (por comodidad), un Arduino UNO y una alimentación externa de 5V-1A para que no haya problemas de alimentación.

En primer lugar, usando la librería “stepper” los he logrado hacer funcionar en secuencia pero no a la vez, aunque he leído por ahí que se puede hacer, pero no he logrado hacerlo. Y sólo he logrado hacerlos funcionar en el sentido de las agujas del reloj pero nunca al contrario (vibra pero no gira).

Al final, he logrado hacerlos funcionar los 2 a la vez con este código modificado de uno que movía un solo motor:

// Definimos los pines donde tenemos conectadas las bobinas
#define AIN1  2
#define AIN2  3
#define AIN3  4
#define AIN4  5

#define BIN1  8
#define BIN2  9
#define BIN3  10
#define BIN4  11
// Secuencia de pasos
int paso [8][4] =
{
{1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};
void setup()
{
// Todos los pines en modo salida
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(AIN3, OUTPUT);
pinMode(AIN4, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(BIN3, OUTPUT);
pinMode(BIN4, OUTPUT);
}
void loop()
{ 
for (int i = 0; i < 8; i++)
{
digitalWrite(AIN1, paso[i][0]);
digitalWrite(BIN1, paso[i][0]);

digitalWrite(AIN2, paso[i][1]);
digitalWrite(BIN2, paso[i][1]);

digitalWrite(AIN3, paso[i][2]);
digitalWrite(BIN3, paso[i][2]);

digitalWrite(AIN4, paso[i][3]);
digitalWrite(BIN4, paso[i][3]);
delay(1);
}
}

Con esto giran ambos a la vez, pero a una velocidad lenta (1 vuelta cada 4 segundos aproximadamente). No he logrado que giren si meto la matriz para las otras combinaciones de giro, vibran pero no giran los ejes.

// Secuencia de pasos
int paso [4][4] = //Recomendada por el fabricante (par máximo)
{
{1, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 1},
{1, 0, 0, 1},
};

o

// Secuencia de pasos
int paso [4][4] = //Modo "ola", par bajo y máxima velocidad
{
{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1},
};

Tambien modifico el bucle for con 4 en vez de 8 pasos para las matrices de “ola” y “par máximo”

Todo probado con varios motores y diversas placas driver (dispongo de 5) por lo que descartado que sean los motores o las placas.

Mis dudas son:
¿se pueden hacer funcionar varios motores a la vez con la librería stepper y como sería hacerlo a la máxima velocidad?

¿por qué no me funcionan los motores en modo “ola” o en la configuración del fabricante?

Realmente no necesito mucho par, necesito un poco más de velocidad. Leí por alguna página que alimentando a 12V se puede hacer que gire un poco más rápido, no decía como, y aunque lo dudo que se pueda, dejo la duda por si alguien me la puede responder.
Muchas gracias de antemano.

Se puede pero no con esa librería. Debes usar ésta librería AccelStepper Library

Destaco esto de la librería

You can create multiple AccelStepper objects, giving a unique name to each motor. AccelStepper can manage any number of motors, as long as you repetitively call their "run" functions.

Pruebala y nos cuentas.

AccelStepper significantly improves on the standard Arduino Stepper library in several ways:

Supports acceleration and deceleration Supports multiple simultaneous steppers, with independent concurrent stepping on each stepper API functions never delay() or block Supports 2, 3 and 4 wire steppers, plus 3 and 4 wire half steppers. Supports alternate stepping functions to enable support of AFMotor (https://github.com/adafruit/Adafruit-Motor-Shield-library) Supports stepper drivers such as the Sparkfun EasyDriver (based on 3967 driver chip) Very slow speeds are supported Extensive API Subclass support

Muchas gracias Surbyte por la respuesta. Como siempre, un placer.

He probado la librería que recomiendas y varios ejemplos que hay en ellas, y en otras páginas que he buscado y no he logrado hacer funcionar 2 motores a la vez a una buena velocidad, tal vez sea por falta de corriente, pero con el que puse que había modificado yo, funcionan a una velocidad de 15 RPM.
Con mi código llegan a funcionar 2 motores con la propia alimentación del puerto USB (aunque tambien la tengo externa 5V-1A).
Con la librería AccelStepper para que funcione sólo un motor tengo que usar alimentación externa obligatoriamente, ya que las pruebas con solo la alimentación por el USB no han funcionado (vibra pero no gira), por lo que deduzco que necesita más corriente si se usa la librería.
Con la librería he logrado que un solo motor gire a casi 30RPM, pero imposible hacerlo con más de uno (uno gira a 15rpm y el otro queda vibrando, pero no gira)
Por tanto intentaré solucionar el problema adaptando el código que puse. El secreto de la velocidad están en el úlitmo delay, si se ajusta a 2 gira más despacio, si se omite, no gira ninguno. He probado con delaymicrosec (xxx) y tampoco giran.

Iré viendo más cosillas a ver que puedo hacer.

Muchísimas gracias

Probar los motores usando la alimentación del arduino vía USB es sencillamente algo condenado al fracaso. Verifica los motores Incluso diría que 1A me parece limitado x lo que cuentas.

Lo raro es que con el programilla excitando directamente las bobinas, incluso con la alimentación del USB (que si no me equivoco son 250mA) se mueven a 15RPM los 2 a la vez. De cualquier manera, los alimento con la externa de 1A. Según la datasheet el consumo de los 28BYJ-48 es de unos 50mA, por lo que debe ser más que suficiente con 250mA..

Con la alimentación externa de 1A debería ser más que suficiente también, pero al usar la librería se ve que el consumo aumenta bastante (no entiendo muy bien por qué). Intentaré conseguir una de 1,5 o 2A a ver que pasa.

Probando he logrado hacerlos funcionar con las 3 configuraciones básicas, sólo que tenía que variar el valor del delay del final del bucle. El programa se me puede complicar un poco, pero creo que será posible con la excitación directa.

Muchas gracias de nuevo