нужна помощь в управлении шаговым двигателем
- Войдите на сайт для отправки комментариев
Чт, 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, но так и не получается остановить по нажатии кнопки
#include <Stepper.h> unsigned long timer; int ledState=LOW; int buttonState=LOW; int button = 14; int led = 13; const int stepsPerRevolution = 64; Stepper myStepper1(stepsPerRevolution, 8,9,10,11); Stepper myStepper2(stepsPerRevolution, 4,5,6,7); void setup() { myStepper1.setSpeed(20); myStepper2.setSpeed(20); pinMode(led, OUTPUT); pinMode(button,INPUT); } void loop() { timer=millis(); if(timer-millis()>=1000&&digitalRead(button)==HIGH&&buttonState==LOW) { buttonState=HIGH; digitalWrite(led,HIGH); myStepper1.step(100); myStepper2.step(100); myStepper2.step(-100); } if(timer-millis()>=1000&&digitalRead(button)==HIGH&&buttonState==HIGH) buttonState=LOW; }Это Вы что написали?.
Внимательно смотрим на строку №19. А потом на строку №20 (можно и на №29) и отвечаем сами себе. Возможно ли, чтобы хоть когда-нибудь, хоть при каких-то положениях звёзд, Луны и прочих светил, условие "timer-millis()>=1000" в строке №20 оказалось истинным?
Ответьте.
Похоже, Вы совсем не поняли как пользоваться millis. Попробуйте таки в этом разобраться по примеру.
шаговые моторы делают один цикл и останавливаются. кнопкой все также не выключается
#include <Stepper.h> long previousMillis = 0; int ledState=LOW; int buttonState=LOW; int button = 14; int led = 13; const int stepsPerRevolution = 64; Stepper myStepper1(stepsPerRevolution, 8,9,10,11); Stepper myStepper2(stepsPerRevolution, 4,5,6,7); void setup() { myStepper1.setSpeed(20); myStepper2.setSpeed(20); pinMode(led, OUTPUT); pinMode(button,INPUT); } void loop() { unsigned long currentMillis = millis(); if(currentMillis-previousMillis>1000){ previousMillis = currentMillis; if(buttonState==LOW&&digitalRead(button)==HIGH){ buttonState=HIGH; digitalWrite(led,buttonState); myStepper1.step(100); myStepper2.step(100); myStepper2.step(-100); } else { buttonState=LOW; } } else { digitalWrite(led,LOW); } }Ну, а с чего её останавливаться? Вы ведь состояние кнопки проверяете внутри условия
if(currentMillis-previousMillis>1000). Стало быть Вы плюёте на кнопку целую секунду и НЕ проверяете её. Потом один разок по быстрому проверили и снова плюёте секунду.Как подключена кнопка? "digitalRead(button)==HIGH" - это нажата или отпущена.
так тоже не изменилось
{ unsigned long currentMillis = millis(); if(buttonState==LOW&&digitalRead(button)==HIGH){ buttonState=!buttonState; if (buttonState==HIGH){ if(currentMillis-previousMillis>1000){ previousMillis = currentMillis; digitalWrite(led,buttonState); }HIGH - нажата
#include <Stepper.h> long previousMillis = 0; int ledState=LOW; int buttonState=LOW; int button = 14; int led = 13; const int stepsPerRevolution = 64; Stepper myStepper1(stepsPerRevolution, 8,9,10,11); Stepper myStepper2(stepsPerRevolution, 4,5,6,7); void setup() { myStepper1.setSpeed(20); myStepper2.setSpeed(20); pinMode(led, OUTPUT); pinMode(button,INPUT); } void loop() { unsigned long currentMillis = millis(); if(buttonState==LOW&&digitalRead(button)==HIGH){ buttonState=!buttonState; if (buttonState==HIGH){ if(currentMillis-previousMillis>1000){ previousMillis = currentMillis; digitalWrite(led,buttonState); } myStepper1.step(100); myStepper2.step(100); myStepper2.step(-100); } else { buttonState=LOW; } } else { digitalWrite(led,LOW); } }Тут надо отделить "мух от котлет", кнопки отдельно, управление шаговым двигателем отдельно.
и как это сделать?
ТС, у вас явные проблемы с логикой (в смысле - с логикой кода)
Вот кусок вашего кода из сообщения 11. Результативную часть операторов if я выкинул, оставил только логику
if(buttonState==LOW&&digitalRead(button)==HIGH){ buttonState=!buttonState; if (buttonState==HIGH){ } else { buttonState=LOW; } }Смотрите, если условие в первой строчке истинно, то 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
при первом нажатии кнопки включается светодиод и начинает вращаться двигатель, при повторном нажатии, мотор останавливается, но светодиод не гаснет. после третьего нажатия гаснет светодиод, мотор стоит. еще одно нажатие и повторяется все как после первого нажатия. как исправить чтобы останавливался мотор и гас светодиод одним нажатием?
#include <Stepper.h> #include <Servo.h> boolean ledOn = false; boolean lastButton = LOW; // Устанавливаем последнее значение кнопки - выключено boolean currentButton = LOW; // Устанавливаем текущее значение кнопки - включено const int stepsPerRevolution = 64; // количество шагов на один оборот const int button = 3; const int led = 13; int servoPin = 4; Servo Servo1; Stepper myStepper1(stepsPerRevolution, 8,10,9,11); //подключение к пинам 8…11 на Ардуино unsigned long loopTime; // Вспомогающая переменная для цикла unsigned long currentTime; // Переменная хранящая текущее значение времени void setup() { Servo1.attach(servoPin); myStepper1.setSpeed(20); //установка скорости вращения ротора pinMode(led, OUTPUT); pinMode (button, INPUT_PULLUP); currentTime = millis(); loopTime = currentTime; } boolean debounce(boolean last) { boolean current = digitalRead(button); if(last != current) { delay(5); current = digitalRead(button); } return current; } void loop() { currentButton = debounce(lastButton); Servo1.write(90); if(lastButton == LOW && currentButton == HIGH) // При нажатии на кнопку включаем\выключаем { ledOn = !ledOn; } lastButton = currentButton; currentTime = millis(); if(currentTime >= (loopTime + 500) && ledOn == false) { digitalWrite(led, LOW); loopTime = currentTime; } if(ledOn == true) { if(currentTime >= loopTime && currentTime < (loopTime + 1000)) { digitalWrite(led, HIGH); myStepper1.step(10); delay(50); Servo1.write(45); delay(500); Servo1.write(90); delay(1000); } } }при первом нажатии кнопки включается светодиод и начинает вращаться двигатель, при повторном нажатии, мотор останавливается, но светодиод не гаснет. после третьего нажатия гаснет светодиод, мотор стоит. еще одно нажатие и повторяется все как после первого нажатия. как исправить чтобы останавливался мотор и гас светодиод одним нажатием?
код не код, а бред какой-то.. Надергали по кускам из инета? Вы в нем хоть что-то понимаете?
Что у вас в строке 38? вы понимаете, что из-за этой строки все прочие перемещения серво не имеют смысла - при каждом входе в луп серва будет возвращаться в позицию 90, независимо от любых других условий.
Ср светодиодом полная свистопляска. Если светодиод выкючен - он зачем-то каждые полсекунды еще раз выключается... хотя он И ТАК ВЫКЛЮЧЕН. Если же он включен - он тоже включается снова и снова. но только с периодичностью в 1000 мс.
Да и со временем полный кавардак. Если пользуетесь миллис - забудьте о делаях. Последний цикл по миллис должен исполнятся раз 1000мс. но из-за делеев - реально будет выполнятся более 1.5 сек...
Короче - я бы этот код просто выкинул в мусор и написал новый. Исправлять ошибки тут бестолку, его надо переписывать полностью.
если у кнопки делать pullup то цикл шаговига и сервы делается один раз сразу после включения питания и после нажатия кнопки тоже только один раз, и после следующего нажатия тоже. а если без pullup, то при включении питания цикл шаговика и сервы сразу работает без остановки, на кнопку никак не реагирует
#include <Stepper_28BYJ.h> #include <Servo.h> const int stepsPerRevolution = 64; Stepper_28BYJ myStepper1(stepsPerRevolution, 8,9,10,11); int servoPin = 4; Servo Servo1; const int button = 3; const int led = 13; boolean lastButton = LOW; // Устанавливаем последнее значение кнопки - выключено boolean currentButton = LOW; // Устанавливаем текущее значение кнопки - включено boolean ledOn = false; boolean yellowOn = LOW; // Мигающий жёлтый. unsigned long loopTime; // Вспомогающая переменная для цикла unsigned long currentTime; // Переменная хранящая текущее значение времени void setup() { pinMode (button, INPUT); Servo1.attach(servoPin); myStepper1.setSpeed(900); pinMode(led, OUTPUT); currentTime = millis(); loopTime = currentTime; } boolean debounce(boolean last) { boolean current = digitalRead(button); if(last != current) { delay(5); current = digitalRead(button); } return current; } void loop() { currentButton = debounce(lastButton); if(lastButton == LOW && currentButton == HIGH) { ledOn = !ledOn; } lastButton = currentButton; currentTime = millis(); if(currentTime >= (loopTime + 500) && ledOn == false) { yellowOn = !yellowOn; digitalWrite(led, yellowOn); loopTime = currentTime; } if(ledOn == true) { if(currentTime >= loopTime && currentTime < (loopTime + 1000)) { myStepper1.step(-5000); delay(500); Servo1.write(45); delay(500); Servo1.write(90); delay(1000); } } }убрали строчку с включением серво из ЛУП, в остальном все осталось, как я писал в #25 - не код, а бредятина
Вы так и не ответили - вы хоть что-нибудь в этом коде понимаете или просто накопировали куски из примеров в ютубе? Вы с этим кодом. с минимальными исправлениями - сюда ходите уже скоро два месяца. За это время можно было 2-3 учебника по Си наизусть выучить
прочитайте самое первое сообщение
использовал вот этот код светофора, вместо смены цветов светофора вставил шаговик и серву
// Задаём номера портов для светодиодов int GPin = 13; // Зелёный int YPin = 12; // Жёлтый int RPin = 11; // Красный int switchPin = 7; // Порт кнопки boolean lastButton = LOW; // Устанавливаем последнее значение кнопки - выключено boolean currentButton = LOW; // Устанавливаем текущее значение кнопки - включено boolean ledOn = false; // Состояние светофора: false - выключен (мигает жёлтый), true - включен boolean yellowOn = LOW; // Мигающий жёлтый. unsigned long loopTime; // Вспомогающая переменная для цикла unsigned long currentTime; // Переменная хранящая текущее значение времени void setup() { // Устанавливаем 3 порта как выход для светодиодов и один как вход для отслеживания кнопки pinMode(GPin, OUTPUT); pinMode(YPin, OUTPUT); pinMode(RPin, OUTPUT); pinMode(switchPin, INPUT); currentTime = millis(); loopTime = currentTime; } // Функция для лучшего отрабатывания нажатия на кнопку - ждёт установившегося значения, а затем передаёт его в программу. boolean debounce(boolean last) { boolean current = digitalRead(switchPin); if(last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() { currentButton = debounce(lastButton); if(lastButton == LOW && currentButton == HIGH) // При нажатии на кнопку включаем\выключаем светофор { ledOn = !ledOn; } lastButton = currentButton; currentTime = millis(); // Цикл действий при выключенном светофоре if(currentTime >= (loopTime + 500) && ledOn == false) { yellowOn = !yellowOn; // Инвертируем значение переменной. digitalWrite(GPin, LOW); digitalWrite(YPin, yellowOn); digitalWrite(RPin, LOW); loopTime = currentTime; } // Цикл действий при включенном светофоре if(ledOn == true) { // Горит зелёный if(currentTime >= loopTime && currentTime < (loopTime + 10000)) { digitalWrite(GPin, HIGH); digitalWrite(YPin, LOW); digitalWrite(RPin, LOW); } // Зелёный начинает мигать if(currentTime >= (loopTime + 10000) && currentTime < (loopTime + 10500)) { digitalWrite(GPin, LOW); } if(currentTime >= (loopTime + 10500) && currentTime < (loopTime + 11000)) { digitalWrite(GPin, HIGH); } if(currentTime >= (loopTime + 11000) && currentTime < (loopTime + 11500)) { digitalWrite(GPin, LOW); } if(currentTime >= (loopTime + 11500) && currentTime < (loopTime + 12000)) { digitalWrite(GPin, HIGH); } if(currentTime >= (loopTime + 12000) && currentTime < (loopTime + 12500)) { digitalWrite(GPin, LOW); } if(currentTime >= (loopTime + 12500) && currentTime < (loopTime + 13000)) { digitalWrite(GPin, HIGH); } if(currentTime >= (loopTime + 13000) && currentTime < (loopTime + 13500)) { digitalWrite(GPin, LOW); } if(currentTime >= (loopTime + 13500) && currentTime < (loopTime + 1400)) { digitalWrite(GPin, HIGH); } if(currentTime >= (loopTime + 14000) && currentTime < (loopTime + 14300)) { digitalWrite(GPin, LOW); } // Загорается жёлтый if(currentTime >= (loopTime + 14300) && currentTime < (loopTime + 17500)) { digitalWrite(YPin, HIGH); } // Загорается красный if(currentTime >= (loopTime + 17500) && currentTime < (loopTime + 27500)) { digitalWrite(YPin, LOW); digitalWrite(RPin, HIGH); } // Загорается красный с жёлтым if(currentTime >= (loopTime + 27500) && currentTime < (loopTime + 30500)) { digitalWrite(YPin, HIGH); } // Загорается зелёный if(currentTime >= (loopTime + 30500)) { digitalWrite(GPin, HIGH); digitalWrite(YPin, LOW); digitalWrite(RPin, LOW); loopTime = currentTime; } } }прочитайте самое первое сообщение
что я должен там прочитать? Что вы начинающий? - так два месяца прошло уже, а вы с места вовсе не сдвинулись
в коде который я использовал все работает, меняются режимы с нажатия кнопки, хотя вы писали что в коде непонятно что со светодиодом. но у меня кнопка только запускает один цикл, а останавливать не выходит после повторного нажатия кнопки
у меня кнопка только запускает один цикл, а останавливать не выходит после повторного нажатия кнопки
и не выйдет.
вам несколько человек написали - у вас цикл работы на делееях, вы во время работы кнопку не читаете вовсе.
я пробовал убирать делеи, у меня тогда серва дергается как попало? и не останавливается цикл все равно
я пробовал убирать делеи, у меня тогда серва дергается как попало? и не останавливается цикл все равно
показывайте код.
тот же самый но без делеев
тот же самый но без делеев
тогда и ответ тот же самый
так тоже не работает серва, шаговик все время крутится, но на кнопку реагирует
#include <Stepper_28BYJ.h> #include <Servo.h> const int stepsPerRevolution = 64; Stepper_28BYJ myStepper1(stepsPerRevolution, 8,9,10,11); int servoPin = 4; Servo Servo1; const int button = 3; const int led = 13; boolean lastButton = LOW; // Устанавливаем последнее значение кнопки - выключено boolean currentButton = LOW; // Устанавливаем текущее значение кнопки - включено boolean ledOn = false; boolean yellowOn = LOW; // Мигающий жёлтый. unsigned long loopTime; // Вспомогающая переменная для цикла unsigned long currentTime; // Переменная хранящая текущее значение времени void setup() { pinMode (button, INPUT); Servo1.attach(servoPin); myStepper1.setSpeed(900); pinMode(led, OUTPUT); currentTime = millis(); loopTime = currentTime; } boolean debounce(boolean last) { boolean current = digitalRead(button); if(last != current) { delay(5); current = digitalRead(button); } return current; } void loop() { currentButton = debounce(lastButton); if(lastButton == LOW && currentButton == HIGH) { ledOn = !ledOn; } lastButton = currentButton; currentTime = millis(); if(currentTime >= (loopTime + 500) && ledOn == false) { yellowOn = !yellowOn; digitalWrite(led, yellowOn); loopTime = currentTime; } if(ledOn == true) { if(currentTime >= loopTime && currentTime < (loopTime + 50000)) { myStepper1.step(-200); if(currentTime >= loopTime && currentTime < (loopTime + 10000)) { Servo1.write(45); } if(currentTime >= loopTime && currentTime < (loopTime + 10000)) { Servo1.write(90); loopTime = currentTime; } } }}слушайте, вы чего пытаетесь добиться-то? Стуча по клавишам не глядя, как обьязьянка - надеетесь написать "Войну и Мир"? Мы чего ради вообще это все обсуждаем 2 месяца? вам уже говорили про то, что с кнопками надо использовать подтяжку? - и где она в коде?
Кроме того, весь код снова - какое-то нагромождение бессмысленных операторов. Вот это вот что. по вашему делает?
if(currentTime >= loopTime && currentTime < (loopTime + 10000)) { Servo1.write(45); } if(currentTime >= loopTime && currentTime < (loopTime + 10000)) { Servo1.write(90); loopTime = currentTime; }зачем два абсолютно одинаковых условия подряд? Что вы вообще хотели тут написать?
Мой вам совет - отложите этот код в сторону, возьмите любую книжку "Си для чайников" и прочитайте ее от корки до корки. Не поймете - читайте еще и еще, пока не начнете понимать. И пока не этого не сделаете - лучше больше на форум не пишите.
кнопка то сейчас работает, а серва стоит иногда жужит
зачем два абсолютно одинаковых условия подряд? Что вы вообще хотели тут написать?
у ТС явно наблюдается нарушение причинно-следственных связей... и в коде и в логике размышлений...
для ТС
пост 37 строки 51,54,58 - подпишите, что и зачем там написано. и вообще напишите отдельный код только для сервы с указанной логикой, шаговик выкиньте для теста.
кнопка то сейчас работает, а серва стоит иногда жужит
да она (серва) просто охреневает от поставленной задачи "стой там! иди сюда!"
убрал эти строки, также работает только шаговик, убрае еще шаговик, серва крутится. и останавливается после нажатия кнопки, после повторного нажатия снова крутится. почему и то и другое не работает вместе?
убрал эти строки, также работает только шаговик, убрае еще шаговик, серва крутится. и останавливается после нажатия кнопки, после повторного нажатия снова крутится. почему и то и другое не работает вместе?
напишите простой код, в котором будет крутиться шаговик и серва, первый просто крутиться, а вторая от нижнего предела до верхнего и выложите код с результатом. Если результата нет, тоже выложите - но код должен быть подписан, пусть только основные строки (не сетап, а логика подписана)
крутится только шаговик
#include <Stepper_28BYJ.h> #include <Servo.h> const int stepsPerRevolution = 64; Stepper_28BYJ myStepper1(stepsPerRevolution, 8,9,10,11); int servoPin = 4; Servo Servo1; void setup() { Servo1.attach(servoPin); myStepper1.setSpeed(900); } void loop() { myStepper1.step(-200); //делаем 200шагов в обратную сторону Servo1.write(0); //устанавливаем сервопривод в положение 0 градусов Servo1.write(180); //устанавливаем сервопривод в положение 180 градусов }пост 45 строка 16 сколько времени вы даете серве на отработку команды перед строкой 17?
ответ - ни сколько, вы тупо ей кидаете новую команду... это как слона превратить в волчок.
дайте серве время на отработку текущей команды, а потом требуйте от нее выполнение новой.
UPD . для начала проще использовать флаг и таймер на millis
добавил миллис, серва и шаговиг работают одновременно, шаговик крутится без остановок
#include <Stepper_28BYJ.h> #include <Servo.h> unsigned long currentTime; //переменная текущего времени const int stepsPerRevolution = 64; Stepper_28BYJ myStepper1(stepsPerRevolution, 8,9,10,11); int servoPin = 4; Servo Servo1; void setup() { Servo1.attach(servoPin); myStepper1.setSpeed(900); } void loop() { Servo1.write(0); //устанавливаем сервопривод в положение 0 градусов if (millis() - currentTime > 600) //если время контроллера millis, больше переменной на 0,6с, то запускается условие if { currentTime = millis(); // приравниваем переменную к времени контроллера Servo1.write(180); //устанавливаем сервопривод в положение 180 градусов } myStepper1.step(-200); //делаем 200шагов в обратную сторону }пост 45 строка 16 сколько времени вы даете серве на отработку команды перед строкой 17?
ответ - ни сколько, вы тупо ей кидаете новую команду... это как слона превратить в волчок.
дайте серве время на отработку текущей команды, а потом требуйте от нее выполнение новой.
UPD . для начала проще использовать флаг и таймер на millis
при включении серва встает на 0 , потом на 180, после шаговик проходит 1500 шагов и делает паузу, серва уже не двигается, а шаговик с паузами делает 1500 шагов
#include <Stepper_28BYJ.h> #include <Servo.h> unsigned long currentTime; unsigned long currentTime2; const int stepsPerRevolution = 64; Stepper_28BYJ myStepper1(stepsPerRevolution, 8,9,10,11); int servoPin = 4; Servo Servo1; void setup() { Servo1.attach(servoPin); Servo1.write(0); myStepper1.setSpeed(900); } void loop() { Servo1.write(180); //устанавливаем сервопривод в положение 180 градусов if (millis() - currentTime2 >=500) //если время контроллера millis, больше переменной на 0,5с, то запускается условие if { currentTime2 = millis(); // приравниваем переменную к времени контроллера Servo1.write(0); //устанавливаем сервопривод в положение 0 градусов } if (millis() - currentTime >= 2000) //если время контроллера millis, больше переменной на 2с, то запускается условие if { currentTime = millis(); // приравниваем переменную к времени контроллера myStepper1.step(-1500); //делаем 1500 шагов в обратную сторону } }zaratustra93
Залейте вот этот скетч, посмотрите как работает и попробуйте сам код осмыслить.
#include <Servo.h> unsigned long currentTime; unsigned long currentTime2; const int servoPin = 4; const int ledPin = 13; Servo Servo1; void setup() { Servo1.attach(servoPin); Servo1.write(0); } void loop() { unsigned long newTime = millis(); if (newTime - currentTime2 >= 2000ul) { currentTime2 = millis(); if (Servo1.read() > 0) Servo1.write(0); else Servo1.write(90); // Двигаем серву } if (newTime - currentTime >= 500ul) { currentTime = millis(); digitalWrite(ledPin, !digitalRead(ledPin)); // Моргаем штатным светодиодом } }zaratustra93
Залейте вот этот скетч, посмотрите как работает и попробуйте сам код осмыслить.
#include <Servo.h> unsigned long currentTime; unsigned long currentTime2; const int servoPin = 4; const int ledPin = 13; Servo Servo1; void setup() { Servo1.attach(servoPin); Servo1.write(0); } void loop() { unsigned long newTime = millis(); if (newTime - currentTime2 >= 2000ul) { currentTime2 = millis(); if (Servo1.read() > 0) Servo1.write(0); else Servo1.write(90); // Двигаем серву } if (newTime - currentTime >= 500ul) { currentTime = millis(); digitalWrite(ledPin, !digitalRead(ledPin)); // Моргаем штатным светодиодом } }тут получается проверяем положение сервы, если она не в 0, то двигаем в 0, потом моргаем светодиодом, снова проверяем положение сервы, так как оно 0 то двигаем в 90, снова моргаем и потом все повторяется