Библиотека AccelStepper
- Войдите на сайт для отправки комментариев
Втр, 05/02/2013 - 23:46
Прдключил шаговик через драйвер L293D. Пример ProportionalControl - работает. Подключаю через EASYDRIVER ( хочу использовать микрошаг) - не работает.
#include <AccelStepper.h> AccelStepper stepper(1, 3, 2); #define pot A0 void setup() { stepper.setMaxSpeed(1000); } void loop() { int val = analogRead(pot); stepper.moveTo(val); stepper.setSpeed(300); stepper.runSpeedToPosition(); }
Загружаю примеры для EASYDRIVER - всё нормально. Может кто то сталкивался с таким драйвером?
Нужно поворачивать шаговик в соответствии с положением потенциометра.
А у вашего драйвера, случайно нет вывода ENABLE ?
Есть, но его ни в одном примере не используют. На нём по умолчанию 5v.-драйвер вкл.
Этот вывод инвертирован, то есть когда на нем земля драйвер работает, когда +5 вольт драйвер отключен. Так же он подтянут резистором к земле на плате ,так что если не собираетесь программно отключать драйвер, не используйте этот вывод и ничего к нему не подключайте.
ENABLE не использую.
Как остальное подключаете описать можете?
http://www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html
Почему на схеме подключено к 8 и 9 выводу, а в примере проинициализированы 3 и 2 ?
я все примеры делал 3-2
Что это значит? не понимаю... всегда подключали к 3 и 2 выводам?
ДА. Я все скетчи прописывал step 3, dir 2.
Ну а этот пример работает?
работает
Как вообще проявляется "не работает"? не крутится? дергается? или что?
А этот?
И Blocking работает. Драйвер по умолчанию установлен на 1/8 шага. Заливаю пример из библиотеки ProportionalControl - мотор вращается постоянно, потенциометр незначительно изменяет скорость, в крайних положениях останавливается.
Дописал мапирование - никаких изменений.
Вы бы лучше залили бы скетч от maksimа и попробовали.
Ваша ошибка в том, что Вы используете неблокирующую функцию runSpeedToPosition(). В этом случае после нее следует дописать строчку
Или следует применить блокирующую функцию runToNewPosition();
Вы бы лучше залили бы скетч от maksimа и попробовали.
Ваша ошибка в том, что Вы используете неблокирующую функцию runSpeedToPosition(). В этом случае после нее следует дописать строчку
Или следует применить блокирующую функцию runToNewPosition();
Скетч от maksimа я заливал и он работает. Попробую доработать скетч , как вы советуете, отпишусь.
Не могу понять, почему с драйвером L293D отлично работает (только нет микрошага), а подключаю easydriver - ерунда какая то.
Дописал
никаких изменений. А на runToNewPosition(); ругается, что в библиотеке такого нет.
Как же он может ругаться? У maksimа же именно эта функция используется!
Условие можете попробовать заменить на "стандартное":
Или даже так:
Ваша ошибка в том, что Вы используете неблокирующую функцию runSpeedToPosition().
Но я же использую стандартный пример ProportionalControl из библиотеки AccelStepper.h. и ничего не переделываю. С драйвером L293D отлично работает (только нет микрошага), а подключаю easydriver - ерунда какая то.
Посмотрите, не перепутали ли сигналы step и dir
Попробуйте добавить в setup
Нет, правильно подключаю.
Попробуйте так:
Я когда спрашивал про скетч maximа, имел в виду скетч #13
Еще возможно для Вашего драйвера длина степа (импульса) слишком коротка (по умолчанию она 1 мкс). Добавте в сетуп:
А потенциометр вы как подключаете?
Ну если с другим драйвером работало, то можно считать подключение резистора нормальным.
После четырёх дней разбирательств и задавания вопросов на форуме предположил, что в библиотеке какой-то глюк. Связался с автором и задал вопрос - оказалось так и есть. Он откорректировал библиотеку ( ВЕРСИЯ 1.29) и всё заработало. Правда есть джиттер в фиксированном положении.
Чтобы не было джиттера, нужно вводить гистерезис. Например, так:
Спасибо AlexFisher. Попробовал - классно получилось. Джиттер пропал. Про гистерезис ничего не знал ( в голове крутится какая то петля гистерезиса .....)
Это именно петля гистерезиса. Если сделаешь график зависимости положения двигателя от положения движка резистора, то получишь петлю из учебника.
Другое название - порог чувствительности или зона нечувствительности.
Экспериментально подбери минимальное значение. 5 - это я с потолка взял.
Ну хотя и с потолка, зато сразу в точку!!!!!!!!!!!!!
Спасибо.
Добрый день, интересует микрошаговый режим управления униполярного шаговика. Есть ли или существуют ли вообще библиотеки для микрошага под ардуино? Стоит задача получить микрошаг только силами контроллера (Uno) через ШИМ, не используя сторонние драйвера. Может есть у кого - нибудь подобный пример ?
А зачем, если всё равно прийдётся использовать драйвер. Библиотека не создаёт, а поддерживает режим микрошага, задаваемый драйвером.
Аксел-степер - как раз такая бимблиотека - с поддержкой микрошага через ШИМ - прпосто нужны будут ключи на выходах.
А! нет! оib,cz! Это AFMotor поддерживает. Кстати, может работать в паре с акселстеппер. Но для AFMotor нужен будет соответствующий шилд, или собирать самому, или допиливать библиотеку...
Аксел-степер - как раз такая бимблиотека - с поддержкой микрошага через ШИМ - прпосто нужны будут ключи на выходах.
А! нет! оib,cz! Это AFMotor поддерживает. Кстати, может работать в паре с акселстеппер. Но для AFMotor нужен будет соответствующий шилд, или собирать самому, или допиливать библиотеку...
Кстати если нужен был полу-шаг, а не микро-шаг (часто путают их), то поддерживает и acel.
AccelStepper stepper(AccelStepper::HALF4WIRE, 8,10,9,11);
Может кто-нибудь помочь новичку в программировании? Есть програмка заставляющая вращаться шаговик на 360, 180, 45 градусов в разные стороны. Программка устраивает, НО необходимо использование полушага. Подскажите как эту програмку переделать под аксельстеппер?
В библиотеке AccelStepper есть примеры и работа с полушагом. Посмотрите библиотеку, там всё понятно.
Всё таки подскажите как вращать шаговик в одну сторону на 90 градусов, потом в другую на 90 ?
Посмотрите библиотеку, примеры из неё, напишите код, попробуйте запустить. Если будут проблемы, тогда покажите код и задайте конкретный вопрос - тогда вам помогут. А ковырятся и писать код за вас никто не будет.
Повернул шаговик на 90 градусов, как обратно его вернуть в исходное положение?
А какое у вас исходное положение? Сколько градусов?
Исходное 0 градусов
Ну так если вы для того что-бы повернутся в 90 делали stepper.moveTo(90);
То что-бы повернутся в 0 нужно сделать
stepper.moveTo(?);
А вообще, у вам выше уже советовали - посмотрите примеры идущие с библиотекой. Там есть пример, который показывает как последовательно становится в разные позиции.
В ArduinoIDE идете File/Examples/AccelStepper/Blocking и смотрите. Или пример Random() если нужен не блокирующий вариант.
можно ли в этой библиотеке отследить срабатывание концевика? Другими словами, как прервать движение, начатое по команде stepper.runToNewPosition(xxx); ?
или
заваичит от задачи
Доброго времени суток!
Появился вопрос по этой библиотеке, прошу Вашей помощи.
Задача следующая: заставить два шаговых мотора крутиться на заданное количество шагов за заданный период времени. У каждого мотора своё количество шагов, но время прохождения одно. Шаги и время задаются кнопками, с этим проблем никаких нет.
Предполагаю, что лучше моторы крутить рассчитав скорость (шаги делённые на время). Тут и возникает проблема.
Если сделать так:
speed1 = steps1 / runtime;
speed2 = steps2 / runtime;
stepper1.setSpeed(speed1);
stepper1.moveTo(steps1);
stepper2.setSpeed(speed2);
stepper2.moveTo(steps2);
Моторы слабо вибрируют, но не двигаются. Если вместо speed1 и speed2 ставить конкретное число - все работает без нареканий.
В какую сторону копать? Заранее Спасибо за помощь.
а если так?
Определитесь уже с единицами измерения! Скорость нужно задавать в шагах в секунду, а не в шагах в миллисекунду! И не стоит применять float, нужно использовать long.
Проблема может быть в промежуточных округлениях (нужно использовать опыт работы с калькулятором :) ) Если время в миллисекундах, то расстояние нужно сначала умножить на 1000 а только потом делить на время.
Естественно, в моем проекте скорость в секундах, скорость float speed (значения небольшие, не более 100 - 150 шагов в сек.)
а если так?
А в чем принципиальная разница? Через час окажусь рядом с ардуинкой, попробую.