биполярный шаговый двигатель и кнопка, библиотека AccelStepper
- Войдите на сайт для отправки комментариев
Сб, 21/07/2018 - 20:37
Здравствуйте уважаемые форумчане!
Прошу помощи в подключении шагового двигателя через кнопку. передо мной стоит задача сделать двухосевое перемещение с помощью 2х шаговиков и 4 кнопок (вперед назад) по схеме подключения вопросов наверное нет, так как на простеньком скетче для проврерки шаговиков все работает, но без кнопок, т. е загружаю крутится вперед пауза назад... подключаю через ардуино уно, 12,13 степ дир для 1-го шаговика, 10, 11 степ дир для 2го, энайбл пока не подключаю, потом заведу на концевик. Драйвер у меня ТНВ71138 на 3 А. К аналоговым входам А0-А3 подключаю 4 кнопки которые замыкают +5В которые беру с платы. Загружаю скетч :
#include <AccelStepper.h>
AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988)
AccelStepper Stepper2(2,11,10);
int dir = 1; //используется для смены направления
void setup() {
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
pinMode(A2,INPUT_PULLUP);
pinMode(A3,INPUT_PULLUP);
Stepper1.setMaxSpeed(50); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
Stepper1.setAcceleration(5); //устанавливаем ускорение (шагов/секунду^2)
Stepper2.setMaxSpeed(50); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
Stepper2.setAcceleration(5);
}
void loop() {
if (digitalRead(A0)==HIGH) {Stepper1.move(50000*dir);
}
else if (digitalRead(A1)==HIGH) {Stepper1.move(50000*dir*(-1));
}
else if (digitalRead(A2)==HIGH){Stepper2.move(50000*dir);
}
else if (digitalRead(A3)==HIGH){Stepper2.move(50000*dir*(-1));
}
Stepper1.run();
}
и один из двигателей начинает подрагиваться при чем никто из них не реагирует на кнопки. Помогите пожалуйста разобраться в чем ошибка? можно ли подключать подтягиваюший резистор на 4 кнопки при условии что они одновременно никогда не нажимаются?
Вставка программного кода в тему/комментарий
ИМХО - библиотека кривая. Напиши алгоритм сам - там несложно. 1-2-3 или в обратную сторону 3-2-1.
Зачем эти идиотсткие библиотеки? Скорее всего проблема в таймере - его вызывают в каждом цикле...
Отрабатывайте по прерываниям (1/2 или 1/4 к времени шага двигателя.)
никакая она не кривая.
нормальная библиотека с кучей возможностей если ей уметь пользоваться.
единственный недостаток - медленная (если для кого то важна скорость двигателей).
а тс неплохо для начала научится с кнопками работать, а уже потом к движкам.
Спасибо за совет ноучиться, но если бы научился не было бы таких проблем, я как раз расчитывал, что форум мне поможет научиться. Ну с движками я как раз работаю.. по своей конструкторской работе, просто в гараже хотел частично автоматизировать свой сверлильный станок.
Могу помочь научиться. Поищите "blink без delay". Понимаете как он работает?
Спасибо за совет ноучиться, но если бы научился не было бы таких проблем, я как раз расчитывал, что форум мне поможет научиться.
вам и подсказали.
а если бы внимательно читали, то увидели в разделе "Программирование" вторую прикреплённую тему, где о кнопках и ведутся разговоры.
svorog, а вот Вы сами пытались пробежаться глазами по собственному коду и представить, как он должен работать?
Вот смотрите: мы заходим в loop. Дальше - пусть у нас нажата кнопка и мы подаем команду библиотеке. Подали - побежали дальше. А дальше - новый цикл loop и новая команда. Причем, интервал между командами будет несколько микросекунд, т.е. намного меньше, чем время выполнения одной команды двигателем. Т.е. не успел двигатель сделать и одного шага, а Вы подаете на него следующую команду. Эта команда прерывает действие предыдущей и снова готовит двигатель к первому шагу. На третьем проходе цикла все повторяется.
Вы сами не даете двигателю возмложности сделать ни одного шага.
я представлял работу алгоритма так: сначала контроллер проверяет какая кнопка нажата, находит и начинает вращать двигатель пока условие выполняется, ну то есть бегает в том цикле if который выполняется, как только отпускаем он начинает дальше бегать искать нажатую кнопку. Предполагал что возможно он последовательно проверяет все кнопки но думал что это происходит с бешенной частотой и все равно будет работать незаметно для меня. Как Вы думаете можно избавиться от этой проблемы? сделать задержку? про deley читал что он будет сильно тормозить контроллер, есть еще какая то возможность выдержать паузу?
я представлял работу алгоритма так: сначала контроллер проверяет какая кнопка нажата, находит и начинает вращать двигатель пока условие выполняется,
Ну, вот, так и напишите! У Вас-то совсем другое написано.
бегает в том цикле if
В природе не существует никаких циклов "if". Для начала, прочитайте описание языка.
Я же вам написал про блинк без дилэй. Задача у вас абсолютно типовая, тыщу раз деланная. В незамысловатом варианте делается вообще без библиотеки.
я представлял работу алгоритма так: сначала контроллер проверяет какая кнопка нажата, находит и начинает вращать двигатель пока условие выполняется, ну то есть бегает в том цикле if который выполняется, как только отпускаем он начинает дальше бегать искать нажатую кнопку.
Вы сами себе противоречите.
Вы предполагаете, что данная функция блокирующая, т.е. не дает возможности контроллеру ничего делать до тех пор, пока не закончится ее выполнение. Если так, то ни о каком управлении двумя двигателями (да и чем-либо еще) одновременно речи идти не может. А Вы пишете, что двигателей у Вас два. Для двух двигателей библиотека с блокирующими функциями не подходит.
Да и вообще блокирующие функции - зло. Применение именно блокирующей функции - исключение, которое должно быть обусловлено безусловной необходимостью. К счастью, подобные случаи можно пересчитать по пальцам.
Предполагал что возможно он последовательно проверяет все кнопки но думал что это происходит с бешенной частотой и все равно будет работать незаметно для меня. Как Вы думаете можно избавиться от этой проблемы? сделать задержку? про deley читал что он будет сильно тормозить контроллер, есть еще какая то возможность выдержать паузу?
Вы читаете, что Вам пишут?
Перечитайте посты 4, 6 и 8 - там уже неоднократнол Вам сообщали, что нужно делать.
...Вы читаете, что Вам пишут?
Перечитайте посты 4, 6 и 8 - там уже неоднократнол Вам сообщали, что нужно делать.
[/quote]
Да, все посты я конечно же читал, что касается темы про кнопки то прочитал еще раз, но так и не понял возможно ли к нескольким кнопкам подтягивать резистор или нет.
"blink без delay" не понял как нужно применить, для управляющего импульса? или использовать millis для паузы?
От библиотеки отказываться не хочу потому что хочу плавный пуск и регуруемую скорость.
То что задача стандартная и сто раз решаемая я понимаю потому и хотел получить пару практических советов.
в институте проходили СИ но после этого в этом направлении не работал, подсознательно алгоритм представляю, но по книжкам ввиду большого количества новой информации никак разобраться не получается...
Переделал код с задержкой, но ситуация не изменилась(
Если кого то есть время и возможность указать на ошибки и дать практический совет буду очень признателен.
не получается у вас нахрапом тему с кнопками взять...
пока с кнопками и логикой запуска и остановки моторов не разберётесь - будете топтаться на месте.
кстати, есть куча библиотек для работы с кнопками - Bounce, OneButton....
Если кого то есть время и возможность указать на ошибки и дать практический совет буду очень признателен.
здесь нужно всю программу заново писать.
Да, все посты я конечно же читал, что касается темы про кнопки то прочитал еще раз, но так и не понял возможно ли к нескольким кнопкам подтягивать резистор или нет.
"blink без delay" не понял как нужно применить, для управляющего импульса? или использовать millis для паузы?
Какую бы Вам придумать наглядную аналогию...
Вот, скажем, есть лестница из, скажем, 100 ступенек. Вы увидели что-то на 20-й ступеньеке и спрашиваете, как туда добраться. Вам подсказывают, как можно дойти до 20-й ступеньки: с 19-й, с 18-й и с 17-й. А Вы не понимаете. Потому, что стоите лишь на 1-й или 2-й ступеньке.
В общем, единственное, что могу посоветовать - отложить эту задачу и начать с задач попроще.
Вот, скажем, задача с одниой кнопкой и одним светодиодом: напишите скетч, в котором по одному нажатию кнопки светодиод зажигается, а по повторному - гаснет. И так в цикле: включение, выключение, включение, выключение... Вск стабильно, без сбоев: по одному нажатию любой длительности светодиод переходит строго в противополдожное состояние.