Hola a todos.
Estoy usando el motor 28BYJ-48 con el driver ULN2003A y la librería Stepper. Considerando que si ejecuto el método stepper.step(PASOS), por ejemplo 2048 pasos, no se ejecutan las acciones sucesivas en el código hasta que el motor termine de dar los 2048 pasos; he intentado lograrlo poniendo un paso y un delay en cada ciclo del loop hasta llegar a 2048, por ejemplo:
void loop() {
if ( PASOS < 2048 ) {
stepper.step(1);
delay(10);
PASOS++;
}
// … otras accione como analogRead y digitalWrite bajo condiciones
}
pero eso me funciona bien solo si Arduino (UNO) está conectado por USB al ordenador, si lo dejo solo con una fuente de alimentación (12 V, 1 A) entonces hace cosas extrañas en las acciones sucesivas a la rotación del motor; se descontrola, a veces inicia bien pero igual después de unos segundos se descontrola. Imagino que este último problema tenga que ver con frecuencia y gestión de pulsos.
No se si sea útil saberlo, las conexiones están en una proto shield.
Por favor pueden decirme cómo puedo lograr el propósito de ejecutar otras acciones mientras el motor de pasos está girando, sin que se presenten problemas como el que he mencionado? Agradezco de antemano.
Lo primero sería dejar de usar delay porque una acción como la que propones de 2048 pasos multiplica el tiempo de 10 mseg x 2048 o sea 20480 mseg lo que se traduce en 20.48 segundos
Entonces la solución siempre es usar millis().
byte estado = 0;
int pasos = 0;
unsigned long tiempoStep;
void setup() {
// lo que tengas que hacer acá
}
void loop() {
while (estado) {
case 0: if (pasos < 2048)
stepper.step(1);
estado = 1;
tiempoStep = millis();
}
break;
case 1: if (millis()-tiempoStep > 10UL) {
pasos++;
estado = 0;
}
break;
}
}
// … otras accione como analogRead y digitalWrite bajo condiciones
}
Respecto al problema de hardware o sea cuando lo alimentas con fuente externa, luce como que tu fuente externa no anda bien. Revisa la tensión con un tester/multímetro. Asegúrate que lees en DC algo cercano a los 12.
Luego coloca el tester en AC y mide cual es la componente de tensión. Debe ser baja de pocos mV si es de 100tos de mV no esta bien, y tienes filtro o rectificador dañados.
Dinos donde conectas la fuente, conector externo o por Vin?
@Surbyte antes que todo agradezco tu respuesta y solución, que implementaré en lo inmediato. Respecto a la fuente, la conecto al conector Jack, y vale la pena evidenciar que el problema se presenta también si uso una batería de 9V, siempre usando el conector Jack.
No uses bateria de 9V no sirven para lo que mencionas.
Como alimentas el motor? Hace falta un esquema para entender que estas haciendo.
Ya te he entendido que funciona con USB pero cuando lo alimentas via fuente externa se comporta raro.
Todo hace pensar que tu fuente tiene algun problema, no respondes a las preguntas que te hice sobre la fuente.
Justamente estaba midiendo, da 12,01 V en DC y 0,006 V en AC. El motor lo tengo conectado al pin 5V de Arduino.
Alimentado por USB, mide el consumo sobre el cable de 5V que alimenta al módulo.
Sospecho que el problema puede deberse a un exceso de consumo.
Alimentado por USB, mientras el puerto entregue corriente suficiente (típicamente 500 mA) no hay inconvenientes pero al alimentarlo con 12V le pedimos al regulador de la placa que mantenga una caída de tensión de 7V (para que estabilice en 5V).
Esos 7V multiplicados por los mA que consuma el motor más el consumo del propio Uno (asumamos 30 mA) va a darnos la potencia disipada, y si esta excede la que soporta el regulador...
Luce todo bien, incluso las lecturas de DC y AC estan bien para tu fuente.
Qué raro que haga cosas raras cuando alimentes con dicha fuente!!
Hemos discutido muchas veces el tema del consumo y coincidimos en que 400mA puede entregar el regulador.
Prueba a ver si cuando esta con la fuente externa se calienta el regulador.
Sabes donde esta?
@anon90500195 gracias por tu respuesta y sugerencia. Alimentando por USB la corriente en el cable de 5 V que alimenta el motor es de 267 mA. Cuando alimento con fuentes de 12 V (una de 1A y otra de 2 A) el consumo de corriente comienza estable en 260 mA, después comienza a variar (hacia abajo y llega más o menos a 160 mA) podrás verlo en el 2do video que estoy por compartir.
@Surbyte el proyecto está montado en una estructura y para acceder al regulador tendré que desmontarlo todo, prefiero dejar eso como última opción. Implementé la solución que propones como se ve en el siguiente código, quité todas las otras cosas del proyecto dejando solo lo relativo al motor de pasos:
#include <Stepper.h>
// STEPPER MOTOR PINS
int STEPPER_1 = 5;
int STEPPER_2 = 6;
int STEPPER_3 = 7;
int STEPPER_4 = 8;
int STEPS = 2048;
int STEPPER_SPEED = 2; // 1 OR 2 OR 3
int CNT_STEPS = 0;
unsigned long STEP_TIME;
byte STATE = 0;
Stepper stepper(STEPS, STEPPER_1, STEPPER_3, STEPPER_2, STEPPER_4);
void setup() {
pinMode(STEPPER_1, OUTPUT);
pinMode(STEPPER_2, OUTPUT);
pinMode(STEPPER_3, OUTPUT);
pinMode(STEPPER_4, OUTPUT);
stepper.setSpeed(STEPPER_SPEED);
}
void timer() {
switch (STATE) {
case 0: if (CNT_STEPS < STEPS) {
stepper.step(1);
STATE = 1;
STEP_TIME = millis(); }
else {
digitalWrite(STEPPER_1, LOW);
digitalWrite(STEPPER_2, LOW);
digitalWrite(STEPPER_3, LOW);
digitalWrite(STEPPER_4, LOW);
}
break;
case 1: if (millis()-STEP_TIME > 10UL) {
CNT_STEPS++;
STATE = 0;
}
break;
}
}
void loop() {
timer();
}
El problema persiste.
Para asegurarme de que el problema no sea la fuente lo intenté con otra fuente de 12V y 2 A; medí 11,91 V en DC y 0,007 A en AC.
Seguidamente compartiré 2 videos (tengo que cargarlos en YouTube), en el primero mostraré el comportamiento del motor si Arduino está conectado por USB al ordenador (OK, 2048 en un giro perfecto), mientras que en el segundo mostraré el comportamiento del motor cuando desconecto del ordenador y solo queda la fuente de alimentación. En este segundo caso, como se podrá ver, el motor comienza a hacer pausas (la corriente baja hasta llegar más o menos a 160 mA) y no se detiene cuando termina el giro (2048 pasos), continua girando infinitamente.
Información adicional, y esto es muy raro: si cuando está descontrolado (2do video a partir de los 30 seg) conecto el USB, vuelve instantáneamente a la normalidad, deja de hacer pausas, la corriente vuelve a estabilizarse y concluye en un solo giro.
Para mi que está actuando la protección térmica del regulador justamente por lo que te expliqué antes.
Está muy al límite de la potencia que soporta el regulador. Está cerca de 300 mA de consumo total por 7V de caída, son unos 2100 mW.
Alimenta el módulo del motor con una fuente independiente (masa unida con la del arduino, obviamente) y seguramente funcionará bien.
Tocaste el regulador con el dedo para ver si esta caliente?
Confirmo que están en lo cierto, en primer lugar logré, con mucha dificultad debido a la estructura del proyecto, llegar a tocar el regulador con el dedo meñique y estaba muy caliente.
Desgraciadamente no me conviene alimentar el motor por separado ya que tendría que adicionar un regulador de voltaje para bajar de los 12 V de la fuente a los 5 V con los que trabaja el motor; eso aumenta el costo del proyecto. Entonces hice una prueba con una fuente de voltaje menor (9 V - 1,5 A) considerando que en este caso la caída de tensión en el regulador de Arduino sería de 4 V, que multiplicado por los 260 mA consumidos por el motor serían 1040 mW. Resultado satisfactorio, el comportamiento fue el esperado, idéntico al obtenido alimentando con USB y sin tener que adicionar un regulador de voltaje para alimentar el motor por separado. Aunque sigo teniendo el mismo problema; para identificar lo que estaba pasando aislé todo el código no relacionado con el motor de pasos, y con ello eliminé el consumo del resto de los componentes del proyecto, que alcanza aproximadamente 450 mA. Esto quiere decir que con todos los componentes conectados y funcionando con una fuente de 9V, la caída de 4V multiplicada por los 450 mA lleva nuevamente al limite el regulador de voltaje de Arduino. Entonces tendré que utilizar una fuente de 6V.
@Surbyte y @anon90500195 les estoy muy agradecido, gracias a ustedes he encontrado el problema y aprendido un aspecto muy importante de Arduino.
No te preocupes, nos pasa a todos.
Alguna vez comenté que tuve un problema más grave, directamente se quemaban los reguladores. Tensión correcta (según creía), corriente también. Mi grave error era que no tenía en cuenta la potencia, que era excesiva, y por eso "cocinaba" los reguladores.
Desde entonces siempre leo bien las hojas de datos de los componentes que voy a utilizar, no solo la parte que "me gusta". 
Atento que el voltaje mínimo tiene que ser 7V sino sino el regulador no llega a mantener la tensión en 5V.
¿Por qué no usas un módulo step-down? Son realmente baratos, pequeños y manejan una corriente más que suficiente.
Además lo puedes ajustar a la tensión que más te convenga, 5V directamente o 7V y alimentas por Vin.
Saludos
Si, tengo módulos step-down, el problema es que no me cabe en la estructura que ya había diseñado, imprimido y montado para el prototipo del proyecto. Lo que haré será presentar el prototipo usando una fuente de doble salida (12 V y 5 V) y ya ajustaré el diseño final cuando llegue su hora.
De nuevo gracias.
¿Uno de estos con el MP1584 tampoco entra?
Son unas miniaturas de alrededor de 22 x 17 mm y 4 mm de altura

Saludos