proyecto movimiento dos motores bipolares con joystick

Hola a tod@s,

Llevo días buscando info en la red pero no consigo lo que necesito y lo que he encontrado no funciona, es por ello que necesito de vuestra ayuda.
La idea es poder controlar dos motores con un joystick de forma que según la dirección y la presión muevan los ejes “x” “y” de la plataforma de una fresadora,

El material del que dispongo es de arduino uno, 2xDRV8825 y motores nema 17 de 1.6a.

este es el código que he encontrado

#include <AccelStepper.h>
#include <Bounce2.h>


const int ledEnable = 13; 
const int pinSwEnable = 7;  
const int pinEnable = 8;  

unsigned long debounceDelay = 10; 
const int jX = A0;  
const int stepX = 3;  
const int dirX = 4; 
long speedX, valX, mapX;  
const int jY = A1;  
const int stepY = 5;  
const int dirY = 6; 
long speedY, valY, mapY;  

const int maxSpeed = 1000;  
const int minSpeed = 0; 
const float accelerazione = 50.0; 
const int treshold = 30;  
long tresholdUp, tresholdDown;  
boolean abilitato, muoviX, muoviY, enable;  

Bounce btnEnable = Bounce();  

AccelStepper motoreX(AccelStepper::DRIVER, stepX, dirX);
AccelStepper motoreY(AccelStepper::DRIVER, stepY, dirY);

void setup() {

  speedX = speedY = 0;
  enable = false;

 
  pinMode(ledEnable, OUTPUT);
  pinMode(pinEnable, OUTPUT);

  pinMode(pinSwEnable, INPUT_PULLUP); 
  digitalWrite(ledEnable, enable);
  digitalWrite(pinEnable, !enable); 

  
  btnEnable.interval(debounceDelay);

  
  tresholdDown = (maxSpeed / 2) - treshold;
  tresholdUp = (maxSpeed / 2) + treshold;

  
  motoreX.setMaxSpeed(maxSpeed);
  motoreX.setSpeed(minSpeed);
  motoreX.setAcceleration(accelerazione);

  motoreY.setMaxSpeed(maxSpeed);
  motoreY.setSpeed(minSpeed);
  motoreY.setAcceleration(accelerazione);
}

void loop() {

  
  checkEnable();

  digitalWrite(ledEnable, enable);  
  digitalWrite(pinEnable, !enable); 

  
  valX = analogRead(jX);
  valY = analogRead(jY);

  
  mapX = map(valX, 0, 1023, minSpeed, maxSpeed);
  mapY = map(valY, 0, 1023, minSpeed, maxSpeed);

  
  pilotaMotori(mapX, mapY);

}

void pilotaMotori(long mapX, long mapY) {

  if (mapX <= tresholdDown) {
    
    speedX = -map(mapX, tresholdDown, minSpeed,   minSpeed, maxSpeed);
    muoviX = true;
  } else if (mapX >= tresholdUp) {
    
    speedX = map(mapX,  maxSpeed, tresholdUp,  maxSpeed, minSpeed);
    muoviX = true;
  } else {
    
    speedX = 0;
    muoviX = false;
  }

  if (mapY <= tresholdDown) {
    
    speedY = -map(mapY, tresholdDown, minSpeed,   minSpeed, maxSpeed);
    muoviY = true;
  } else if (mapY >= tresholdUp) {
    
    speedY = map(mapY,  maxSpeed, tresholdUp,  maxSpeed, minSpeed);
    muoviY = true;
  } else {
    
    speedY = 0;
    muoviY = false;
  }

  if (muoviX) {
    motoreX.setSpeed(speedX);
    motoreX.run();
  } else {
    motoreX.stop();
  }

  if (muoviY) {
    motoreY.setSpeed(speedY);
    motoreY.run();
  } else {
    motoreY.stop();
  }
}


void checkEnable() {

  btnEnable.update();

  if (btnEnable.fell()) {
    enable = !enable;
  }

}

y una foto de la conexiones pero no mueven los motores, realmento soy muy novato y no se donde puede estar el fallo, incluso si seria mejor empezar de 0 (aunque esto se me hace un mundo)

gracias de antemano

Gracias por postear código e imagen con etiquetas. Muevo el hilo porque no pertenece a la sección Proyectos.
Movido a Software.

Si no se mueven los motores tienes problemas con los drivers o su cableado. Entonces olvida el código y con las conexiones existentes intenta correr algún ejemplo disponible en la librería

#include <AccelStepper.h>

El esquema dice

const int pinEnable     =  8;     // enable correcto
const int stepX            = 3;   // step con 2 driver
const int dirX              = 4;   // dir correcto con 2 driver
const int stepY           = 5;   // step con un 1 driver
const int dirY              = 6;   // Dir correcto con 1 driver

Todo esto esta bien cableado.
Si no funciona, verifica con un tester continuidad sin que este alimentado el circuito.
Supongo que GND esta compartido con ambos driver y Arduino ademas de fuente.

gracias por responder y disculpa no haber ubicado correctamente el post.

El problema es que los motores no se mueven en la simulación y esto me hace dudar de si las conexiones y/o el código son correctos.

Ohh vaya, hablas de la simulación.
Si estan con una simulación, suban la simulación en un .zip como adjunto para poder probarla.

Agrega el .ino tmb y las librerías que usas si no son descargadas del IDE via gestor de librerías.

Adjunto el archivo con el .ino, el .hex y el proyecto de proteus

He insertado una lcd, no me da error en la simulacion pero no sale el texto.

proyec_con_lcd_3.ino.standard.zip (67.9 KB)

Hay muchos errores en el esquema que te voy a corregir. Por eso no funciona la simulación
Paciencia

no hay problema surbyte, gracias por la ayuda

Me ha costado muchas horas hacer funcionar lo mas simple y era que los potenciómetros no estaban respondiendo a las fuentes que has indicado. No quiere funcionar de ese modo.
Ahora logre que lo hagan de modo extraÑo
Aún asi, los motores no quieren funcionar.

En breve lo retomo.

los potenciometros y el boton simulan un jostick, ya que no encontré este componente en el Proteus, se pueden cambiar por otros o si tienes forma de conseguir implementar el jostick perfecto.

gracias por el esfuerzo

como me ha llegado el material que me faltaba he realizado el montaje, finalmente con un nano, los drv8825 y el joystick. El LCD lo dejo para mas adelante ya que la idea es que mi indique revoluciones de los motores.

El codigo carga bien y los motores se mueven, el problema que tengo ahora es que la aceleración no es progresiva, quiero decir que al mover el joystick al 50% de su recorrido el motor ya va a máxima velocidad.
por otra parte uno de los motores se mueve lentamente, no acelera (tengo que repasar conexiones y ver si el drv8825 está dañado)

Que parametros puedo cambiar para que la aceleracion sea mas progresiva?, he cambiado estos parametros sin exito

const int maxSpeed = 1000;  
const int minSpeed = 0; 
const float accelerazione = 50.0;

Ya funcionan los dos motores bien, aunque no me convence la aceleracion. Ahora quiero implementar un tercer motor con un segundo joystick (aunque quizas seria mejor con dos botones)
El problema es que el motor Z solo se mueve en un sentido y no consigo ver donde está el error,
dejo el codigo y el esquema

#include <AccelStepper.h>
#include <Bounce2.h>


const int ledEnable = 13; 
const int pinSwEnable = 7;  
const int pinEnable = 8;  

unsigned long debounceDelay = 10; 

const int jX = A0;  
const int stepX = 3;  
const int dirX = 4; 
long speedX, valX, mapX;  

const int jY = A1;  
const int stepY = 5;  
const int dirY = 6; 
long speedY, valY, mapY;  

const int jZ = A2;  
const int stepZ = 9;  
const int dirZ = 10; 
long speedZ, valZ, mapZ;  

const int maxSpeed = 1000;  
const int minSpeed = 0; 
const float accelerazione = 50.0; 

const int treshold = 30;  
long tresholdUp, tresholdDown;  

boolean abilitato, muoviX, muoviY, muoviZ, enable;  

Bounce btnEnable = Bounce();  


AccelStepper motoreX(AccelStepper::DRIVER, stepX, dirX);
AccelStepper motoreY(AccelStepper::DRIVER, stepY, dirY);
AccelStepper motoreZ(AccelStepper::DRIVER, stepZ, dirZ);

void setup() {
  
  speedX = speedY = speedZ = 0;
  enable = false;

  
  pinMode(ledEnable, OUTPUT);
  pinMode(pinEnable, OUTPUT);

  pinMode(pinSwEnable, INPUT_PULLUP); 

  digitalWrite(ledEnable, enable);
  digitalWrite(pinEnable, !enable); 

  
  btnEnable.attach(pinSwEnable);
  btnEnable.interval(debounceDelay);

  
  tresholdDown = (maxSpeed / 2) - treshold;
  tresholdUp = (maxSpeed / 2) + treshold;

  
  motoreX.setMaxSpeed(maxSpeed);
  motoreX.setSpeed(minSpeed);
  motoreX.setAcceleration(accelerazione);

  motoreY.setMaxSpeed(maxSpeed);
  motoreY.setSpeed(minSpeed);
  motoreY.setAcceleration(accelerazione);

  motoreZ.setMaxSpeed(maxSpeed);
  motoreZ.setSpeed(minSpeed);
  motoreZ.setAcceleration(accelerazione);
}

void loop() {

  
  checkEnable();

  digitalWrite(ledEnable, enable);  
  digitalWrite(pinEnable, !enable); 
  
  valX = analogRead(jX);
  valY = analogRead(jY);
  valZ = analogRead(jZ);

  
  mapX = map(valX, 0, 1023, minSpeed, maxSpeed);
  mapY = map(valY, 0, 1023, minSpeed, maxSpeed);
  mapZ = map(valZ, 0, 1023, minSpeed, maxSpeed);

  
  pilotaMotori(mapX, mapY, mapZ);

}

void pilotaMotori(long mapX, long mapY, long mapZ) {

  if (mapX <= tresholdDown) {
    
    speedX = -map(mapX, tresholdDown, minSpeed,   minSpeed, maxSpeed);
    muoviX = true;
  } else if (mapX >= tresholdUp) {
    
    speedX = map(mapX,  maxSpeed, tresholdUp,  maxSpeed, minSpeed);
    muoviX = true;
  } else {
    
    speedX = 0;
    muoviX = false;
  }

  if (mapY <= tresholdDown) {
    
    speedY = -map(mapY, tresholdDown, minSpeed,   minSpeed, maxSpeed);
    muoviY = true;
  } else if (mapY >= tresholdUp) {
    
    speedY = map(mapY,  maxSpeed, tresholdUp,  maxSpeed, minSpeed);
    muoviY = true;
  } else {
    
    speedY = 0;
    muoviY = false;
  }

  if (mapZ <= tresholdDown) {
    
    speedZ = -map(mapY, tresholdDown, minSpeed,   minSpeed, maxSpeed);
    muoviZ = true;
  } else if (mapZ >= tresholdUp) {
    
    speedZ = map(mapZ,  maxSpeed, tresholdUp,  maxSpeed, minSpeed);
    muoviZ = true;
  } else {
    
    speedZ = 0;
    muoviZ = false;
  }

  if (muoviX) {
    motoreX.setSpeed(speedX);
    motoreX.run();
  } else {
    motoreX.stop();
  }

  if (muoviY) {
    motoreY.setSpeed(speedY);
    motoreY.run();
  } else {
    motoreY.stop();
  }

if (muoviZ) {
    motoreZ.setSpeed(speedZ);
    motoreZ.run();
  } else {
    motoreZ.stop();
  }

}


void checkEnable() {

  btnEnable.update();

  if (btnEnable.fell()) {
    enable = !enable;
  }

}

https://ibb.co/ZXQnDCW