нужна помощь в управлении шаговым двигателем

zaratustra93
Offline
Зарегистрирован: 04.03.2021

Здравствуйте.

Я только начинаю изучать ардуино. Нужно чтобы после нажатия кнопки первый шаговик прошел некоторое количество шагов, после чего второй шаговик проходит тоже некоторое количество шагов, а потом столько же обратно, это работает. но нужно еще чтобы после очередного нажатия кнопки они остановились. вот в этом проблема они останавливаются если успеть нажать кнопку во время паузы после обратного хода второго шаговика. как то можно это сделать или только сбросом на самой ардуине?

#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);
	}

}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018
sadman41
Offline
Зарегистрирован: 19.10.2016

Можно. Применяя метод конечных автоматов, например.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строка №22, 28 и 33 Вы тупо стоите и ждёте. Вопрос: кто в это время следит за нажатием кнопки? Если ответ "никто" или "тень отца Гамлета", то следующий вопрос: ну, а если никто не следит нажата она или нет, то кто же тогда будет останавливать моторы?

zaratustra93
Offline
Зарегистрирован: 04.03.2021

попробовал с 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;
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это Вы что написали?.

Внимательно смотрим на строку №19. А потом на строку №20 (можно и на №29) и отвечаем сами себе. Возможно ли, чтобы хоть когда-нибудь, хоть при каких-то положениях звёзд, Луны и прочих светил, условие "timer-millis()>=1000" в строке №20 оказалось истинным?

Ответьте. 

Похоже, Вы совсем не поняли как пользоваться millis. Попробуйте таки в этом разобраться по примеру.

zaratustra93
Offline
Зарегистрирован: 04.03.2021

шаговые моторы делают один цикл и останавливаются. кнопкой все также не выключается

#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);
	}

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, а с чего её останавливаться? Вы ведь состояние кнопки проверяете внутри условия if(currentMillis-previousMillis>1000). Стало быть Вы плюёте на кнопку целую секунду и НЕ проверяете её. Потом один разок по быстрому проверили и снова плюёте секунду.

Как подключена кнопка? "digitalRead(button)==HIGH" - это нажата или отпущена.

zaratustra93
Offline
Зарегистрирован: 04.03.2021

так тоже не изменилось

{	
	unsigned long currentMillis = millis();
	if(buttonState==LOW&&digitalRead(button)==HIGH){
		buttonState=!buttonState;
		if (buttonState==HIGH){
			if(currentMillis-previousMillis>1000){
				previousMillis = currentMillis;
				digitalWrite(led,buttonState);
			}

 

zaratustra93
Offline
Зарегистрирован: 04.03.2021

HIGH -  нажата

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

zaratustra93 пишет:
так тоже не изменилось
А этого я не понял. Приводите код полностью.

zaratustra93
Offline
Зарегистрирован: 04.03.2021
#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);
	}

}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Тут надо отделить "мух от котлет", кнопки отдельно, управление шаговым двигателем отдельно.

zaratustra93
Offline
Зарегистрирован: 04.03.2021

и как это сделать? 

b707
Offline
Зарегистрирован: 26.05.2017

ТС, у вас явные проблемы с логикой (в смысле - с логикой кода)

Вот кусок вашего кода из сообщения 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

ИМХО, у вас огромные проблемы с проектированием алгоритма. Вам пока не код писать надо - начните с формулирования алгоритма на бумажке своими словами, на родном языке, а не на С++

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

.

jonhson
Offline
Зарегистрирован: 11.09.2019

zaratustra93 пишет:

и как это сделать? 

Правильно, как мне кажется, это отслеживать нажатие кнопки прерыванием... 

 

 

 

Morroc
Offline
Зарегистрирован: 24.10.2016

И так правильно и с millis правильно. Вообще если работает - значит правильно и наоборот )

Гриша
Offline
Зарегистрирован: 27.04.2014

zaratustra93 пишет:

и как это сделать? 

попробуйте собрать светофор, потом усложните его - добавьте кнопку. Это простая задача, поможет с логикой. потом заставьте ваш светофор мигать по нажатию кнопки. 

Morroc
Offline
Зарегистрирован: 24.10.2016

Гриша пишет:

потом заставьте ваш светофор мигать по нажатию кнопки. 

я бы добавил сразу по нажатию кнопки, в любой момент чтобы загорался желтый и мигал 10 сек, потом обычный режим к-ж-з ) после этого можно продолжать управлять ШД

zaratustra93
Offline
Зарегистрирован: 04.03.2021

в эмуляторе двигатель начинает вращаться после нажатия кнопки, а на реальной ардуине сразу после включения питания. Почему так может быть?

sadman41
Offline
Зарегистрирован: 19.10.2016

INPUT_PULLUP

zaratustra93
Offline
Зарегистрирован: 04.03.2021

sadman41 пишет:

INPUT_PULLUP


Что это значит?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

zaratustra93 пишет:
sadman41 пишет:

INPUT_PULLUP

Что это значит?

https://bit.ly/2OWhhOe

zaratustra93
Offline
Зарегистрирован: 04.03.2021

при первом нажатии кнопки включается светодиод и начинает вращаться двигатель, при повторном нажатии, мотор останавливается, но светодиод не гаснет. после третьего нажатия гаснет светодиод, мотор стоит. еще одно нажатие и повторяется все как после первого нажатия. как исправить чтобы останавливался мотор и гас светодиод одним нажатием?

#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);
		}
	}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

zaratustra93 пишет:

при первом нажатии кнопки включается светодиод и начинает вращаться двигатель, при повторном нажатии, мотор останавливается, но светодиод не гаснет. после третьего нажатия гаснет светодиод, мотор стоит. еще одно нажатие и повторяется все как после первого нажатия. как исправить чтобы останавливался мотор и гас светодиод одним нажатием?

код не код, а бред какой-то.. Надергали по кускам из инета? Вы в нем хоть что-то понимаете?

Что у вас в строке 38? вы понимаете, что из-за этой строки все прочие перемещения серво не имеют смысла - при каждом входе в луп серва будет возвращаться в позицию 90, независимо от любых других условий.

Ср светодиодом полная свистопляска. Если светодиод выкючен - он зачем-то каждые полсекунды еще раз выключается... хотя он И ТАК ВЫКЛЮЧЕН. Если же он включен - он тоже включается снова и снова. но только с периодичностью в 1000 мс.

Да и со временем полный кавардак. Если пользуетесь миллис - забудьте о делаях. Последний цикл по миллис должен исполнятся раз 1000мс. но из-за делеев - реально будет выполнятся более 1.5 сек...

 

Короче - я бы этот код просто выкинул в мусор и написал новый. Исправлять ошибки тут бестолку, его надо переписывать полностью.

zaratustra93
Offline
Зарегистрирован: 04.03.2021

если у кнопки делать 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);
  }
  }
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

убрали строчку с включением серво из ЛУП, в остальном все осталось, как я писал в #25 - не код, а бредятина

Вы так и не ответили - вы хоть что-нибудь в этом коде понимаете или просто накопировали куски из примеров в ютубе? Вы с этим кодом. с минимальными исправлениями - сюда ходите уже скоро два месяца. За это время можно было 2-3 учебника по Си наизусть выучить

zaratustra93
Offline
Зарегистрирован: 04.03.2021

прочитайте самое первое сообщение

zaratustra93
Offline
Зарегистрирован: 04.03.2021

использовал вот этот код светофора, вместо смены цветов светофора вставил шаговик и серву


// Задаём номера портов для светодиодов
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;
    }
  }

}
b707
Offline
Зарегистрирован: 26.05.2017

zaratustra93 пишет:

прочитайте самое первое сообщение

что я должен там прочитать? Что вы начинающий? - так два месяца прошло уже, а вы с места вовсе не сдвинулись

zaratustra93
Offline
Зарегистрирован: 04.03.2021

в коде который я использовал все работает, меняются режимы с нажатия кнопки, хотя вы писали что в коде непонятно что со светодиодом. но у меня кнопка только запускает один цикл, а останавливать не выходит после повторного нажатия кнопки

b707
Offline
Зарегистрирован: 26.05.2017

zaratustra93 пишет:

у меня кнопка только запускает один цикл, а останавливать не выходит после повторного нажатия кнопки

и не выйдет.

вам несколько человек написали - у вас цикл работы на делееях, вы во время работы кнопку не читаете вовсе.

zaratustra93
Offline
Зарегистрирован: 04.03.2021

я пробовал убирать делеи, у меня тогда серва дергается как попало? и не останавливается цикл все равно

b707
Offline
Зарегистрирован: 26.05.2017

zaratustra93 пишет:

я пробовал убирать делеи, у меня тогда серва дергается как попало? и не останавливается цикл все равно

показывайте код.

 

zaratustra93
Offline
Зарегистрирован: 04.03.2021

тот же самый но без делеев

b707
Offline
Зарегистрирован: 26.05.2017

zaratustra93 пишет:

тот же самый но без делеев

тогда и ответ тот же самый

zaratustra93
Offline
Зарегистрирован: 04.03.2021

так тоже не работает серва, шаговик все время крутится, но на кнопку реагирует


#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;
  }
  }
    }}
b707
Offline
Зарегистрирован: 26.05.2017

слушайте, вы чего пытаетесь добиться-то? Стуча по клавишам не глядя, как обьязьянка - надеетесь написать "Войну и Мир"? Мы чего ради вообще это все обсуждаем 2 месяца? вам уже говорили про то, что с кнопками надо использовать подтяжку? - и где она в коде?

Кроме того, весь код снова - какое-то нагромождение бессмысленных операторов. Вот это вот что. по вашему делает?

if(currentTime >= loopTime && currentTime < (loopTime + 10000))
  {
  Servo1.write(45);
  }
 if(currentTime >= loopTime && currentTime < (loopTime + 10000))
  {
  Servo1.write(90);
   loopTime = currentTime;
  }

зачем два абсолютно одинаковых условия подряд? Что вы вообще хотели тут написать?

 

Мой вам совет - отложите этот код в сторону, возьмите любую книжку "Си для чайников" и прочитайте ее от корки до корки. Не поймете - читайте еще и еще, пока не начнете понимать. И пока не этого не сделаете - лучше больше на форум не пишите.

zaratustra93
Offline
Зарегистрирован: 04.03.2021

кнопка то сейчас работает, а серва стоит иногда жужит

Гриша
Offline
Зарегистрирован: 27.04.2014

b707 пишет:

зачем два абсолютно одинаковых условия подряд? Что вы вообще хотели тут написать?

у ТС явно наблюдается нарушение причинно-следственных связей... и в коде и в логике размышлений...

для ТС

пост 37 строки 51,54,58 - подпишите, что и зачем там написано.  и вообще напишите отдельный код только для сервы с указанной логикой, шаговик выкиньте для теста. 

Гриша
Offline
Зарегистрирован: 27.04.2014

zaratustra93 пишет:

кнопка то сейчас работает, а серва стоит иногда жужит

да она (серва) просто охреневает от поставленной задачи "стой там! иди сюда!"

zaratustra93
Offline
Зарегистрирован: 04.03.2021

убрал эти строки, также работает только шаговик, убрае еще шаговик, серва крутится. и останавливается после нажатия кнопки, после повторного нажатия снова крутится. почему и то и другое не работает вместе?

Гриша
Offline
Зарегистрирован: 27.04.2014

zaratustra93 пишет:

убрал эти строки, также работает только шаговик, убрае еще шаговик, серва крутится. и останавливается после нажатия кнопки, после повторного нажатия снова крутится. почему и то и другое не работает вместе?

напишите простой код, в котором будет крутиться шаговик и серва, первый просто крутиться, а вторая от нижнего предела до верхнего и выложите код с результатом. Если результата нет, тоже выложите - но код должен быть подписан, пусть только основные строки (не сетап, а логика подписана)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

zaratustra93 пишет:
почему и то и другое не работает вместе?
Потому, что гладиолус :-(

zaratustra93
Offline
Зарегистрирован: 04.03.2021

крутится только шаговик

#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 градусов
}

 

Гриша
Offline
Зарегистрирован: 27.04.2014

пост 45 строка 16 сколько времени вы даете серве на отработку команды перед строкой 17?

ответ - ни сколько, вы тупо ей кидаете новую команду... это как слона превратить в волчок.

дайте серве время на отработку текущей команды, а потом требуйте от нее выполнение новой. 

UPD . для начала проще использовать флаг и таймер на millis

zaratustra93
Offline
Зарегистрирован: 04.03.2021

добавил миллис, серва и шаговиг работают одновременно, шаговик крутится без остановок

#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шагов в обратную сторону
  
}

 

zaratustra93
Offline
Зарегистрирован: 04.03.2021

Гриша пишет:

пост 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 шагов в обратную сторону
     }
}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

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
Offline
Зарегистрирован: 04.03.2021

AndreyD пишет:

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, снова моргаем и потом все повторяется