Не возвращает каретку слайдер в предполагаемое положение try 2

Всем привет.

Есть слайдер возящий камеру по полуметровой рельсе.

Для управления положением каретки по следующему алгоритму:
Найти нулевую позицию, следя за состоянием концевика, отодвинутся от этой позиции на 100 шагов, а дальше
выполнять цикл:

Включить лазер на одну секунду.
Выключить лазер.
Сделать паузу в 5 сек
Прокуртить ШД на 30000 шагов в одном направлении.
Сделать паузу в 5 сек
Включить лазер на одну секунду.
Выключить лазер.
Прокуртить ШД на 30000 шагов в ПРОТИВОПОЛОЖНОМ направлении.
Сделать паузу в 5 сек

Для этого написан скетч.

#include <AccelStepper.h>

AccelStepper Stepper1(1, 13, 12); // Использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)

int LASER = 8; // Пин лазера.

int buttonPin = 11; // Пин концевика.

static bool newZeroPoint = true; // Флаг указывающий, что надо найти сначала нулевую позицию, а потом делать остальное.

void setup() {
  pinMode(buttonPin, INPUT); //
  pinMode(LASER, OUTPUT); // инициализируем Pin8 как выход
  Stepper1.setMaxSpeed(1000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
  // скорость перемещения по слайдеру 20 секунд -- Stepper1.setMaxSpeed(1800);
  Stepper1.setAcceleration(300); //устанавливаем ускорение (шагов/секунду^2)
}

void loop() {
  // Поиск начальной позиции.
  if (newZeroPoint)
  {
      if (digitalRead(buttonPin)) 
      {
          // Если концевик сработал, то выставляем нуливую позицию и завершаем поиск.
          Stepper1.setCurrentPosition(0);
          Stepper1.moveTo(100); 
          Stepper1.runToPosition(); 
          delay(1000);  // Пауза в 1 сек
          newZeroPoint = false;
      } else
      {
        // Двигаемся влево на один шаг, до тех пор пока не сработает концевик.
        if (Stepper1.distanceToGo() == 0) {Stepper1.moveTo(Stepper1.currentPosition() - 1);}
        Stepper1.run();
      }
  }
  else
  {
	digitalWrite(LASER, HIGH);   // Включение лазера на 1 секунду
	delay(1000); // Включение лазера на 1 секунду
	digitalWrite(LASER, LOW); // Выключение лазера
	
    Stepper1.moveTo(30000);  // Позиция №1
    Stepper1.runToPosition();  // Ждем пока двигатель не встанет в заданную позицию
    delay(5000);  // Пауза в 5 сек
	
    digitalWrite(LASER, HIGH);   // Включение лазера на 1 секунду
	delay(1000); // Включение лазера на 1 секунду
	digitalWrite(LASER, LOW); // Выключение лазера
	
	Stepper1.moveTo(-30000);  // Позиция №1
    Stepper1.runToPosition();  // Ждем пока двигатель не встанет в заданную позицию
    delay(5000);  // Пауза в 5 сек
  }
}

Все отрабатывает кроме возвращения в рабочую позицию, которая на 100 шагов отличается от начальной позиции, задаваемой срабатыванием концевика. И в результате каретка упирается в концевик !!!

Может кто подскажет,что я не учел в скетче ???

ну например

строка
“”"
Stepper1.moveTo(100);
“”"
как раз отодвигает рабочее положение от начального…
что бы при выполнении строки
“”"
Stepper1.moveTo(-30000);
“”"
каретка не цепляла концевик…

Stepper1.moveTo(100); 
Stepper1.runToPosition();

Заменить на

Stepper1.runToNewPosition();

?

Sadman41, привет,
ты наверное хотел сказать что заменить строки
“”"
Stepper1.moveTo(100);
Stepper1.runToPosition();
“”"
на строки
“”"
Stepper1.moveTo(100);
Stepper1.runToNewPosition();
“”"
???

Или все таки
“”"
Stepper1.moveTo(100);
Stepper1.runToPosition();
“”"
на строку
“”"
Stepper1.runToNewPosition();
“”"
???

У меня только один вариант прочтения выходит.

Если их два, то пробуй оба.

А, ну да - позицию ещё указать нужно: runToNewPosition(100500)

@lednevandrey04
А вы описание библиотеки смотрели? Операция moveTo() перемешает каретку в АБСОЛЮТНЫХ координатах, а не в относительных. Так что последовательность операций

и не должна возвращать каретку в начальное положение.
Вот вы жалуетесь:

а как ей иначе поступать, если вы ее посылаете на 30тыс шагов дальше концевика???

Если вам надо сначала сдвинуться на 30 тыс в одну сторону, а потом на 30 тыс назад - пишите так:

Stepper1.moveTo(30000); 
.....
Stepper1.moveTo(0); 

Или используйте метод move() - он работает в относительных единицах

Stepper1.move(30000); 
.....
Stepper1.move(-30000); 

Ну да, если ничего не помогает, прочтите, наконец, документацию!

Шайсе.
Я тоже не туда смотрел…

В течении времени существования этой ветки форума, наткнулся на на одно открытие. Конечно есть документация к библиотеке, и там все конечно можно выяснить, но пережевывать тонны чтива, по этому маленькому вопросу, ЛОМАЕТ. Поэтому и существуют форумы.

На почту, от кого то из подписчиков, пришло письмо, в котором в 20 строках, объяснена разница между коммандами для относительных, и абсолютных координат. Опять же, лень смотреть его данные для связи, но ему огромное С П А С И Б О… К отвечавшим на мой вопрос участникам, такого желания не возникает… Но всЁ равно, С П А С И Б О…

Вот лень, матушка, надо было страницу вверх пролистать…
b707, С П А С И Б О…

Т.е. форумы нужны для того, чтобы на них найти идиота, который будет бесплатно делать нудную работу за тебя?
Понятно.

Никто вам не писал. Это уведомление от форума

Но если б сначала увидел ваши рассуждения о лени и о том, “для чего нужны форумы” - помогать бы не стал.
Шел бы ты, Андрей, отсюда подальше.На этом форуме таким как ты - не рады.

Два последних коментатора очень злые. Наверное старые… Все мы тонем в море информации, и методов спасения очень много. Ну не понравился Вам, мой метод спасения, но это не повод посылать так далеко… Можно было напрвить в Коммерческий отдел… Кстати я сейчас формирую заказ в этом разделе.

Мне нравится это “кстати” :slight_smile: Вы меня рассчитывали этим купить или как? :slight_smile:
Если человек ленивый и не хочет учиться, то у него ДАЖЕ ЗА ДЕНЬГИ вряд ли получится воплотить проект.
Лучшие заказчики, как я когда-то писал на этом же форуме - это те, кто понимает как сделать заказ лучше исполнителя. А с ленивыми неучами даже за деньги не дай бог связаться

Ну если Вы b707, единственный и неповторимый кто разбирается в этой теме, то Да, рассчитывал Вас купить. Но думаю что у Вас завышенное самомнение…

я умею читать документацию. Это мое главное преимущество над вами.

По этой шкале измерений, Вы самый СаМый. :grinning: