Для управления положением каретки по следующему алгоритму:
Найти нулевую позицию, следя за состоянием концевика, отодвинутся от этой позиции на 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);
“”"
каретка не цепляла концевик…
Sadman41, привет,
ты наверное хотел сказать что заменить строки
“”"
Stepper1.moveTo(100);
Stepper1.runToPosition();
“”"
на строки
“”"
Stepper1.moveTo(100);
Stepper1.runToNewPosition();
“”"
???
Или все таки
“”"
Stepper1.moveTo(100);
Stepper1.runToPosition();
“”"
на строку
“”"
Stepper1.runToNewPosition();
“”"
???
@lednevandrey04
А вы описание библиотеки смотрели? Операция moveTo() перемешает каретку в АБСОЛЮТНЫХ координатах, а не в относительных. Так что последовательность операций
и не должна возвращать каретку в начальное положение.
Вот вы жалуетесь:
а как ей иначе поступать, если вы ее посылаете на 30тыс шагов дальше концевика???
Если вам надо сначала сдвинуться на 30 тыс в одну сторону, а потом на 30 тыс назад - пишите так:
Stepper1.moveTo(30000);
.....
Stepper1.moveTo(0);
Или используйте метод move() - он работает в относительных единицах
В течении времени существования этой ветки форума, наткнулся на на одно открытие. Конечно есть документация к библиотеке, и там все конечно можно выяснить, но пережевывать тонны чтива, по этому маленькому вопросу, ЛОМАЕТ. Поэтому и существуют форумы.
На почту, от кого то из подписчиков, пришло письмо, в котором в 20 строках, объяснена разница между коммандами для относительных, и абсолютных координат. Опять же, лень смотреть его данные для связи, но ему огромное С П А С И Б О… К отвечавшим на мой вопрос участникам, такого желания не возникает… Но всЁ равно, С П А С И Б О…
Но если б сначала увидел ваши рассуждения о лени и о том, “для чего нужны форумы” - помогать бы не стал.
Шел бы ты, Андрей, отсюда подальше.На этом форуме таким как ты - не рады.
Два последних коментатора очень злые. Наверное старые… Все мы тонем в море информации, и методов спасения очень много. Ну не понравился Вам, мой метод спасения, но это не повод посылать так далеко… Можно было напрвить в Коммерческий отдел… Кстати я сейчас формирую заказ в этом разделе.
Мне нравится это “кстати” Вы меня рассчитывали этим купить или как?
Если человек ленивый и не хочет учиться, то у него ДАЖЕ ЗА ДЕНЬГИ вряд ли получится воплотить проект.
Лучшие заказчики, как я когда-то писал на этом же форуме - это те, кто понимает как сделать заказ лучше исполнителя. А с ленивыми неучами даже за деньги не дай бог связаться