шаговый двигатель через библиотеку Onebutton

7ramzes7
Offline
Зарегистрирован: 19.04.2020

Уважаемые Форумчане! Хочется уже написать спасите, помогите. Опишу ситуацию и прошу вашей помощи. В программировании я ничего не понимаю, точней никогда не занимался. Решил сыну ко дню рождения сделать автопарковку со шлагбаумом и лифтом. Наткнулся  на удивительный мир Ардуино. Стал изучать собирать и вошел в тупик с написанием скетча. Сервопривод через кнопку с горем попалам сделал. А вот отладить шаговый двигатель не получается. Ознакомился с библиотекой Onebutton принцип ее работы с кнопкой то что мне нужно, но объеденить ее и работу двигателя не получается. Помогите собрать рабочий скетч с сервоприводом через кнопку, шаговым двигателем через две кнопки одна на подъем один клик = один этаж, двойной клик с первого на третий этаж. А вторая кнопка тоже самое но работа на спуск.   

 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

7ramzes7 пишет:

ничего не понимаю, точней никогда не занимался

вошел в тупик с написанием скетча

Закажите написание скетча в коммерческом разделе форума, если не хотите изучать программирование самостоятельно.

7ramzes7
Offline
Зарегистрирован: 19.04.2020

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

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Алкота местная и за 200 сделает. Токо неизвестно когда. А так - 1000-1500, думаю.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

Алкота местная и за 200 сделает.

А вот щас прям обидно было. ¦(

sadman41
Offline
Зарегистрирован: 19.10.2016

DetSimen пишет:

sadman41 пишет:

Алкота местная и за 200 сделает.

А вот щас прям обидно было. ¦(

Ты же по $80 берешь вроде?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

А вот щас прям обидно было. ¦(

Дида, мы с тобой не алката ни грамма, а сознательные граждане, т.к. ни не пьём, а принимаем дезинфецирующее срецтво ат вируса, шоб он сдох. Так что до нас это не относится :-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

DetSimen пишет:

А вот щас прям обидно было. ¦(

Дида, мы с тобой не алката ни грамма, а сознательные граждане, т.к. ни не пьём, а принимаем дезинфецирующее срецтво ат вируса, шоб он сдох. Так что до нас это не относится :-)

и алкоголики водку не пьют, они винцо, по глоточку

vvadim
Offline
Зарегистрирован: 23.05.2012

ua6em пишет:

ЕвгенийП пишет:

DetSimen пишет:

А вот щас прям обидно было. ¦(

Дида, мы с тобой не алката ни грамма, а сознательные граждане, т.к. ни не пьём, а принимаем дезинфецирующее срецтво ат вируса, шоб он сдох. Так что до нас это не относится :-)

и алкоголики водку не пьют, они винцо, по глоточку

нормальные пацаны водку не пьют, а кушают....

7ramzes7
Offline
Зарегистрирован: 19.04.2020

#include <CustomStepper.h> 
CustomStepper stepper (8, 9, 10, 11);  // Указываем пины, к которым подключен драйвер шагового двигателя

int example = 1;
      
#include "OneButton.h"

OneButton button1(5, true);
OneButton button2(6, true);

// setup code here, to run once:
void setup() {
  stepper.setRPM(12);                 // Устанавливаем кол-во оборотов в минуту
  stepper.setSPR(4075.7728395);  
  
  Serial.begin(9600);
  while (!Serial) {
    ; 
  }
  Serial.println("Starting TwoButtons...");

   button1.attachClick(click1);
  button1.attachDoubleClick(doubleclick1);
 
   button2.attachClick(click2);
  button2.attachDoubleClick(doubleclick2);
  
} 



void loop() {
  
  button1.tick();
  button2.tick();
  delay(10);
}

void click1() {
  
   Serial.println("Button 1 click.");
   if (stepper.isDone() and example == 1) // Когда предыдущая команда выполнена (см. ниже), метод stepper.isDone() возвращает true
  {
    stepper.setDirection(CW);         // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP
    stepper.rotate(3);                // Устанавливает вращение на заданное кол-во оборотов
 }} // click1


// This function will be called when the button1 was pressed 2 times in a short timeframe.
void doubleclick1() {
  Serial.println("Button 1 doubleclick.");
 if (stepper.isDone() and example == 1)

  {
    stepper.setDirection(CW);
    stepper.rotate(7);        // Поворачивает вал на заданное кол-во градусов. Можно указывать десятичную точность (например 90.5), но не принимаются отрицательные значения
    
}} // doubleclick1



void click2() {
  Serial.println("Button 2 click.");
 if (stepper.isDone() and example == 1)  // Когда предыдущая команда выполнена (см. ниже), метод stepper.isDone() возвращает true
  {
    stepper.setDirection(CCW);         // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP
    stepper.rotate(3);                // Устанавливает вращение на заданное кол-во оборотов
    
}} // click2


void doubleclick2() {
  Serial.println("Button 2 doubleclick.");
 if (stepper.isDone() and example == 1)

  {
    stepper.setDirection(CW);
    stepper.rotate(7);        // Поворачивает вал на заданное кол-во градусов. Можно указывать десятичную точность (например 90.5), но не принимаются отрицательные значения
    
 } // doubleclick2

 stepper.run();
}



// End

Пока время позволяет еще, пробую писать код. Нашел библиотеку кастом степер. по отдельности все работает в попытке соединить их, ошибок не выдает (код выше) однако и вал не крутит кнопка срабатывает на клик 1 и дабл клик в порте прописывается, а на драйвере ULN2003 горит 2 диода А и B а двигатель не вращает. помогите исправить код. Ощущение что нет обращения к библиотеке кастомстепер.

 

b707
Offline
Зарегистрирован: 26.05.2017

что за бред написан в строчках 42. 52 и так далее?

Может стоит синтаксис языка подучить?

7ramzes7
Offline
Зарегистрирован: 19.04.2020

 и что вы этим хотите сказать? что не расставлены скобки и точка с запятой?

b707
Offline
Зарегистрирован: 26.05.2017

7ramzes7 пишет:

 и что вы этим хотите сказать? что не расставлены скобки и точка с запятой?

что эта строка абсолютно не имеет смысла - она ничего полезного не делает.

И уж точно она не делает того, что планировали вы... точнее не вы, а автор кода

7ramzes7
Offline
Зарегистрирован: 19.04.2020

подскажите команду которая будет выполнять функцию вращения на определенное кол-во оборотов и останавливаться.

 

b707
Offline
Зарегистрирован: 26.05.2017

7ramzes7 пишет:

подскажите команду которая будет выполнять функцию вращения на определенное кол-во оборотов и останавливаться.

 

да вам не команда нужна, у вся логика кода перекорежена. Судя по всему, вы этот код где-то копировали и половину растеряли. То. что у вас написано в функциях click() и тп - просто бессмысленный набор операторов.

7ramzes7
Offline
Зарегистрирован: 19.04.2020
// Видеообзоры и уроки работы с ARDUINO на YouTube-канале IOMOIO: https://www.youtube.com/channel/UCmNXABaTjX_iKH28TTJpiqA

#include <CustomStepper.h>            // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V
CustomStepper stepper(8, 9, 10, 11);  // Указываем пины, к которым подключен драйвер шагового двигателя

int example = 1;                      // Переменная для демонстрации работы, отвечающая за смену режимов

void setup()
{
  stepper.setRPM(12);                 // Устанавливаем кол-во оборотов в минуту
  stepper.setSPR(4075.7728395);       // Устанавливаем кол-во шагов на полный оборот. Максимальное значение 4075.7728395
}

void loop()
{
  if (stepper.isDone() and example == 1)  // Когда предыдущая команда выполнена (см. ниже), метод stepper.isDone() возвращает true
  {
    stepper.setDirection(CW);         // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP
    stepper.rotate(1);                // Устанавливает вращение на заданное кол-во оборотов
    example = 2;
  }
  if (stepper.isDone() and example == 2)
  {
    stepper.setDirection(CCW);
    stepper.rotateDegrees(90);        // Поворачивает вал на заданное кол-во градусов. Можно указывать десятичную точность (например 90.5), но не принимаются отрицательные значения
    example = 3;
  }
  if (stepper.isDone() and example == 3)
  {
    stepper.setDirection(CW);
    stepper.rotate();                 // Будет вращать пока не получит команду о смене направления или пока не получит директиву STOP
  }
  stepper.run();                      // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо
}

вот код автора. 

7ramzes7
Offline
Зарегистрирован: 19.04.2020

я подумал что значения экземл 2 и 3 не нужны так этот цикл мне не нужен.

 

b707
Offline
Зарегистрирован: 26.05.2017

7ramzes7 пишет:

я подумал что значения экземл 2 и 3 не нужны так этот цикл мне не нужен.

причем тут экземл 2 и 3 ? Вы в первом коде условный оператор "if" потеряли - а теперь делаете вид. что все так и было?

Это просто показывает. что ваши знания не нулевые. а отрицательные....

7ramzes7
Offline
Зарегистрирован: 19.04.2020

не делаю вид, прошу прощения, я сначала для вас исправил чтоб написать как было у атора а потом решил что прще вставить скетч автора. прошу прощения за казус.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vvadim пишет:

нормальные пацаны водку не пьют, а кушают....

А мы с дедом "принимаем срецтво".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

что за бред написан в строчках 42. 52 и так далее?

Может стоит синтаксис языка подучить?

Простите, может глаз замылился ... в чём там проблема?

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Простите, может глаз замылился ... в чём там проблема?

уже ни в чем, ТС подчистил :)

7ramzes7
Offline
Зарегистрирован: 19.04.2020

изначально не было If и скобок

7ramzes7
Offline
Зарегистрирован: 19.04.2020

b707 пишет:

ЕвгенийП пишет:

Простите, может глаз замылился ... в чём там проблема?

уже ни в чем, ТС подчистил :)

а что не так то? вы указали на ошибку я исправил но работать так и не стало. Я думал в этом и заключается обсуждение на форуме в поисках ошибок и исправления. А также помощь в написании. А тут выходит так что люди не заинтересованы. Спасибо. Подскажите как закрыть тему. Поищу помощь в другом месте. А как придет время, если не успею сам, закажу.

Olger
Offline
Зарегистрирован: 28.02.2015

у меня есть рабочий скетч для ШД, с библиотекой AccelStepper

ввод команд через монитор. но можете переделать под свои кнопки

Под каждой командой задаете нужное количество шагов, это опытным путем подбирается.

 

7ramzes7
Offline
Зарегистрирован: 19.04.2020

Olger пишет:

у меня есть рабочий скетч для ШД, с библиотекой AccelStepper

ввод команд через монитор. но можете переделать под свои кнопки

Под каждой командой задаете нужное количество шагов, это опытным путем подбирается.

 

буду признателен если позволите взглянуть.

Olger
Offline
Зарегистрирован: 28.02.2015
// Пример для проверки работы загрузчика шаров.
// ШД с редуктором и драйвером DRV8834, библиотека AccelStepper.
// Расчет шагов: шаг=18°, после редуктора 1:63 шаг=0,2857°. 1260 шагов на круг. 160°=560 шагов, 46°=161 шаг, 114°=399 шагов, 170°=595 шагов.
// Параметр в команде "moveTo" задает количество шагов относительно НУЛЕВОГО ПОЛОЖЕНИЯ.
// Нулевое положение ШД в общем виде - это положение при включении, если не задано по другому, например, по датчику Холла.
// Если сигнал ENBL не используется, то вход Enable драйвера необходимо установить в LOW аппаратно.
// При Vmot=5V, уровень Vref установить =0,08.


String inString = "";                                                     // строковая переменная для ввода значений через монитор порта
int y;                                                                    // переменная для числовых значений
long angle;                                                               // переменная для хранения количества шагов для поворота, + по ЧС
int pos;                                                                  // переменная для отображения текущего количества пройденных шагов
byte z;                                                                   // переменная для запуска процесса установки нулевого положения ШД по датчику Холла при включении
byte sens;                                                                // переменная для статуса датчика Холла

#define STEP  6                                                           // выход для сигнала STEP 
#define DIR  4                                                            // выход для сигнала DIR 
#define HALL 10                                                           // вход датчика Холла
#define LED 13                                                            // выход индикатора

float MAXSPEED = 200.0;                                                   // значение максимальной скорости ШД в шагах в сек.
float SPEED = 200.0;                                                      // значение скорости движения ШД в шагах в сек.
float ACCELERATION = 160.0;                                               // значение ускорения в шагах в сек. за сек.

#include <AccelStepper.h>                                                 // подключаем библиотеку
AccelStepper TurretStepper (AccelStepper::DRIVER, STEP, DIR);             // объявляем объект с именем TurretStepper

void setup()
{
  Serial.begin(9600);
  TurretStepper.setMaxSpeed(MAXSPEED);                                    // задаем максимальную скорость ШД
  TurretStepper.setSpeed(SPEED);                                          // задаем скорость движения ШД
  TurretStepper.setAcceleration(ACCELERATION );                           // задаем ускорение ШД
  TurretStepper.enableOutputs();                                          // включаем выходы драйвера
  z = 0;                                                                  // инициируем процедуру установки нулевого положения ШД по датчику Холла при включении
  TurretStepper.moveTo(-595);                                             // задаем количество шагов для поворота при установке нулевого положения ШД
  pinMode(LED, OUTPUT);                                                   // определяем порт индикатора как выход

}

void loop()
{
  TurretStepper.enableOutputs();                                          // включаем выходы драйвера

  EnterValue();                                                           // функция для ввода числового значения режима работы

  if (z == 0)                                                             // при включении запускаем установку нулевого положения ШД по датчику Холла,
  {
    SetZeroPositionH();                                                   // для чего вызываем соответствующую функцию
  }
  if (y == 1)                                                             // поворот из точки 3 (конечной) в точку 1 (начальную, нулевую)
  {
    angle = 0;                                                            // количество шагов задается относительно установленной нулевой точки
    TurretStepper.moveTo(angle);
  }
  if (y == 2)                                                             // поворот из точки 1 (начальной, нулевой) в точку 2 (проверка наличия шара), угол поворота 46°=161 шагу
  {
    angle = 161;                                                          // количество шагов задается относительно установленной нулевой точки
    TurretStepper.moveTo(angle);
  }
  if (y == 3)                                                             // поворот из точки 2 в точку 3 (шар подан), угол поворота от нулевой точки 160°=560 шагам
  {
    angle = 560;                                                          // количество шагов задается относительно установленной нулевой точки
    TurretStepper.moveTo(angle);
  }
  if (y == 4)                                                             // проверка количества шагов на полный круг
  {
    angle = 1260;                                                         // При maxspeed 60, speed 60, acceleration 50, время полного круга 40 сек.
    TurretStepper.moveTo(angle);
  }


  if (TurretStepper.distanceToGo() != 0)                                  // пока ШД не прошел указанные шаги, т.е. дистанция до указанного числа шагов не равна 0
  {
    TurretStepper.run();                                                  // двигаемся в заданном направлении на указанное число шагов
    pos = TurretStepper.currentPosition();                                // сохраняем текущее положение ШД в шагах в переменную
    Serial.print ("Position= ");
    Serial.println (pos);
  }
  else                                                                    // а когда ШД прошел указанные шаги, т.е. дистанция до указанного числа шагов  = 0
  {
    TurretStepper.disableOutputs();                                       // декативируем пины управления драйвером для остановки ШД
    pos = TurretStepper.currentPosition();                                // сохраняем текущее положение ШД в шагах в переменную
    Serial.print ("Position= ");
    Serial.println (pos);
  }

  if (pos == 0) digitalWrite(LED, HIGH);                                  // в нулевом положении ШД включаем индикатор
  if (pos != 0) digitalWrite(LED, LOW);                                   // во всех остальнх положениях ШД выключаем индикатор

  // ниже скобка loop
}

void EnterValue()                                                         // функция перевода вводимых в монитор серийного порта строковых значений чисел в целые числа (int)
{
  while (Serial.available() > 0)
  {
    int inChar = Serial.read();
    if (isDigit(inChar))
    {
      inString += (char)inChar;
    }
    if (inChar == '\n')
    {
      Serial.print("Value:");
      y = inString.toInt();
      Serial.println(y);
      inString = "";
    }
  }
}

void SetZeroPositionH()                                                   // функция автоматической установки нулевого положения ШД
{
  sens = digitalRead(HALL);                                               // снимаем показания с датчика Холла
  if (sens == LOW)                                                        // если датчик сработал, то устанавливаем текущую позицию как нулевую
  {
    digitalWrite(LED, HIGH);                                              // включаем индикатор
    z = 1;                                                                // сбрасываем значение переменной
    TurretStepper.disableOutputs();                                       // отключаем входы драйвера для остановки ШД
    TurretStepper.setCurrentPosition(0);                                  // устанавливаем текущую позицию как нулевую
    Serial.print ("Position= ");
    Serial.println (TurretStepper.currentPosition());
    TurretStepper.setMaxSpeed(MAXSPEED);                                  // задаем максимальную скорость ШД в шагах в сек.
    TurretStepper.setSpeed(SPEED);                                        // задаем скорость ШД в шагах в сек.
    TurretStepper.setAcceleration(ACCELERATION);                          // задаем ускорение ШД в шагах в сек. за сек.
  }
  else  if (sens == HIGH)                                                 // если датчик не сработал, то вращаем ШД в заданных пределах
  {
    digitalWrite(LED, LOW);                                               // выключаем индикатор
    TurretStepper.run();                                                  // двигаемся в заданном направлении на указанное в команде moveTo в разделе setup число шагов
  }
}

 

Olger
Offline
Зарегистрирован: 28.02.2015

Под другой драйвер другой пример есть.

Вы какой используете?

7ramzes7
Offline
Зарегистрирован: 19.04.2020

Olger пишет:

Под другой драйвер другой пример есть.

Вы какой используете?

ULN2003

 

Olger
Offline
Зарегистрирован: 28.02.2015

Вот для ULN

// Пример для проверки работы ШД поворота башни.
// ШД 28BYJ-48 с подключением через ULN2003
// У ШД в режиме HALFSTEP 360°=4076 шагов, 1шаг=0,088°, 1359 шагов соответствуют 120°.
// У ШД в режиме FULL4WIRE 360°=2038 шагов, 1шаг=0,176°, 120°=679 шагов
// Управление вводом чисел из диапазона передаваемого пультом: 1-124 против ЧС и 126-250 по ЧС
// Автоматический поиск и установка нулевой позиции по сигналу от датчика Холла.

String inString = "";                                             // string to hold input
#define HALFSTEP 8                                                // определяем интерфейс подключения ШД 
#define motorPin1  10                                             // IN1 на ULN2003   
#define motorPin2  9                                              // IN2 на ULN2003   
#define motorPin3  8                                              // IN3 на ULN2003   
#define motorPin4  7                                              // IN4 на ULN2003   
#define LED 13                                                    // выход на светодиод   
#define HALL 2                                                    // вход датчика Холла   
byte sens;

#include <AccelStepper.h>                                         // подключаем библиотеку
//AccelStepper TurretStepper (HALFSTEP, motorPin1, motorPin3,
                            //motorPin2, motorPin4);                // объявляем объект с именем TurretStepper

AccelStepper TurretStepper (AccelStepper::FULL4WIRE, motorPin1, motorPin3,
                            motorPin2, motorPin4);                // объявляем объект с именем TurretStepper

int y;
int pos;
long angle;
byte z;
void setup()
{
  Serial.begin(9600);
  TurretStepper.setMaxSpeed(1000.0);                              // задаем максимальную скорость ШД в шагах в сек.
  TurretStepper.setSpeed(1000.0);                                 // задаем скорость движения ШД в шагах в сек.
  TurretStepper.setAcceleration(600.0);                           // задаем ускорение ШД в шагах в сек. за сек.
  z = 0;                                                          // инициируем процедуру установки нулевого положения ШД по датчику Холла при включении
  TurretStepper.moveTo(679);                                     // задаем диапазон движения в шагах для автоматической установки нулевой позиции: ±120°
  pinMode(LED, OUTPUT);                                           // определяем порт индикатора как выход
}

void loop() {

  EnterValue();                                                   // функция для ввода числового значения режима работы

  if (z == 0)                                                     // Автоматическая установка нулевой позиции по сигналу датчика Холла
  {
    SetZeroPositionH ();                                          // вызов функции автоматической установки нулевого положения ШД
  }

  if (y >= 126 && y <= 250)                                       // поворот на правый борт: против ЧС для кормовой башни и по ЧС для носовой башни
  {
    angle = map(y, 126, 250, -1, -679);                          // перевод вводимых значений в диапазон шагов ШД, 
    TurretStepper.enableOutputs();                                // включаем выходы драйвера
    TurretStepper.moveTo(angle);
  }
  if (y >= 1 && y <= 124)                                         // поворот на левый борт: по ЧС для кормовой башни и против ЧС для носовой башни
  {
    angle = map(y, 1, 124, 679, 1);                              // перевод вводимых значений в диапазон шагов ШД, 
    TurretStepper.enableOutputs();                                // включаем выходы драйвера
    TurretStepper.moveTo(angle);
  }
  if (TurretStepper.distanceToGo() != 0)                          // пока ШД не прошел указанные шаги, т.е. дистанция до указанного числа шагов не равна 0
  {
    TurretStepper.run();                                          // двигаемся в заданном направлении на указанное число шагов
    pos = TurretStepper.currentPosition();                        // сохраняем текущее положение ШД в шагах в переменную
    //Serial.print ("Position= ");
    //Serial.println (pos);
  }
  else                                                            // а когда ШД прошел указанные шаги, т.е. дистанция до указанного числа шагов  = 0
  {
    TurretStepper.disableOutputs();                               // декативируем пины управления драйвером для остановки ШД
    pos = TurretStepper.currentPosition();                        // сохраняем текущее положение ШД в шагах в переменную
    //Serial.print ("Position= ");
    //Serial.println (pos);
  }

  if (pos == 0) digitalWrite(LED, HIGH);                           // в нулевом положении ШД включаем индикатор
  if (pos != 0) digitalWrite(LED, LOW);                            // во всех остальнх положениях ШД выключаем индикатор


  // ниже скобка loop
}

void EnterValue()                                                  // функция перевода вводимых в монитор серийного порта строковых значений чисел в целые числа (int)
{
  while (Serial.available() > 0)
  {
    int inChar = Serial.read();
    if (isDigit(inChar))
    {
      inString += (char)inChar;
    }
    if (inChar == '\n')
    {
      Serial.print("Value:");
      y = inString.toInt();
      Serial.println(y);
      inString = "";
    }
  }
}

void SetZeroPositionH()                                           // функция автоматической установки нулевого положения ШД
{
  sens = digitalRead(HALL);                                       // снимаем показания с датчика Холла
  if (sens == LOW)                                                // если датчик сработал, то устанавливаем текущую позицию как нулевую
  {
    digitalWrite(LED, HIGH);
    z = 1;
    TurretStepper.disableOutputs();
    //TurretStepper.stop();
    TurretStepper.setCurrentPosition(0);
    //Serial.print ("Position= ");
    //Serial.println (TurretStepper.currentPosition());
    TurretStepper.setMaxSpeed(1000.0);                            // задаем максимальную скорость ШД в шагах в сек.
    TurretStepper.setSpeed(1000.0);                               // задаем скорость ШД в шагах в сек.
    TurretStepper.setAcceleration(500.0);                         // задаем ускорение ШД в шагах в сек. за сек.
  }
  else  if (sens == HIGH)                                         // если датчик не сработал, то вращаем ШД в заданных пределах
  {
    digitalWrite(LED, LOW);
    if (TurretStepper.distanceToGo() == 0)
      TurretStepper.moveTo(-TurretStepper.currentPosition());
    TurretStepper.run();
  }
}