El Stepper bloquea todo el código al intentar detenerlo

Hola, os planteo mi situación, he fabricado un robot lanzador de pelotas de Ping Pong, con dos servo motores para la orientación vertical y horizontal, tres motores brushless para lanzar las pelotas y un Stepper que es el motor que sube las pelotas hacia el lanzador, todo esto controlado por un arduino uno R3, que recibe los cambios de velocidad, arranque, parada y secuencias por bluetooth a través de una app con el móvil.
Funciona bastante bien, el problema es que al intentar detener el lanzamiento de pelotas, es decir, al recibir el comando de detener el Stepper, reduciendo la velocidad poco a poco, se bloquea todo el código de manera tal que tengo que apagar la fuente de alimentación (fuente XT de ordenador) y volver a encenderlo.
Pareciera que cada vez que recibe una orden, por ejemplo un pequeño giro de uno de los servos, el arduino realiza ése movimiento pero también, reinicia cada uno del resto de motores, no sé si esto es normal en el arduino o es la causa de mi problema.
Podría ser una solución cambiar todo el sistema a ESP32 en lugar de Arduino UNO?
Os dejo el código, gracias de ante mano y perdón por la turra


```cpp
#include <SoftwareSerial.h>
#include <Servo.h>
#include <AccelStepper.h>

// Definir pines para el módulo Bluetooth
SoftwareSerial BT(2, 3);  // RX, TX

// Crear objetos Servo para controlar los ESC
Servo motor1;
Servo motor2;
Servo motor3;
Servo motorv;
Servo motorh;


const int stepsPerRevolution = 200;  // Número de pasos por revolución para el NEMA17

// Pines stepper NEMA17
// Motor paso a paso (Stepper) para empujar las pelotas
#define MOTOR_STEPS 200
#define MOTOR_PIN_1 4
#define MOTOR_PIN_2 5
#define MOTOR_PIN_3 6
#define MOTOR_PIN_4 7
AccelStepper stepper(AccelStepper::FULL4WIRE, MOTOR_PIN_1, MOTOR_PIN_2, MOTOR_PIN_3, MOTOR_PIN_4);

int stepperSpeed = 200; // Velocidad inicial del stepper

const int irSensorPin = 8;  // Pin del sensor IR
int irSensorState = 8;
boolean trigger = false;

const int switchballsPin = 1;  // Pin A1 del switch
int switchballsState = 0;

// Definir pines para los ESC
int motor1Pin = 9;
int motor2Pin = 10;
int motor3Pin = 11;
int motorhPin = 12;
int motorvPin = 13;

// Valores mínimos y máximos para cada motor
int minPWM1 = 1492;
int maxPWM1 = 1560;

int minPWM2 = 1492;
int maxPWM2 = 1560;

int minPWM3 = 1492;
int maxPWM3 = 1560;

// Definir el rango de movimiento de los servos
int minServoAngle = 5;
int maxServoAngle = 175;
int centerServoAngle = 90;

// Variable de estado para la secuencia
bool runningSequence01 = false;
bool runningSequence02 = false;
bool runningSequence03 = false;
bool runningSequence04 = false;
int Summa_Balls = 0;
bool shootingballs = false;

// Variables para controlar la desaceleración
bool decelerating = false;
bool deceleratingSeq = false;

void setup() {
  // Inicializar la comunicación serie para el monitor serial
  Serial.begin(9600);

  // Inicializar la comunicación serie para el módulo Bluetooth
  BT.begin(9600);


  // Configuración del sensor IR
  pinMode(irSensorPin, INPUT);

  // Configuración del switch
  pinMode(switchballsPin, INPUT);

  // Adjuntar los ESC a los objetos Servo
  motor1.attach(motor1Pin);
  motor2.attach(motor2Pin);
  motor3.attach(motor3Pin);
  motorv.attach(motorvPin);
  motorh.attach(motorhPin);

  // Establecer los valores iniciales de los motores a 0
  motor1.writeMicroseconds(1000);
  motor2.writeMicroseconds(1000);
  motor3.writeMicroseconds(1000);

  delay(5000);

  // Calibrar los ESC
  calibrateESC(motor1);
  calibrateESC(motor2);
  calibrateESC(motor3);


  // Establecer los servos en una posición inicial
  motorv.write(centerServoAngle);
  motorh.write(centerServoAngle);

  // Configurar el motor paso a paso
  stepper.setMaxSpeed(800);  // Velocidad máxima

  stepper.setAcceleration(650);  // Aceleración

  // Iniciar movimiento continuo del stepper
  stepper.move(stepsPerRevolution);  // Mover un ciclo completo (200 pasos)

  Serial.println("Motores y servos inicializados");
}

void loop() {
  // Verificar si hay datos disponibles desde el módulo Bluetooth
  if (BT.available()) {
    String receivedString = BT.readString();  // Leer la cadena completa desde el Bluetooth
    
    // Verificar si se debe activar la secuencia de movimientos
    if (receivedString.startsWith("speed")) {
      int newSpeed = receivedString.substring(5).toInt(); // Obtener la velocidad deseada después de 'speed'
      if (newSpeed >= 200 && newSpeed <= 400) { // Asegurarse de que la velocidad esté en el rango válido
        stepperSpeed = newSpeed;
        stepper.setSpeed(stepperSpeed); // Ajustar la velocidad del stepper
        Serial.print("Stepper speed set to: ");
        Serial.println(stepperSpeed);
      } else {
        Serial.println("Invalid speed value. Must be between 200 and 400.");
      }
    }

  }
  // Verificar si hay datos disponibles desde el módulo Bluetooth
  if (BT.available()) {
    String receivedString = BT.readString();  // Leer la cadena completa desde el Bluetooth

    // Verificar si se debe activar la secuencia de movimientos
    if (receivedString == "S01") {
      runningSequence01 = true;  // Iniciar la secuencia
      Serial.println("Running SEQ01");

    } else if (receivedString == "ball") {
      shootingballs = true;
      Serial.println("Running Balls");
    } else if (receivedString == "stopS01") {  // Comando para detener la secuencia S01 con desaceleración
      deceleratingSeq = true;                  // Iniciar la desaceleración para la secuencia
      Serial.println("Decelerating and stopping SEQ01");
    } else if (receivedString == "stopBall") {  // Comando para detener el movimiento del motor paso a paso con desaceleración
      decelerating = true;                      // Iniciar la desaceleración
      Serial.println("Decelerating and stopping stepper motor");
    } else if (receivedString == "S02") {
      runningSequence02 = true;  // Iniciar la secuencia
      Serial.println("Running SEQ02");
    } else if (receivedString == "S03") {
      runningSequence03 = true;  // Iniciar la secuencia
      Serial.println("Running SEQ03");
    } else if (receivedString == "S04") {
      runningSequence04 = true;  // Iniciar la secuencia
      Serial.println("Running SEQ04");
    }

    // Si el carácter es una letra (A, B, C)
    else if (receivedString.startsWith("A") || receivedString.startsWith("B") || receivedString.startsWith("C")) {
      char motorID = receivedString.charAt(0);
      int speed = receivedString.substring(1).toInt();

      // Asegurarse de que el número esté en el rango de 0 a 100
      if (speed >= 0 && speed <= 100) {
        int pwmValue;

        // Ajustar la velocidad del motor correspondiente con su propio rango de PWM
        if (motorID == 'A') {
          pwmValue = map(speed, 0, 100, minPWM1, maxPWM1);
          motor1.writeMicroseconds(pwmValue);
          Serial.println("Motor 1 Top R velocidad: ");
        } else if (motorID == 'B') {
          pwmValue = map(speed, 0, 100, minPWM2, maxPWM2);
          motor2.writeMicroseconds(pwmValue);
          Serial.println("Motor 2 Top L velocidad: ");
        } else if (motorID == 'C') {
          pwmValue = map(speed, 0, 100, minPWM3, maxPWM3);
          motor3.writeMicroseconds(pwmValue);
          Serial.println("Motor 3 Back Spin velocidad: ");
        }
        Serial.println(speed);
      } else {
        Serial.println("Valor de velocidad fuera de rango (0-100)");
      }
    }
    // Si el carácter es una letra para los servos (V, H)
    else if (receivedString.startsWith("V") || receivedString.startsWith("H")) {
      char servoID = receivedString.charAt(0);
      int angle = receivedString.substring(1).toInt();

      // Asegurarse de que el número esté en el rango de -85 a +85
      if (angle >= -85 && angle <= 85) {
        int absoluteAngle = map(angle, -85, 85, minServoAngle, maxServoAngle);  // Mapear -85 a +85 a 5 a 175
        if (servoID == 'V') {
          motorv.write(absoluteAngle);
          Serial.println("Servo 1 movido a: ");
          Serial.print(absoluteAngle);
          Serial.println(" grados");
        } else if (servoID == 'H') {
          motorh.write(absoluteAngle);
          Serial.println("Servo 2 movido a: ");
          Serial.print(absoluteAngle);
          Serial.println(" grados");
        }
      } else {
        Serial.println("Valor de ángulo fuera de rango (-85 a +85)");
      }
    }
  }

  // Ejecutar la secuencia 01
  if (runningSequence01) {
    executeSequence01();
  }
  if (runningSequence02) {
    executeSequence02();
  }
  if (runningSequence03) {
    executeSequence03();
  }
  if (runningSequence04) {
    executeSequence04();
  }
  if (deceleratingSeq) {
    executeStopSeq();
  }
  if (shootingballs) {
    executeballs();
  }
  if (decelerating) {
    executeStopballs();
  }
}

void calibrateESC(Servo motor) {
  motor.writeMicroseconds(maxPWM1);
  delay(1000);
  motor.writeMicroseconds(minPWM1);
  delay(1000);
}


```cpp
  // Ejecutar la desaceleración progresiva del motor paso a paso en la secuencia S01
void executeStopSeq() {
  if (stepper.speed() > stepperSpeed * 0.5) { // Desacelerar progresivamente
    stepper.setSpeed(stepper.speed() * 0.5); // Reducir la velocidad gradualmente
  } else {
    runningSequence01 = false; // Terminar la desaceleración
    runningSequence02 = false; // Terminar la desaceleración
    runningSequence03 = false; // Terminar la desaceleración
    runningSequence04 = false; // Terminar la desaceleración
    deceleratingSeq = false;
    stepper.stop(); // Detener el motor
    Serial.println("Ball stepper motor stopped");
  }
  stepper.runSpeed(); // Ejecutar el movimiento con la nueva velocidad
}

```cpp
// Ejecutar la desaceleración progresiva del motor paso a paso si está en modo de desaceleración (ball)
void executeStopballs() {
  if (stepper.speed() > stepperSpeed * 0.5) { // Desacelerar progresivamente
    stepper.setSpeed(stepper.speed() * 0.9); // Reducir la velocidad gradualmente
  } else {
    shootingballs = false; // Terminar la desaceleración
    decelerating = false;
    stepper.stop(); // Detener el motor
    Serial.println("Ball stepper motor stopped");
  }
  stepper.runSpeed(); // Ejecutar el movimiento con la nueva velocidad
}

```cpp
void executeSequence01() {
   // Leer el estado del sensor IR
  if (digitalRead(irSensorState) == LOW) { 
    trigger = false;
  }  
  if (digitalRead(irSensorState) == HIGH && !trigger) {
    trigger = true;
    Summa_Balls++;
  }

  if (Summa_Balls > 2) {
    Summa_Balls = 0;
  }

  // Controlar los motores según Summa_Balls
  if (Summa_Balls == 0) {  
    motor1.writeMicroseconds(1538);
    motor2.writeMicroseconds(1538);
    motor3.writeMicroseconds(1510);
    motorv.write(70);
    motorh.write(45);
  } else if (Summa_Balls == 1) {
    motor1.writeMicroseconds(1538);
    motor2.writeMicroseconds(1538);
    motor3.writeMicroseconds(1510);
    motorv.write(70);
    motorh.write(135);
  } else if (Summa_Balls == 2) {
    motor1.writeMicroseconds(1538);
    motor2.writeMicroseconds(1538);
    motor3.writeMicroseconds(1510);
    motorv.write(70);
    motorh.write(135);
  }
  if (stepper.distanceToGo() == 0) {  // Si ha llegado a la posición objetivo
    stepper.moveTo(stepper.currentPosition() + 20000);  // Continuar en la misma dirección
  }
  
  stepper.run();  // Ejecutar el movimiento del motor paso a paso
  stepper.setSpeed(stepperSpeed); // Ajustar la velocidad del stepper

 
  }

```cpp
void executeballs()  {
  if (stepper.distanceToGo() == 0) {
      stepper.moveTo(stepper.currentPosition() + stepsPerRevolution);  // Mover un ciclo completo
  }
  stepper.run();  // Ejecutar el movimiento del motor paso a paso
  stepper.setSpeed(stepperSpeed); // Ajustar la velocidad del stepper
}

Graba un video, súbelo a youtube asi podemos entender mejor el problema. Es posible?