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

zaratustra93

✩✩✩✩✩✩✩
9 Мар 2021
6
0
C++:
#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);
    }

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

Старик Похабыч

★★★★★★★
14 Авг 2019
4,184
1,278
Москва
В таком варианте это работать почти не будет нормально. Т.е. то что сейчас работает это максимум. Объясню почему: кнопка требует проверки минимум 2-х состояний, было и стало. А это 2 цикла loop , при запуске моторов все происходит в одном цикле, а значит 2-ой цикл будет разнесен по времени с 1-ым и что бы прочитать 2-ое состояние надо еще ждать один цикл. В общем тормозная система получится. Если брать именно эту библиотеку (та. которая ждет когда мотор сделает свои шакги), то выход я вижу один - кнопку повесить на прерывание по изменению состояния. Тогда клик по кнопке должен будет изменять состояние процесса, запущен он или остановлен. В цикле же loop надо будет просто смотреть, если процесс запущен , то выполнить очередной цикл. если нет - ничего не делать.
Самое простое повесить кнопку на 2-ой или 3-ий пин, т.к. с ними легко потренироваться используя attachInterrupt, а так именно на изменение состояния можно повесить практически любой пин (не уверен на счет А6 А7).
И тут, с прерыванием, у Вас возникнет проблема с дребезгом контактов. Обязательное.
В целом все, так что 2 темы для изучения я подкинул, дерзайте и космос Вам покориться.
 

Spindle

✩✩✩✩✩✩✩
3 Фев 2021
39
0
Дополню предыдущего оратора.
Если кнопки вешать на прерывание, то там надо обрабатывать только флаг, а движение шаговиков уже в лупе. Ибо тот факт, что в прерывание не стоит вешать громоздкие задачи является христоматийным.
Я когда возился с шаговиками, тут я думаю используются те самые с али за 60 рублей, долго мучился какого фига они крутятся только в одну сторону, методом гугленья я выяснил что,
Stepper myStepper1(stepsPerRevolution, 8,9,10,11);
Вот так вот, оно не пашет как надо, у меня оно запахало вот как-то так:
Stepper myStepper1(stepsPerRevolution, 8,10,9,11);
Ну или подбирать правильную последовательность подключения до просветления.
 

Amadei

✩✩✩✩✩✩✩
4 Дек 2018
11
2
Здравствуйте уважаемые форумчане. Дабы не плодить тем в ветке по вопросам одной и той же библиотеке, с вашего позволения спрошу здесь.
Столкнулся с такой проблемой, метод stop(), в библиотеке GyverStepper, не сбрасывает tick(). Он продолжает показывать true, во что бы то и стало.
Как сбросить tick() на ноль?
 

zaratustra93

✩✩✩✩✩✩✩
9 Мар 2021
6
0
при первом нажатии кнопки включается светодиод и начинает вращаться двигатель, при повторном нажатии, мотор останавливается, но светодиод не гаснет. после третьего нажатия гаснет светодиод, мотор стоит. еще одно нажатие и повторяется все как после первого нажатия. как исправить чтобы останавливался мотор и гас светодиод одним нажатием?
C++:
#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);
    Servo1.write(90);
    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);
    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);
        }
    }
}
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
180
52
вы используете блокирующую библиотеку для шаговика и кучу делеев.
нормальную программу так не написать.
будете мачаться....
перейдите на адекватную библиотеку и почитайте про миллис.
 

zaratustra93

✩✩✩✩✩✩✩
9 Мар 2021
6
0
вы используете блокирующую библиотеку для шаговика и кучу делеев.
нормальную программу так не написать.
будете мачаться....
перейдите на адекватную библиотеку и почитайте про миллис.
на какую библиотеку? шаговик 28byj-48 с драйвером ULN2003
 

zaratustra93

✩✩✩✩✩✩✩
9 Мар 2021
6
0
шаговик начинает движение с нажатия кнопки, а серва не двигается иногда жужжит, кнопка работает
C++:
#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;
  }
  }
    }