Одновременное управление 4-мя шаговыми двигателями

Имеется скетч для управления шаговым двигателем с библиотекой AccelStepper

#include <AccelStepper.h>

//Пины управления двигателей
#define step1  2
#define dir1   3
#define en1    4

//Пин кнопки
#define start_button 8

AccelStepper stepper1(1, step1, dir1);  // Инициализация шагового двигателя 

bool flag = false;                      // Флаг для определения активации рабочего режима

void setup() {
  pinMode(start_button, INPUT_PULLUP);  // Настройка пина кнопки как вход с подтяжкой к питанию
  pinMode(en1, OUTPUT);                 // Настройка пина включения двигателя 
  digitalWrite(en1, HIGH);              // Выключение двигателя 
  
}

void loop() {
  if (!digitalRead(start_button)) {     // Если кнопка нажата
    digitalWrite(en1, LOW);             // Включаем двигатель 
    flag = true;                        // Устанавливаем флаг активации рабочего режима
    delay(2800);                        // Задержка перед началом движения после нажатия кнопки
  }

  if (flag) {                           // Если флаг активации рабочего режима установлен
        
    // Первый этап двигателя 1
    stepper1.setMaxSpeed(5000);          //Установка максимальной скорости
    stepper1.setAcceleration(10000);     //Установка ускорения, в шагах в секунду за секунду
    stepper1.move(-9040);                // Количество шагов
    while (stepper1.distanceToGo() != 0) {
      stepper1.run();
    }
    
    delay(1000);                         // Пауза между движениями
    
    // Второй этап двигателя 1
    stepper1.setMaxSpeed(1200);          //Установка максимальной скорости
    stepper1.setAcceleration(4000);      //Установка ускорения, в шагах в секунду за секунду
    stepper1.move(6040);                 // Количество шагов
    while (stepper1.distanceToGo() != 0) {
      stepper1.run();
    }

    delay(1000);                         // Пауза между движениями
    
    // Третий этап двигателя 1
    stepper1.setMaxSpeed(3000);          //Установка максимальной скорости
    stepper1.setAcceleration(40000);     //Установка ускорения, в шагах в секунду за секунду
    stepper1.move(3000);                 // Количество шагов
    while (stepper1.distanceToGo() != 0) {
      stepper1.run();
      
    }
    
    delay(1000);                          // Пауза после завершения движения
    flag = false;                         // Сбрасываем флаг активации рабочего режима
    digitalWrite(en1, HIGH);              // Выключаем двигатель 
  }
}

Необходимо доработать для одновременного управления 4 шаговыми двигателями, у каждого двигателя свои параметры (скорость, разгон/торможение, количество шагов, количество этапов, пауза между этапами). Кнопка запуска одна. Не обязательно использовать AccelStepper, но нужен плавный разгон и торможение. Максимальная скорость для двигателя 1 и 2.
Ардуино нано (желательно)
1 двигатель NEMA 23, драйвер DM542
2 двигатель NEMA 23, драйвер DM542
3 двигатель NEMA 17, драйвер A4988/DRV8825
4 двигатель NEMA 17, драйвер A4988/DRV8825

Знать эти параметры не надо?

такие же как в примере кода выше

5000 шагов дешевые ардуино не тянут, в курсе? Максимум 4000. В сумме на все моторы.

да, заметили, но 5000 в 1/2 шага достаточно

Ардуино это предпочтение, если есть иные варианты то рассмотрим

Я раскручивал до 6000об/мин двигатель.

если у всех 4х моторов “такие же”, значит они одинаковые

С разгоном? С подсчетом шагов, или выполнением еще какой-то логики? Или просто механический долбежь импульсов?

Библиотека AccelStepper для Arduino Nano явно тяжеловата. особенно для приличных скоростей. и, тем более, 4 моторов на один процессор. Проверено. Пришлось AccelStepper крутить на отдельном проце, использовал доступный ESP8266 на 160 Мгц. Получилась двухпроцессорная связка. Это известные грабли, все начальные эксперименты с библиотекой AccelStepper дают такой результат. Можете потратить время. чтобы убедиться в этом. Многие потратили , и убедились. Удачи!

я столкнулся на языке python когда писал код запускал 4 двигателя они должны были закончить в одно время но с разным шагом и паузой, в результате заканчивали все в разное время и общее время выполнения было дольше чем считанное! тоже думаю все 4 двигателя раскидать на разные процессоры типо ESP посылать на них число шагов время и направление

FastAccelStepper - еще одна библиотека для управления шаговыми двигателями. Я бы попробовал поработать с ней. И еще, в рамках той или иной архитектуры модуля управления несколькими драйверами и, соответственно, шаговыми моторами , я бы попробовал из главного модуля отправлять, например по Com порту на 115200 один пакет с заданиями для нескольких ведомых процессоров, по части скорости, ускорений и числа шагов. Каждый ведомый процессор принимал бы параметры для себя. То есть на одну шину TX будут подключены шины RX нескольких ведомых процессоров, на каждом из которых крутится что то типа AccelStepper или FastAccelStepper. Бесконечное удовольствие.

Мне пришлось прибегнуть к такой схеме при мониторинге потоков данных по Com порту. Два проца с общей линией RX делали свое дело - один выводил данные на TFT экран, другой писал лог на SD карту. На одном процессоре это было существенно медленнее, чем мне нужно.

еще на Python есть time.sleep(), совсем не подходит для генерации импульсов вместо паузы использовал цикл:
while perf_counter()-start_time < times:
pass
такой способ работает корректно