Hola a toda la comunidad.
A ver si me podéis sacar de un atasco.
Estoy haciendo un sistema en el que dos motores 28BYJ con driver unl2003 controlan el poner y quitar cada uno una tapa. Sin fines de carrera ni nada similar, sólo un movimiento en steps equivalente a 3/4 de vuelta en un sentido para abrir , y lo mismo en el otro sentido para cerrar.
Hasta ahora lo estaba probando con 2 botones por motor, abrir1 cerrar1, y abrir2 y cerrar2, por decirlo así.
El sistema realmente consta también de un relé para activar una luz y un sensor de temperatura y humedad. Todo me funciona correctamente, no sólo el código, sino también el prototipo física y eléctricamente montado. (Me falta añadir una mini pantalla oled.)
Está pensado para hacerlo funcionar de forma remota, pero también con los pulsadores poder hacerlo físicamente. Para el control remoto tengo un para de instrucciones que se envían por serial para ejecutar las acciones.
La cuestión es que me gustaría/necesito reducir los botones, y que el abrir y cerrar se pueda hacer sólo con un pulsador, y ahí es donde estoy volviéndome loco porque no me sale nada bien, o sigue girando el motor, o me arranca nada mas conectarse, o sigue el bucle infinito,.....
De programación mis conocimientos son cero, de arduino similar, sólo copia y pega + ensayo-error, así que después de probar mil ejemplos me sigue saliendo mal.
¿cómo puedo hacer que alterne el movimiento con un sólo pulsador y que además me reaccione bien a las ordenes enviadas por serial?.
Lo dicho, espero haber formulado la petición en forma y modo correcto. Y gracias por anticipado por dedicarme vuestro tiemp.
Tengo la simulación simple aquí:
Y os pongo (espero que bien) el código simplificado, con sólo un motor
escribe o pega el código aquí
#include <Button.h>
#include <AccelStepper.h>
Button AbrirRojo(A0);
Button CerrarRojo(A1);
#define IN5 8
#define IN6 7
#define IN7 6
#define IN8 5
int option; //para mandar mensajes
// STEPS DEL GIRO y sus pines . Revisar al montar.
const int stepsPerRevolution1 = 150;
AccelStepper MotorRojo(AccelStepper::FULL4WIRE, IN5, IN7, IN6, IN8);
void setup() {
pinMode(A1, INPUT_PULLUP); // boton cerrar rojo
pinMode(A0, INPUT_PULLUP); // boton abrir rojo
// VELOCIDAD DE CADA MOTOR
MotorRojo.setMaxSpeed(500);
MotorRojo.setAcceleration(20);
MotorRojo.setSpeed(100);
Serial.begin(9600);
}
void loop() {
// MOTOR 1
if (AbrirRojo.pressed()){
Serial.println("abriendo rojo");
MotorRojo.move(-stepsPerRevolution1 );
MotorRojo.runToPosition();
}
if (CerrarRojo.pressed()){
Serial.println("cerrando rojo");
MotorRojo.move(stepsPerRevolution1 );
MotorRojo.runToPosition();
}
// para mandar la acción via serial
if (Serial.available()>0){
option=Serial.read();
if(option=='a') {
Serial.println("abriendo rojo");
MotorRojo.move(-stepsPerRevolution1 );
MotorRojo.runToPosition();
}
if(option=='b') {
Serial.println("cerrando rojo");
MotorRojo.move(stepsPerRevolution1 );
MotorRojo.runToPosition();
}
}
}