Подключение двух ШД. Определить текущее количество шагов (оборотов) ШД

Здравствуйте!
Задача следующая…
Делаю моточный станок для намотки катушек трансформатора. Два ШД : 1 - моточный, 2 - подающий. С первым более менее понятно. На данный момент не могу сообразить, как правильно определить текущее положение ШД1. А точнее, ШД1 должен намотать один виток проволоки, а ШД2 должен сдвинуть каретку на толщину проволоки. и т.д.
Почитав форумы, подходящее решение предлагает библиотека AccelStepper.h. В ней есть функция currentPosition(). Но я не знаю как ее воплотить в реальность.
Использую Arduino UNO, драйверы DRV8825, ШД - NEMA17
Прошу помощи!

#include <AccelStepper.h> // библиотека для работы ШД
AccelStepper STP1(1,2,3); // 2-PIN STEP, 3-PIN DIR
AccelStepper STP2(1,5,6); // 5-PIN STEP, 6-PIN DIR
#define frequency 2250 // пауза между импульсами
// назначаем ПИНы 
//ПИНы ШД1 Моточный
#define STEP1_PIN         2
#define DIR1_PIN          3
#define ENABLE1_PIN       4
// ПИНы ШД2  Укладчик
#define STEP2_PIN         5
#define DIR2_PIN          6
#define ENABLE2_PIN       7
//ПИНы кнопок
#define start_button      A0 //Кнопка СТАРТ
#define pause_button      A1 //Кнопка ПАУЗА 
#define stop_button       A2 //Кнопка СТОП
// ПИН Концевика   Определяет начальное положение укладчика ШД2
#define limit_button      A3
//ПИНы Светодиодов
#define start_LED         11 //Светодиод СТАРТ   Мигает - Готов к работе, Горит - Выполняется намотка
#define pause_LED         12 //Светодиод ПАУЗА
#define stop_LED          13 //Светодиод ВЫПОЛНЕНО
// Переменные
int flag = 0;
int w = 755; // Количество витков в одной секции
int d = 0.2; // Диаметр проволки в миллиметрах
int l = 40; // Длина катушки в миллиметрах
int step2 = 8; // Шаг перемещения подающего вала в миллиметрах за один оборот подающего двигателя ШД2
int w1 = l/d*0.9; // Количество витков в одном слое. Коэффициент заполнения - 0,9 
int st2 = 360/d*step2; // Количество шагов подающего двигателя ШД2 за один оборот моточного ШД1    
// 360 - кол-во шагов моточного ШД1 с учетом передаточного числа ременной передачи 20/36 = 1.8
int st1 = w1*st2;

void setup() {
STP1.setMaxSpeed(400); //Максимальная Скорость моточного двигателя ШД1
STP2.setMaxSpeed(400); //Максимальная Скорость подающего двигателя ШД2
STP1.setAcceleration(20); //Ускорение моточного двигателя ШД1
//управление портов для ШД1
pinMode(STEP1_PIN, OUTPUT);
pinMode(DIR1_PIN, OUTPUT);
pinMode(ENABLE1_PIN, OUTPUT);
//управление портов для ШД2
pinMode(STEP2_PIN, OUTPUT);
pinMode(DIR2_PIN, OUTPUT);
pinMode(ENABLE2_PIN, OUTPUT);
//управление портов для Кнопок
pinMode(start_button, INPUT);
pinMode(pause_button, INPUT);
pinMode(stop_button, INPUT);
//управление портом Концевика
pinMode(limit_button, INPUT);
//управление портов для Светодиодов
pinMode(start_LED, OUTPUT);
pinMode(pause_LED, OUTPUT);
pinMode(stop_LED, OUTPUT);

digitalWrite(ENABLE1_PIN , HIGH); //Выключаем ШД1, чтобы не грелся
digitalWrite(ENABLE2_PIN , HIGH); //Выключаем ШД2, чтобы не грелся
}

void loop() {
if (start_button == HIGH) {       //Если нажата кнопка СТАРТ, то
  flag = 1;                       
  digitalWrite(start_LED, HIGH);  //Светодиод СТАРТ светится
  // Возвращаем подающую каретку ШД2 в начальную позицию
   if (limit_button == LOW) { // Если концевик НЕ нажат, то
      digitalWrite(ENABLE2_PIN , LOW);       //Включаем мотор ШД2
      digitalWrite(DIR2_PIN , LOW);          //Задаем направление вращения против часовой стрелки ШД2 (возвращаем каретку в начало)
      STP2.setSpeed(200);                    //Устанавливаем скорость подающего двигателя ШД2
      STP2.setAcceleration(50); //Ускорение подающего двигателя ШД2
      STP2.runSpeed();
}
   else
      digitalWrite(ENABLE2_PIN , HIGH);      // Выключаем мотор ШД2 
      digitalWrite(start_LED, HIGH);         // Светодиод СТАРТ мигает 
      delay(500);

  //Когда подающая каретка заняла начальное положение, начинаем процесс намотки

   if (pause_button == HIGH) {       //Если нажата кнопка RUN/PAUSE, то
     digitalWrite(start_LED, LOW);           //Выключаем светодиод СТАРТ
     digitalWrite(pause_LED, HIGH);          //Включаем светодиод RUN/PAUSE
     
     //Вращение моточного двигателя ШД1
     digitalWrite(ENABLE1_PIN, LOW);         //Включаем моточный двигатель ШД1
     digitalWrite(DIR1_PIN, LOW);            //Задаем направление вращения моточного ШД1 против часовой стрелки 
     STP1.moveTo(-st1);                      //Задаем число шагов ШД1 (позиция - число витков одного слоя)
     STP1.run();                             //Начинает вращение моточный ШД1

     //Вращение подающего двигателя ШД2

}
}
}   


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

Есть много вариантов. Как по мне резистор с большим колесом на оси и верёвка от каретки через колесо с грузиком или пружиной. При перемещении каретки колесо крутит резистор, ардуина считывает напряжение на резисторе - оно пропорционально положению. Размер колеса должен обеспечивать поворот резистора в пределах его вращения. Система настройки из старого лампового приемника очень даже подойдёт. Там все было. И большое колесо и верёвка правильная с пружиной.
Есть ещё линейные резисторы, специально для определения положения с большой точностью, но цена у них не гуманная.

хм… а энкодер не проще?

С отдельным датчиком не проблема. Я думал, что как-то програмно этот вопрос можно решить. Мне важно считать обороты, а не шаги. Поставлю оптодатчик.

Может и проще. Но так будет давать позицию сразу по включению, да и все детальки в столе есть. А энкодера нет. И совсем не представляю как энкодером можно честно, а не относительно, получит положение проволоки.

да, об этом я не подумал

Ещё есть многооборотные резисторы.

Скажите, почему вы не хотите просто задать нужную постоянную скорость каретки, рассчитав ее из скорости вращения?

Тоже вариант. Главное, чтоб не получилось, что виток на виток накладывается

Стр.27 я бы сделал переменную типа double или float.