mover motores PAP simultáneamente

HOLA gente estoy tratando de hacer un proyecto para mover motores simultaneamente a diferentes velocidades y direcciones, lo que he logrado es moverlos al mismo tiempo pero en igual velocidad y direccion , aqui miestro el codigo, los 2 motores estan conectados a drivers a4988

#define VELOCIDAD 1700


int steps = 2;
int direccion = 3;
int steps1 = 6;
int direccion1 = 7;
int reset = 10;
int pasos = 1500;

// the setup routine runs once when you press reset:
void setup() {                
 // initialize the digital pin as an output.
 pinMode(steps, OUTPUT); 
 pinMode(direccion, OUTPUT);
 pinMode(steps1, OUTPUT); 
 pinMode(direccion1, OUTPUT);  
 pinMode(reset, OUTPUT);
}

// La rutina de bucle se ejecuta una y otra vez para siempre:
void loop() {
 digitalWrite(reset, LOW);    //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
 delay(100);
 digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.


 
 digitalWrite(direccion, HIGH);
 digitalWrite(direccion1, LOW);
   

 for (int i = 0; i<500; i++)       //Equivale al numero de vueltas que quiero que haga. sabiendo que int pasos en 1500, 1500 seria el maxmo
 {
   digitalWrite(steps, HIGH);  // TEste cambio BAJO a ALTO es lo que crea la
   digitalWrite(steps, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
   digitalWrite(steps1, HIGH);  // TEste cambio BAJO a ALTO es lo que crea la
   digitalWrite(steps1, LOW); // al A4988 de avanzar una vez por cada pulso de energia.    
   delayMicroseconds(1000);     // Regula la velocidad, cuanto mas bajo mas velocidad.

 } 
 
 digitalWrite(reset, LOW);   //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
 delay(100);
 digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.



 
 digitalWrite(direccion, LOW);
 digitalWrite(direccion1, HIGH);

 
 for (int i = 0; i<pasos; i++)       //Equivale al numero de vueltas (200 es 360º grados) o micropasos
 {
     
   digitalWrite(steps, LOW);   // LOW to HIGH hace que el motor avance ya que da la orden
   digitalWrite(steps, HIGH);    // al A4988 de avanzar una vez por cada pulso de energia.
   digitalWrite(steps1, LOW);   // LOW to HIGH hace que el motor avance ya que da la orden
   digitalWrite(steps1, HIGH);    // al A4988 de avanzar una vez por cada pulso de energia.
   delayMicroseconds(VELOCIDAD);         // Regula la velocidad, cuanto mas bajo mas velocidad.
 }

 
}

No pongas todo en negrita. Hay unos tags en el editor para poner código (Está en las normas del foro)
Primer icono que se ve con los signos </>

En cuanto a lo de cambiar las velocidades y sentido hay muchos ejemplos en internet.

perdon es mi primer post... gracias por la info pero eso hace lo mismo que el codigo que yo he puesto, mueve solo un motor o a lo sumo varios motores pero siempre en el mismo sentido y velocidad, o sino uno a la ves

darioreyes: perdon es mi primer post... gracias por la info pero eso hace lo mismo que el codigo que yo he puesto, mueve solo un motor o a lo sumo varios motores pero siempre en el mismo sentido y velocidad, o sino uno a la ves

Hombre, por supuesto tendrás que adaptarlo para tus necesidades. Si tienes como ejemplo uno yo creo que puedes hacer un segundo... :o

tengo como ejemplo uno, pero quiero que el segundo se mueva simultaneo con el primero pero a diferente velocidad y dirección, y no lo he logrado

Hola darioreyes, yo entiendo el problema que tienes, ¿avanzaste algo después del último comentario? Tengo entendido que para SIMULAR el movimiento simultaneo en un procesador con un solo núcleo hay que hacer uso de los timers, que son interrupciones por software, básicamente se activan cada cierto tiempo preestablecido sin "bloquear" el procesador como lo hace el delay. Cada procesador tiene ciertos timers asociados a pines específicos del mismo.

Si has conseguido algún avance te agradecería que lo compartieras pues yo tengo un problema similar. Un saludo.

Buenas tardes,

A ver si puedo ayudar porque, al final, solo soy 20 minutos menos novato que vosotros.

Yo tengo una necesidad parecida ya que, aunque con un solo motor, necesito leer botones y sensores continuamente a la vez que muevo el motor.

Intento explicarme:

  • Utilizo la librería STEPPER (no AccelStepper) que con una sola instrucción mueves el motor los pasos que quieras. Puedes declarar 3 ó 4 motores o los que quieras (declarar, instanciar o como se llame).

  • Como he visto que en muchos ejemplos programan un mínimo delay después de cada movimiento (ó juego de HIGH y LOW), he decidido usar este tiempo para ejecutar otro código.

  • Controlo una variable que me dice en que punto está el motor teniendo en cuenta los pasos adelante y atrás que ha dado hasta el momento.

  • Inicio el LOOP leyendo todos los botones y sensores procurando que sea de manera rápida y eficiente. Los proceso y me da como resultado donde debe estar el motor. Comparo con donde está y lo muevo.

  • El truco está en que le mando que mueva UN SOLO PASO, actualice la variable de posición y siga con el resto del Loop, vuelva a empezar y decidir, de nuevo, si tiene que mover el motor. El código se ejecuta tan rápido que el resultado es un movimiento aparentemente contínuo del motor obteniendo el efecto de un procesado "multitasking".

Si tenéis que mover varios motores, creo que mandando un paso (o un pequeño número de ellos), conseguiríais efecto de simultaneidad.

Se puede parametrizar la velocidad y el número de pasos por vuelta de cada motor indistintamente.

No adjunto el código porque lo tengo muy liado con lineas de instrucciones contradictorias que comento y descomento en función del las pruebas que esté haciendo en cada momento. Si os interesa, podría hacer una versión reducida para mostrároslo.

Si alguien ve que mi propuesta es "una barbaridad", agradeceremos todos que nos lo diga y podremos aprender algo más.

Quedo a vuestra disposición por si queréis profundizar en el tema.

Saludos

-