Здравствуйте! Проблема при запуске шагового двигателя с кнопки, если говорить точнее, нужно при нажатии кнопки провернуть шаговый двигатель на N-ое число оборотов. По аналогии с диодами, я написал скетч, только чтобы повернуть двигатель нужно держать зажатой кнопку, т.е. должен поступать непрерывно сигнал HIGH. У меня сложности именно в том, чтобы просто при одном клике кнопки, двигатель провернулся на указанные мною N-оборотов, потом при повторном нажатии двигатель опять провернулся на эти N- оборотов.. Подскажите, какую логическую функцию я должен создать, чтобы программа воспринимала один клик для старта двигателя. Спасибо.
Нету под рукой шаговика, но на вскидку как то так: Код (C++): #include <AccelStepper.h> AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988) int KNOPKA = A0; // пин кнопки int steeps = 1000; // количество шагов long KNO1 = 0; // Исходное значение для таймера. long KNO2 = 200; // 200 милисекунд предотвращения повторного нажатия int dir = 1; //используется для смены направления void setup() { Stepper1.setMaxSpeed(1000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду) Stepper1.setAcceleration(700); //устанавливаем ускорение (шагов/секунду^2) pinMode(KNOPKA, INPUT_PULLUP); // включаем внутренний подтягивающий резистор } void loop() { unsigned long r = millis(); if(digitalRead(KNOPKA) == 0){ if(r - KNO1 > KNO2){ dir = dir*(-1); Stepper1.move(steeps*dir); KNO1 = r;}} Stepper1.run(); } Если используете другой драйвер то измените во 2-ой строчке значения под свой драйвер и пины.
Ой. Выше код при котором при нажатии будет ездить туда сюда. Чтобы в одну сторону вот так можно попробовать и с другой библиотекой Код (C++): #include <Stepper.h> int KNOPKA = A0; // пин кнопки const int INX1 = A1; // пины двигателя Х const int INX2 = A2; const int INX3 = A3; const int INX4 = A5; long KNO1 = 0; // Исходное значение для таймера. long KNO2 = 200; // 200 миллисекунд предотвращения повторного нажатия const int steps = 500; // количество шагов Stepper myStepperX(steps, INX1, INX2, INX3, INX4); void setup() { myStepperX.setSpeed(1000); pinMode(KNOPKA, INPUT_PULLUP); } void loop() { unsigned long r = millis(); if(digitalRead(KNOPKA) == 0){ if(r - KNO1 > KNO2){ for (int i=0; i < steps; i++){ myStepperX.step(1); }; KNO1 = r;}} }
#include <AccelStepper.h> AccelStepper Stepper1(4, 8, 9, 10, 11); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988) int KNOPKA = 7; // пин кнопки int steeps = 5000; // количество шагов long KNO1 = 0; // Исходное значение для таймера. long KNO2 = 200; // 200 милисекунд предотвращения повторного нажатия int dir = 1; //используется для смены направления void setup() { Stepper1.setMaxSpeed(1000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду) Stepper1.setAcceleration(700); //устанавливаем ускорение (шагов/секунду^2) pinMode(KNOPKA, INPUT_PULLUP); // включаем внутренний подтягивающий резистор } void loop() { unsigned long r = millis(); if(digitalRead(KNOPKA) == 1) { if(r - KNO1 > KNO2) { // dir = dir*(-1); Stepper1.moveTo(steeps*dir); KNO1 = r; } } Stepper1.run(); } При клике запускается, но при повторном нажатии - тишина...
попробуйте так: if(digitalRead(KNOPKA)==0){ if(r - KNO1 > KNO2){ Stepper1.move(steeps); steeps = steeps + steeps; KNO1 = r;}}