#include <AccelStepper.h>

const byte runButton = 8;
const byte startButton = 9;
const byte stepPin1 = 5;
const byte dirPin1  = 6;
const byte stepPin2 = 3;
const byte dirPin2  = 4;

const byte motorInterfaceType = AccelStepper::DRIVER ; // A4988
AccelStepper stepper1 = AccelStepper(motorInterfaceType, stepPin1, dirPin1);
AccelStepper stepper2 = AccelStepper(motorInterfaceType, stepPin2, dirPin2);

#define MICROSTEP 4                 // 1/4 di passo
#define TARGET    200*MICROSTEP      // Numero di step per ciclo

int posTarget, oldPos;

void setup() {
  pinMode(startButton, INPUT_PULLUP);
  pinMode(runButton, INPUT_PULLUP);
  Serial.begin(115200);

  stepper1.setMaxSpeed(1000);
  stepper1.setAcceleration(5000);

  stepper2.setMaxSpeed(1000);
  stepper2.setAcceleration(5000);

  // Recupero lo scatto che fa all'avvio wokwi
  // stepper1.move(8);
  // stepper1.runToPosition();
  // stepper1.setCurrentPosition(0);

  // stepper2.move(8);
  // stepper2.runToPosition();
  // stepper2.setCurrentPosition(0);
}

void loop() {

  // Cambio posizione quando il pulsante viene premuto e lo stepper ha completato il movimento
  if (digitalRead(startButton) == 0 && stepper1.distanceToGo() == 0) {
    posTarget += TARGET;
    delay(50);
  }

  // Nuova posizione
  if (posTarget != oldPos) {
    oldPos = posTarget;
    Serial.print("Move to position ");
    Serial.println(posTarget);

    // Imposta la nuova posizione target
    stepper1.moveTo(posTarget);
    // stepper2.moveTo(-posTarget);
  }

  // Fai ruotare il motore fintanto che non raggiunge la posizione target
  if (stepper1.distanceToGo() != 0) {
    stepper1.run();
  }

  if (digitalRead(runButton) == 0) {
    stepper2.moveTo(stepper2.currentPosition() + 10);
    stepper2.run();
  }
  
}
A4988
A4988