Управление направлением шагового двигателя с помощью кнопок.

Я пытаюсь управлять направлением трех шаговых двигателей 28byj-48 с помощью драйверов ULN2003. Я использую 6 кнопок, по 2 на каждый двигатель. я хочу, чтобы каждый двигатель по умолчанию был неподвижным и вращался вперед, когда я нажимаю одну кнопку, и назад, когда я нажимаю другую.

Вы можете найти мой код ниже. Когда я использую тот же подход для кодирования одного двигателя, он работает нормально с подходящей скоростью. Но как только я добавляю все три двигателя, двигатели A и C работают нормально, но на низкой скорости, двигатель B продолжает вращаться вперед с самого начала, останавливается, пока я нажимаю кнопку вперед, и ничего не происходит, когда я нажимаю кнопку назад. Я проверил свою схему несколько раз, и в ней нет ничего плохого.

#include <Stepper.h> //включая библиотеку шаговых двигателей

//определяем раздел выводов

// контакты для двигателя A:
int stepAIN1Pin = 5;         
int stepAIN2Pin = 4;
int stepAIN3Pin = 3;
int stepAIN4Pin = 2;

// контакты для двигателя B:
int stepBIN1Pin = 9;         
int stepBIN2Pin = 8;
int stepBIN3Pin = 7;
int stepBIN4Pin = 6;

// контакты для двигателя C:
int stepCIN1Pin = 13;         
int stepCIN2Pin = 12;
int stepCIN3Pin = 11;
int stepCIN4Pin = 10;

int stepsPerRevolution = 2048; // количество шагов на оборот для двигателя 28BYJ48

int buttonA1Pin = A5;  // кнопка 1 контакт для вращения двигателя A по часовой стрелке
int buttonA2Pin = A4;  // кнопка 2-контактная для вращения двигателя A против часовой стрелки

int buttonB1Pin = A3;  // кнопка 1 контакт для вращения двигателя B по часовой стрелке
int buttonB2Pin = A2;  // кнопка 2-контактная для вращения двигателя B против часовой стрелки

int buttonC1Pin = A1;  // кнопка 1 контакт для вращения двигателя C по часовой стрелке
int buttonC2Pin = A0;  // 2-контактная кнопка для вращения двигателя C против часовой стрелки

Stepper myStepperA(stepsPerRevolution, stepAIN1Pin, stepAIN3Pin, stepAIN2Pin, stepAIN4Pin); // последовательность шагов для двигателя A

Stepper myStepperB(stepsPerRevolution, stepBIN1Pin, stepBIN3Pin, stepBIN2Pin, stepBIN4Pin); // последовательность шагов для двигателя B

Stepper myStepperC(stepsPerRevolution, stepCIN1Pin, stepCIN3Pin, stepCIN2Pin, stepCIN4Pin); // последовательность шагов для двигателя C




void setup() 
{
  // Настройка контактов кнопки как входных данных:
  pinMode(buttonA1Pin, INPUT);
  pinMode(buttonA2Pin, INPUT);

  pinMode(buttonB1Pin, INPUT);
  pinMode(buttonB2Pin, INPUT);

  pinMode(buttonC1Pin, INPUT);
  pinMode(buttonC2Pin, INPUT);

myStepperA.setSpeed(15); // Установка скорости двигателя A

myStepperB.setSpeed(15); // Установка скорости для двигателя B

myStepperC.setSpeed(15); // Установка скорости двигателя C
}





void loop()
{

int buttonA1State, buttonA2State, buttonB1State, buttonB2State, buttonC1State, buttonC2State;

  buttonA1State = analogRead(buttonA1Pin);
  buttonA2State = analogRead(buttonA2Pin);

 if ((buttonA1State != 0) && !(buttonA2State != 0))  // если мы нажимаем кнопку 1, а НЕ кнопку 2
  myStepperA.step(stepsPerRevolution/8);

 if (((buttonA2State != 0) && !(buttonA1State != 0)))  // если мы нажимаем кнопку 1, а НЕ кнопку 2
  myStepperA.step(-stepsPerRevolution/8);


  buttonB1State = analogRead(buttonB1Pin);
  buttonB2State = analogRead(buttonB2Pin);

 if (((buttonB1State != 0) && !(buttonB2State != 0)))  // если мы нажимаем кнопку 1, а НЕ кнопку 2
  myStepperB.step(stepsPerRevolution/8);

 if (((buttonB2State != 0) && !(buttonB1State != 0)))  // если мы нажимаем кнопку 1, а НЕ кнопку 2
  myStepperB.step(-stepsPerRevolution/8);


  buttonC1State = analogRead(buttonC1Pin);
  buttonC2State = analogRead(buttonC2Pin);

 if (((buttonC1State != 0) && !(buttonC2State != 0)))  // если мы нажимаем кнопку 1, а НЕ кнопку 2
  myStepperC.step(stepsPerRevolution/8);

 if (((buttonC2State != 0) && !(buttonC1State != 0)))  // если мы нажимаем кнопку 1, а НЕ кнопку 2
  myStepperC.step(-stepsPerRevolution/8);


  }

, 👍1

Обсуждение

Пожалуйста, не используйте в заголовке фразы типа «Срочно». С этим вы не добьетесь более быстрых результатов., @chrisl

@chrisl извини, я здесь новенький! зафиксированный, @Saba Hilali

Как я вижу в исходном коде библиотеки степперов, метод Step() блокируется до тех пор, пока заданные шаги не будут выполнены. При этом было бы сложно управлять более чем одним шаговым двигателем одновременно. Я думаю, что библиотека AccelStepper использует неблокирующую пошаговую функцию., @chrisl

Также: почему вы выполняете analogRead(), но не используете его как аналоговое значение. В зависимости от того, как вы подключили контакты, возвращаемые значения могут быть нулевыми только несколько раз, когда они должны быть равны нулю, из-за электрических помех. Почему бы вам не использовать digitalRead()?, @chrisl

@chrisl большое спасибо! это сработало правильно, перейдя на digitalRead(), @Saba Hilali

ваш выбор имен переменных сбивает с толку.... трудно с первого взгляда понять, что делает каждая переменная..... попробуйте использовать что-то вроде button_A_FWD_pin вместо buttonA1Pin и button_A_FWD_state вместо buttonA1State, @jsotola


1 ответ


Лучший ответ:

3

Попробуйте использовать digitalRead() для нажатия кнопок. Скорее всего, ваши кнопки, особенно на макетной плате, не возвращают ровно 0 для analogRead().

ИМХО, простые двухпозиционные переключатели всегда должны подключать ваш контакт либо к Vcc, либо к GND, либо с включенным внутренним подтягивающим резистором (если он подключен к GND), либо с установленным внешним понижающим резистором.

Чтобы отладить это, вы можете захотеть Serial.println() значения состояний ваших кнопок в вашей среде разработки Arduino и посмотреть, соответствуют ли их значения вашим ожиданиям.

,