нужна помощь в управлении шаговым двигателем
- Войдите на сайт для отправки комментариев
Чт, 04/03/2021 - 19:21
Здравствуйте.
Я только начинаю изучать ардуино. Нужно чтобы после нажатия кнопки первый шаговик прошел некоторое количество шагов, после чего второй шаговик проходит тоже некоторое количество шагов, а потом столько же обратно, это работает. но нужно еще чтобы после очередного нажатия кнопки они остановились. вот в этом проблема они останавливаются если успеть нажать кнопку во время паузы после обратного хода второго шаговика. как то можно это сделать или только сбросом на самой ардуине?
#include <Stepper.h> int val=0; const int stepsPerRevolution = 64; // количество шагов на один оборот const int button = 14; const int led = 13; Stepper myStepper1(stepsPerRevolution, 8,9,10,11); //подключение к пинам 8…11 на Ардуино Stepper myStepper2(stepsPerRevolution, 4,5,6,7); //подключение к пинам 8…11 на Ардуино void setup() { myStepper1.setSpeed(20); //установка скорости вращения ротора myStepper2.setSpeed(20); //установка скорости вращения ротора pinMode(led, OUTPUT); pinMode (button, INPUT); } void loop() { if(digitalRead(button)==HIGH)//если кнопка нажата { val = !val; delay(500); digitalWrite(led,val); } if(val) { myStepper1.step(100); delay(50); //stepCount1++; myStepper2.step(100); //stepCount1++; myStepper2.step(-100); delay(1000); } }
http://arduino.ru/tutorials/BlinkWithoutDelay
Можно. Применяя метод конечных автоматов, например.
В строка №22, 28 и 33 Вы тупо стоите и ждёте. Вопрос: кто в это время следит за нажатием кнопки? Если ответ "никто" или "тень отца Гамлета", то следующий вопрос: ну, а если никто не следит нажата она или нет, то кто же тогда будет останавливать моторы?
попробовал с millis, но так и не получается остановить по нажатии кнопки
Это Вы что написали?.
Внимательно смотрим на строку №19. А потом на строку №20 (можно и на №29) и отвечаем сами себе. Возможно ли, чтобы хоть когда-нибудь, хоть при каких-то положениях звёзд, Луны и прочих светил, условие "timer-millis()>=1000" в строке №20 оказалось истинным?
Ответьте.
Похоже, Вы совсем не поняли как пользоваться millis. Попробуйте таки в этом разобраться по примеру.
шаговые моторы делают один цикл и останавливаются. кнопкой все также не выключается
Ну, а с чего её останавливаться? Вы ведь состояние кнопки проверяете внутри условия
if
(currentMillis-previousMillis>1000)
. Стало быть Вы плюёте на кнопку целую секунду и НЕ проверяете её. Потом один разок по быстрому проверили и снова плюёте секунду.Как подключена кнопка? "digitalRead(button)==HIGH" - это нажата или отпущена.
так тоже не изменилось
HIGH - нажата
Тут надо отделить "мух от котлет", кнопки отдельно, управление шаговым двигателем отдельно.
и как это сделать?
ТС, у вас явные проблемы с логикой (в смысле - с логикой кода)
Вот кусок вашего кода из сообщения 11. Результативную часть операторов if я выкинул, оставил только логику
Смотрите, если условие в первой строчке истинно, то buttonState==LOW. Во второй строке мы его инвертируем, значит теперь buttonState==HIGH. Зачем же тогда в третьей строке его снова проверять условием IF ? - и так понятно, что оно HIGH
Идем далее - условие в третьей строке истинно, если buttonState==HIGH. Соответственно else - это когда buttonState==LOW. А мы в этом else зачем-то снова присваимаем переменной то значение, которая она и так имеет. Нафига? Это не говоря о том, что, как мы выяснили в первом абзаце - программа в эту ветвь вообще никогда не попадет, потому что строки 1 и2 ГАРАНТИРУЮТ, что buttonState==HIGH
ИМХО, у вас огромные проблемы с проектированием алгоритма. Вам пока не код писать надо - начните с формулирования алгоритма на бумажке своими словами, на родном языке, а не на С++
.
и как это сделать?
Правильно, как мне кажется, это отслеживать нажатие кнопки прерыванием...
И так правильно и с millis правильно. Вообще если работает - значит правильно и наоборот )
и как это сделать?
попробуйте собрать светофор, потом усложните его - добавьте кнопку. Это простая задача, поможет с логикой. потом заставьте ваш светофор мигать по нажатию кнопки.
потом заставьте ваш светофор мигать по нажатию кнопки.
я бы добавил сразу по нажатию кнопки, в любой момент чтобы загорался желтый и мигал 10 сек, потом обычный режим к-ж-з ) после этого можно продолжать управлять ШД
в эмуляторе двигатель начинает вращаться после нажатия кнопки, а на реальной ардуине сразу после включения питания. Почему так может быть?
INPUT_PULLUP
INPUT_PULLUP
Что это значит?
INPUT_PULLUP
https://bit.ly/2OWhhOe
при первом нажатии кнопки включается светодиод и начинает вращаться двигатель, при повторном нажатии, мотор останавливается, но светодиод не гаснет. после третьего нажатия гаснет светодиод, мотор стоит. еще одно нажатие и повторяется все как после первого нажатия. как исправить чтобы останавливался мотор и гас светодиод одним нажатием?
при первом нажатии кнопки включается светодиод и начинает вращаться двигатель, при повторном нажатии, мотор останавливается, но светодиод не гаснет. после третьего нажатия гаснет светодиод, мотор стоит. еще одно нажатие и повторяется все как после первого нажатия. как исправить чтобы останавливался мотор и гас светодиод одним нажатием?
код не код, а бред какой-то.. Надергали по кускам из инета? Вы в нем хоть что-то понимаете?
Что у вас в строке 38? вы понимаете, что из-за этой строки все прочие перемещения серво не имеют смысла - при каждом входе в луп серва будет возвращаться в позицию 90, независимо от любых других условий.
Ср светодиодом полная свистопляска. Если светодиод выкючен - он зачем-то каждые полсекунды еще раз выключается... хотя он И ТАК ВЫКЛЮЧЕН. Если же он включен - он тоже включается снова и снова. но только с периодичностью в 1000 мс.
Да и со временем полный кавардак. Если пользуетесь миллис - забудьте о делаях. Последний цикл по миллис должен исполнятся раз 1000мс. но из-за делеев - реально будет выполнятся более 1.5 сек...
Короче - я бы этот код просто выкинул в мусор и написал новый. Исправлять ошибки тут бестолку, его надо переписывать полностью.
если у кнопки делать pullup то цикл шаговига и сервы делается один раз сразу после включения питания и после нажатия кнопки тоже только один раз, и после следующего нажатия тоже. а если без pullup, то при включении питания цикл шаговика и сервы сразу работает без остановки, на кнопку никак не реагирует
убрали строчку с включением серво из ЛУП, в остальном все осталось, как я писал в #25 - не код, а бредятина
Вы так и не ответили - вы хоть что-нибудь в этом коде понимаете или просто накопировали куски из примеров в ютубе? Вы с этим кодом. с минимальными исправлениями - сюда ходите уже скоро два месяца. За это время можно было 2-3 учебника по Си наизусть выучить
прочитайте самое первое сообщение
использовал вот этот код светофора, вместо смены цветов светофора вставил шаговик и серву
прочитайте самое первое сообщение
что я должен там прочитать? Что вы начинающий? - так два месяца прошло уже, а вы с места вовсе не сдвинулись
в коде который я использовал все работает, меняются режимы с нажатия кнопки, хотя вы писали что в коде непонятно что со светодиодом. но у меня кнопка только запускает один цикл, а останавливать не выходит после повторного нажатия кнопки
у меня кнопка только запускает один цикл, а останавливать не выходит после повторного нажатия кнопки
и не выйдет.
вам несколько человек написали - у вас цикл работы на делееях, вы во время работы кнопку не читаете вовсе.
я пробовал убирать делеи, у меня тогда серва дергается как попало? и не останавливается цикл все равно
я пробовал убирать делеи, у меня тогда серва дергается как попало? и не останавливается цикл все равно
показывайте код.
тот же самый но без делеев
тот же самый но без делеев
тогда и ответ тот же самый
так тоже не работает серва, шаговик все время крутится, но на кнопку реагирует
слушайте, вы чего пытаетесь добиться-то? Стуча по клавишам не глядя, как обьязьянка - надеетесь написать "Войну и Мир"? Мы чего ради вообще это все обсуждаем 2 месяца? вам уже говорили про то, что с кнопками надо использовать подтяжку? - и где она в коде?
Кроме того, весь код снова - какое-то нагромождение бессмысленных операторов. Вот это вот что. по вашему делает?
зачем два абсолютно одинаковых условия подряд? Что вы вообще хотели тут написать?
Мой вам совет - отложите этот код в сторону, возьмите любую книжку "Си для чайников" и прочитайте ее от корки до корки. Не поймете - читайте еще и еще, пока не начнете понимать. И пока не этого не сделаете - лучше больше на форум не пишите.
кнопка то сейчас работает, а серва стоит иногда жужит
зачем два абсолютно одинаковых условия подряд? Что вы вообще хотели тут написать?
у ТС явно наблюдается нарушение причинно-следственных связей... и в коде и в логике размышлений...
для ТС
пост 37 строки 51,54,58 - подпишите, что и зачем там написано. и вообще напишите отдельный код только для сервы с указанной логикой, шаговик выкиньте для теста.
кнопка то сейчас работает, а серва стоит иногда жужит
да она (серва) просто охреневает от поставленной задачи "стой там! иди сюда!"
убрал эти строки, также работает только шаговик, убрае еще шаговик, серва крутится. и останавливается после нажатия кнопки, после повторного нажатия снова крутится. почему и то и другое не работает вместе?
убрал эти строки, также работает только шаговик, убрае еще шаговик, серва крутится. и останавливается после нажатия кнопки, после повторного нажатия снова крутится. почему и то и другое не работает вместе?
напишите простой код, в котором будет крутиться шаговик и серва, первый просто крутиться, а вторая от нижнего предела до верхнего и выложите код с результатом. Если результата нет, тоже выложите - но код должен быть подписан, пусть только основные строки (не сетап, а логика подписана)
крутится только шаговик
пост 45 строка 16 сколько времени вы даете серве на отработку команды перед строкой 17?
ответ - ни сколько, вы тупо ей кидаете новую команду... это как слона превратить в волчок.
дайте серве время на отработку текущей команды, а потом требуйте от нее выполнение новой.
UPD . для начала проще использовать флаг и таймер на millis
добавил миллис, серва и шаговиг работают одновременно, шаговик крутится без остановок
пост 45 строка 16 сколько времени вы даете серве на отработку команды перед строкой 17?
ответ - ни сколько, вы тупо ей кидаете новую команду... это как слона превратить в волчок.
дайте серве время на отработку текущей команды, а потом требуйте от нее выполнение новой.
UPD . для начала проще использовать флаг и таймер на millis
при включении серва встает на 0 , потом на 180, после шаговик проходит 1500 шагов и делает паузу, серва уже не двигается, а шаговик с паузами делает 1500 шагов
zaratustra93
Залейте вот этот скетч, посмотрите как работает и попробуйте сам код осмыслить.
zaratustra93
Залейте вот этот скетч, посмотрите как работает и попробуйте сам код осмыслить.
тут получается проверяем положение сервы, если она не в 0, то двигаем в 0, потом моргаем светодиодом, снова проверяем положение сервы, так как оно 0 то двигаем в 90, снова моргаем и потом все повторяется