Controlar motores mediante pulsador

Hola a todos, gracias de antemano.

Tengo una duda con un programa que estoy desarrollando para una instalación.
Quiero mover unos motores al pulsar un botón (en el futuro será un sensor de presencia), pero que éste se quede “bloqueado” hasta que terminan todas las ordenes a mis motores (una función que se repite solo 1 vez).

Esta función llamada parejas(); hace que los motores giren hacen una vuelta completa y vuelvan a la posición 0.

He estado buscando bastante por la red, pero creo que no busco realmente lo que necesito.

Os pego el codigo que tengo ahora. Ahora mismo mientras pulso, ejecuta la funcion parejas(); Pero los motores m1 y m2 no hacen la vuelta atrás.

Lo que necesito es que al pulsar una vez ejecute toda la función parejas(); y que los motores m1 y m2 hagan igual que el resto (ida y vuelta). Y cuando todos los motores han vuelto a 0, el boton pueda volver a ejecutar la función (mientras tanto no haga nada al pulsarlo).

#include <AccelStepper.h>
#define FULLSTEP 4
//CABLE (ROJO IN1 / AMARILLO IN2 / AZUL IN3/ BLANCO IN4)
AccelStepper m1(FULLSTEP, 2, 4, 3, 5); // IN1 IN3 IN2 IN4 (INVERTIR CENTRALES)
AccelStepper m2(FULLSTEP, 6, 8, 7, 9);
AccelStepper m3(FULLSTEP, 10, 12, 11, 13);
AccelStepper m4(FULLSTEP, 14, 16, 15, 17);
AccelStepper m5(FULLSTEP, 18, 20, 19, 21);
AccelStepper m6(FULLSTEP, 22, 24, 23, 25);
AccelStepper m7(FULLSTEP, 26, 28, 27, 29);
AccelStepper m8(FULLSTEP, 30, 32, 31, 33);
AccelStepper m9(FULLSTEP, 34, 36, 35, 37);
AccelStepper m10(FULLSTEP, 38, 40, 39, 41);
AccelStepper m11(FULLSTEP, 42, 44, 43, 45);
AccelStepper m12(FULLSTEP, 46, 48, 47, 49);

int estadoAnterior = 0;
int estadoActual;
int contador = 0;

int sube = 2048;
int baja = -2048;
int vuelta = 2048;
int tstart = 1000;
long tanterior = 0;
long intervalo = 1;
int incremento1 = 2000;
const int pulsadorPin = 53;
int valorPulsador = 0;
boolean onoff = false;
boolean motores = false;
//const int ledPin = 13;
unsigned long tactual = 0;
unsigned long counter = millis();

int estado = 0;
int estadoanterior = 0;



void setup(){
Serial.begin(19200);
pinMode(pulsadorPin, INPUT);
m1.setSpeed(200); 
m1.setMaxSpeed(4000);
m1.setAcceleration(200);
m2.setSpeed(200);
m2.setMaxSpeed(4000);
m2.setAcceleration(200);
m3.setSpeed(200);
m3.setMaxSpeed(4000);
m3.setAcceleration(200);
m4.setSpeed(200);
m4.setMaxSpeed(4000);
m4.setAcceleration(200);
m5.setSpeed(200); 
m5.setMaxSpeed(4000);
m5.setAcceleration(200);
m6.setSpeed(200); 
m6.setMaxSpeed(4000);
m6.setAcceleration(200);
m7.setSpeed(200); 
m7.setMaxSpeed(4000);
m7.setAcceleration(200);
m8.setSpeed(200); 
m8.setMaxSpeed(4000);
m8.setAcceleration(200);
m9.setSpeed(200); 
m9.setMaxSpeed(4000);
m9.setAcceleration(200);
m10.setSpeed(200); 
m10.setMaxSpeed(4000);
m10.setAcceleration(200);
m11.setSpeed(200); 
m11.setMaxSpeed(4000);
m11.setAcceleration(200);
m12.setSpeed(200); 
m12.setMaxSpeed(4000);
m12.setAcceleration(200);
}

void loop() { 
m1.run(); 
m2.run();
m3.run(); 
m4.run();
m5.run(); 
m6.run();
m7.run(); 
m8.run();
m9.run(); 
m10.run();
m11.run(); 
m12.run();

valorPulsador = digitalRead(pulsadorPin);
if (valorPulsador == HIGH) { 
  estado = 0;
  }
  else {
    estado = 1;
  if (estado < estadoanterior){
    estadoanterior = estado;
  }
  
}
Serial.println(estado);
if (estado >= 1) {
  parejas();
  //Serial.println(estado);
  if (m12.currentPosition() == vuelta){
      estado = 0;
  }
}

}


void parejas() {
m1.run(); 
m2.run();
m3.run(); 
m4.run();
m5.run(); 
m6.run();
m7.run(); 
m8.run();
m9.run(); 
m10.run();
m11.run(); 
m12.run();

m1.moveTo(sube);
m2.moveTo(sube);

if (m1.currentPosition() == 10){
  m3.moveTo(sube);
}
if (m2.currentPosition() == 10){
  m4.moveTo(sube);
}
if (m3.currentPosition() == 10){
  m5.moveTo(sube);
}
if (m4.currentPosition() == 10){
  m6.moveTo(sube);
}
if (m5.currentPosition() == 10){
  m7.moveTo(sube);
}
if (m6.currentPosition() == 10){
  m8.moveTo(sube);
}
if (m7.currentPosition() == 10){
  m9.moveTo(sube);
}
if (m8.currentPosition() == 10){
  m10.moveTo(sube);
}
if (m9.currentPosition() == 10){
  m11.moveTo(sube);
}
if (m10.currentPosition() == 10){
  m12.moveTo(sube);
}  


if (m1.currentPosition() == vuelta){
  m1.setCurrentPosition(0);
  m1.moveTo(baja); 
}
if (m2.currentPosition() == vuelta){
  m2.setCurrentPosition(0);
  m2.moveTo(baja);
}
if (m3.currentPosition() == vuelta){
  m3.setCurrentPosition(0);
  m3.moveTo(baja);  
}
if (m4.currentPosition() == vuelta){
  m4.setCurrentPosition(0);
  m4.moveTo(baja); 
}
if (m5.currentPosition() == vuelta){
  m5.setCurrentPosition(0);
  m5.moveTo(baja);
}
if (m6.currentPosition() == vuelta){
  m6.setCurrentPosition(0);
  m6.moveTo(baja);
}

if (m7.currentPosition() == vuelta){
  m7.setCurrentPosition(0);
  m7.moveTo(baja);
}
if (m8.currentPosition() == vuelta){
  m8.setCurrentPosition(0);
  m8.moveTo(baja);
}
if (m9.currentPosition() == vuelta){
  m9.setCurrentPosition(0);
  m9.moveTo(baja); 
}
if (m10.currentPosition() == vuelta){
  m10.setCurrentPosition(0);
  m10.moveTo(baja);  
}
if (m11.currentPosition() == vuelta){
  m11.setCurrentPosition(0);
  m11.moveTo(baja);
} 
if (m12.currentPosition() == vuelta){
  m12.setCurrentPosition(0);
  m12.moveTo(baja);
}
}

A ver si esta modificación resulta bien

#include <AccelStepper.h>
#define FULLSTEP 4
//CABLE (ROJO IN1 / AMARILLO IN2 / AZUL IN3/ BLANCO IN4)
AccelStepper m1(FULLSTEP, 2, 4, 3, 5); // IN1 IN3 IN2 IN4 (INVERTIR CENTRALES)
AccelStepper m2(FULLSTEP, 6, 8, 7, 9);
AccelStepper m3(FULLSTEP, 10, 12, 11, 13);
AccelStepper m4(FULLSTEP, 14, 16, 15, 17);
AccelStepper m5(FULLSTEP, 18, 20, 19, 21);
AccelStepper m6(FULLSTEP, 22, 24, 23, 25);
AccelStepper m7(FULLSTEP, 26, 28, 27, 29);
AccelStepper m8(FULLSTEP, 30, 32, 31, 33);
AccelStepper m9(FULLSTEP, 34, 36, 35, 37);
AccelStepper m10(FULLSTEP, 38, 40, 39, 41);
AccelStepper m11(FULLSTEP, 42, 44, 43, 45);
AccelStepper m12(FULLSTEP, 46, 48, 47, 49);

int contador = 0;

int sube          = 2048;
int baja          = -2048;
int vuelta        = 2048;
int tstart        = 1000;
long tanterior    = 0;
long intervalo    = 1;
int incremento1   = 2000;
const int pulsadorPin = 53;
bool valorPulsador, valorPulsadorAnt = false;
boolean onoff = false;
boolean motores = false;
//const int ledPin = 13;
unsigned long tactual = 0;
unsigned long counter = millis();

bool estado = 0;

void setup(){
  Serial.begin(19200);
  pinMode(pulsadorPin, INPUT);
  m1.setSpeed(200); 
  m1.setMaxSpeed(4000);
  m1.setAcceleration(200);
  m2.setSpeed(200);
  m2.setMaxSpeed(4000);
  m2.setAcceleration(200);
  m3.setSpeed(200);
  m3.setMaxSpeed(4000);
  m3.setAcceleration(200);
  m4.setSpeed(200);
  m4.setMaxSpeed(4000);
  m4.setAcceleration(200);
  m5.setSpeed(200); 
  m5.setMaxSpeed(4000);
  m5.setAcceleration(200);
  m6.setSpeed(200); 
  m6.setMaxSpeed(4000);
  m6.setAcceleration(200);
  m7.setSpeed(200); 
  m7.setMaxSpeed(4000);
  m7.setAcceleration(200);
  m8.setSpeed(200); 
  m8.setMaxSpeed(4000);
  m8.setAcceleration(200);
  m9.setSpeed(200); 
  m9.setMaxSpeed(4000);
  m9.setAcceleration(200);
  m10.setSpeed(200); 
  m10.setMaxSpeed(4000);
  m10.setAcceleration(200);
  m11.setSpeed(200); 
  m11.setMaxSpeed(4000);
  m11.setAcceleration(200);
  m12.setSpeed(200); 
  m12.setMaxSpeed(4000);
  m12.setAcceleration(200);
  }

void loop() { 
  m1.run(); 
  m2.run();
  m3.run(); 
  m4.run();
  m5.run(); 
  m6.run();
  m7.run(); 
  m8.run();
  m9.run(); 
  m10.run();
  m11.run(); 
  m12.run();

  valorPulsador = digitalRead(pulsadorPin);
  if (valorPulsador && valorPulsadorAnt) { 
      estado = true;
      Serial.println(estado);
  }
  valorPulsadorAnt = valorPulsador;


  if (estado) {
      parejas();
  }
}

void parejas() {
  // m1.run();  // para mi ya lo tienes en loop, no hace falta repetirlo
  // m2.run();
  // m3.run(); 
  // m4.run();
  // m5.run(); 
  // m6.run();
  // m7.run(); 
  // m8.run();
  // m9.run(); 
  // m10.run();
  // m11.run(); 
  // m12.run();

  m1.moveTo(sube);
  m2.moveTo(sube);

  if (m1.currentPosition() == 10){
      m3.moveTo(sube);
  }
  if (m2.currentPosition() == 10){
      m4.moveTo(sube);
  }
  if (m3.currentPosition() == 10){
      m5.moveTo(sube);
  }
  if (m4.currentPosition() == 10){
      m6.moveTo(sube);
  }
  if (m5.currentPosition() == 10){
      m7.moveTo(sube);
  }
  if (m6.currentPosition() == 10){
      m8.moveTo(sube);
  }
  if (m7.currentPosition() == 10){
      m9.moveTo(sube);
  }
  if (m8.currentPosition() == 10){
      m10.moveTo(sube);
  }
  if (m9.currentPosition() == 10){
      m11.moveTo(sube);
  }
  if (m10.currentPosition() == 10){
      m12.moveTo(sube);
  }  


  if (m1.currentPosition() == vuelta){
      m1.setCurrentPosition(0);
      m1.moveTo(baja); 
  }
  if (m2.currentPosition() == vuelta){
      m2.setCurrentPosition(0);
      m2.moveTo(baja);
  }
  if (m3.currentPosition() == vuelta){
      m3.setCurrentPosition(0);
      m3.moveTo(baja);  
  }
  if (m4.currentPosition() == vuelta){
      m4.setCurrentPosition(0);
      m4.moveTo(baja); 
  }
  if (m5.currentPosition() == vuelta){
      m5.setCurrentPosition(0);
      m5.moveTo(baja);
  }
  if (m6.currentPosition() == vuelta){
      m6.setCurrentPosition(0);
      m6.moveTo(baja);
  }

  if (m7.currentPosition() == vuelta){
      m7.setCurrentPosition(0);
      m7.moveTo(baja);
  }
  if (m8.currentPosition() == vuelta){
      m8.setCurrentPosition(0);
      m8.moveTo(baja);
  }
  if (m9.currentPosition() == vuelta){
      m9.setCurrentPosition(0);
      m9.moveTo(baja); 
  }
  if (m10.currentPosition() == vuelta){
      m10.setCurrentPosition(0);
      m10.moveTo(baja);  
  }
  if (m11.currentPosition() == vuelta){
      m11.setCurrentPosition(0);
      m11.moveTo(baja);
  } 
  if (m12.currentPosition() == vuelta){
      m12.setCurrentPosition(0);
      m12.moveTo(baja);
      estado = false;
      Serial.println(estado);
  }
}

Para la próxima observa que mi código esta con identación o sangría y el tuyo no. Intenta ayudarnos porque luego para entenderlo uno debe perder tiempo ajustándolo para saber/conocer donde empieza y terminca cada for, if, while.

Gracias surbyte por tu pronta respuesta. Pruebo y comento.

Muchas gracias, ha funcionado perfectamente.

Finalmente este es el código para el pulsador

void loop() { 

valorPulsador = digitalRead(pulsadorPin);
  if (valorPulsador && valorPulsadorAnt) {
      estado = true;
  }
  valorPulsadorAnt = valorPulsador;

if (estado) {
  parejas();
  }

}

Y decir, que he tenido que cambiar en la parte del final, cuando el ultimo motor se para, con lo siguiente:

if (m12.currentPosition() == baja){
    motores = true;  //Este parametro lo vuelvo a dejar en true, para pueda iniciar los motores m1 y m2 al entrar en parejas();
    estado = false;
    m1.setCurrentPosition(0); 
    m2.setCurrentPosition(0);
    m3.setCurrentPosition(0); 
    m4.setCurrentPosition(0);
    m5.setCurrentPosition(0);
    m6.setCurrentPosition(0);
    m7.setCurrentPosition(0);
    m8.setCurrentPosition(0);
    m9.setCurrentPosition(0);
    m10.setCurrentPosition(0);
    m11.setCurrentPosition(0);
    m12.setCurrentPosition(0); //Posiciono todos los motores manualmente en posicion 0.
    
}

Posteo el código completo, por si puede ser de ayuda para alguien. Considero que se debe cambiar el titulo del post por algo como “control de motores mediante pulsador”

#include <AccelStepper.h>
#define FULLSTEP 4
//CABLE (ROJO IN1 / AMARILLO IN2 / AZUL IN3/ BLANCO IN4)
AccelStepper m1(FULLSTEP, 2, 4, 3, 5); // IN1 IN3 IN2 IN4 (INVERTIR CENTRALES)
AccelStepper m2(FULLSTEP, 6, 8, 7, 9);
AccelStepper m3(FULLSTEP, 10, 12, 11, 13);
AccelStepper m4(FULLSTEP, 14, 16, 15, 17);
AccelStepper m5(FULLSTEP, 18, 20, 19, 21);
AccelStepper m6(FULLSTEP, 22, 24, 23, 25);
AccelStepper m7(FULLSTEP, 26, 28, 27, 29);
AccelStepper m8(FULLSTEP, 30, 32, 31, 33);
AccelStepper m9(FULLSTEP, 34, 36, 35, 37);
AccelStepper m10(FULLSTEP, 38, 40, 39, 41);
AccelStepper m11(FULLSTEP, 42, 44, 43, 45);
AccelStepper m12(FULLSTEP, 46, 48, 47, 49);
int velocidad = 200;
int accel = 500;
int maxvel = 1000;
int sube = 2048;
int baja = -2048;
int vuelta = 2048;
int incremento1 = 200;
const int pulsadorPin = 53;

boolean onoff = false;
boolean motores = true;
boolean valorPulsador = false;
boolean valorPulsadorAnt = false;
bool estado = 0;



void setup(){
Serial.begin(19200);
pinMode(pulsadorPin, INPUT);
m1.setSpeed(velocidad); 
m1.setMaxSpeed(maxvel);
m1.setAcceleration(accel);
m2.setSpeed(velocidad);
m2.setMaxSpeed(maxvel);
m2.setAcceleration(accel);
m3.setSpeed(velocidad);
m3.setMaxSpeed(maxvel);
m3.setAcceleration(accel);
m4.setSpeed(velocidad);
m4.setMaxSpeed(maxvel);
m4.setAcceleration(accel);
m5.setSpeed(velocidad); 
m5.setMaxSpeed(maxvel);
m5.setAcceleration(accel);
m6.setSpeed(velocidad); 
m6.setMaxSpeed(maxvel);
m6.setAcceleration(accel);
m7.setSpeed(velocidad); 
m7.setMaxSpeed(maxvel);
m7.setAcceleration(accel);
m8.setSpeed(velocidad); 
m8.setMaxSpeed(maxvel);
m8.setAcceleration(accel);
m9.setSpeed(velocidad); 
m9.setMaxSpeed(maxvel);
m9.setAcceleration(accel);
m10.setSpeed(velocidad); 
m10.setMaxSpeed(maxvel);
m10.setAcceleration(accel);
m11.setSpeed(velocidad); 
m11.setMaxSpeed(maxvel);
m11.setAcceleration(accel);
m12.setSpeed(velocidad); 
m12.setMaxSpeed(maxvel);
m12.setAcceleration(accel);

}

void loop() { 
m1.run(); 
m2.run();
m3.run(); 
m4.run();
m5.run(); 
m6.run();
m7.run(); 
m8.run();
m9.run(); 
m10.run();
m11.run(); 
m12.run();


valorPulsador = digitalRead(pulsadorPin);
  if (valorPulsador && valorPulsadorAnt) {
      estado = true;
  }
  valorPulsadorAnt = valorPulsador;

if (estado) {
  parejas();
  }

}



void parejas() {
m1.run(); 
m2.run();
m3.run(); 
m4.run();
m5.run(); 
m6.run();
m7.run(); 
m8.run();
m9.run(); 
m10.run();
m11.run(); 
m12.run();

  if (motores == true){
    m1.moveTo(sube);
    m2.moveTo(sube);
  }
motores=false;

  if (m1.currentPosition() == incremento1){
    m3.moveTo(sube);
  }
  if (m2.currentPosition() == incremento1){
    m4.moveTo(sube);
  }
  if (m3.currentPosition() == incremento1){
    m5.moveTo(sube);
  }
  if (m4.currentPosition() == incremento1){
    m6.moveTo(sube);
  }
  if (m5.currentPosition() == incremento1){
    m7.moveTo(sube);
  }
  if (m6.currentPosition() == incremento1){
    m8.moveTo(sube);
  }
  if (m7.currentPosition() == incremento1){
    m9.moveTo(sube);
  }
  if (m8.currentPosition() == incremento1){
    m10.moveTo(sube);
  }
  if (m9.currentPosition() == incremento1){
    m11.moveTo(sube);
  }
  if (m10.currentPosition() == incremento1){
    m12.moveTo(sube);
  }  

  if (m1.currentPosition() == vuelta){
    m1.setCurrentPosition(0);
    m1.moveTo(baja); 
  }

  if (m2.currentPosition() == vuelta){
    m2.setCurrentPosition(0);
    m2.moveTo(baja);
  }

  if (m3.currentPosition() == vuelta){
    m3.setCurrentPosition(0);
    m3.moveTo(baja);  
  }
  if (m4.currentPosition() == vuelta){
    m4.setCurrentPosition(0);
    m4.moveTo(baja); 
  }
  if (m5.currentPosition() == vuelta){
    m5.setCurrentPosition(0);
    m5.moveTo(baja);
  }
  if (m6.currentPosition() == vuelta){
    m6.setCurrentPosition(0);
    m6.moveTo(baja);
  }

  if (m7.currentPosition() == vuelta){
    m7.setCurrentPosition(0);
    m7.moveTo(baja);
  }
  if (m8.currentPosition() == vuelta){
    m8.setCurrentPosition(0);
    m8.moveTo(baja);
  }
  if (m9.currentPosition() == vuelta){
    m9.setCurrentPosition(0);
    m9.moveTo(baja); 
  }
  if (m10.currentPosition() == vuelta){
    m10.setCurrentPosition(0);
    m10.moveTo(baja);  
  }
  if (m11.currentPosition() == vuelta){
    m11.setCurrentPosition(0);
    m11.moveTo(baja);
  } 
  if (m12.currentPosition() == vuelta){
    m12.setCurrentPosition(0);
    m12.moveTo(baja);
  }

  if (m12.currentPosition() == baja){
    motores = true;
    estado = false;
    m1.setCurrentPosition(0); 
    m2.setCurrentPosition(0);
    m3.setCurrentPosition(0); 
    m4.setCurrentPosition(0);
    m5.setCurrentPosition(0);
    m6.setCurrentPosition(0);
    m7.setCurrentPosition(0);
    m8.setCurrentPosition(0);
    m9.setCurrentPosition(0);
    m10.setCurrentPosition(0);
    m11.setCurrentPosition(0);
    m12.setCurrentPosition(0);
  }
}

Cámbialo, ya te di herramientas para que lo hagas en el privado, y ademas es la misma herramienta que lees en las normas del foro, 1er hilo de esta sección y de todas.

Gracias por completar la solución pero voe que vuelves a repetir esto en el loop y en parejas()

m1.run(); 
m2.run();
m3.run(); 
m4.run();
m5.run(); 
m6.run();
m7.run(); 
m8.run();
m9.run(); 
m10.run();
m11.run(); 
m12.run();

para que lo repites?
Si esta en loop no hace falta en parejas()

surbyte, repito esto en el loop y en la función porque si no no me funcionan los motores.

He probado a quitarlos del loop y a quitarlos de parjas() y en ningun caso funcionan.

Gracias!