Управление направлением шагового двигателя с помощью кнопок.
Я пытаюсь управлять направлением трех шаговых двигателей 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);
}
@Saba Hilali, 👍1
Обсуждение1 ответ
Лучший ответ:
Попробуйте использовать digitalRead()
для нажатия кнопок. Скорее всего, ваши кнопки, особенно на макетной плате, не возвращают ровно 0 для analogRead()
.
ИМХО, простые двухпозиционные переключатели всегда должны подключать ваш контакт либо к Vcc, либо к GND, либо с включенным внутренним подтягивающим резистором (если он подключен к GND), либо с установленным внешним понижающим резистором.
Чтобы отладить это, вы можете захотеть Serial.println()
значения состояний ваших кнопок в вашей среде разработки Arduino и посмотреть, соответствуют ли их значения вашим ожиданиям.
- Шаговый двигатель не работает с платой A4988
- Grbl на Arduino Uno (Elegoo) с неработающим шаговым двигателем DM542 + nema24
- Кнопка сброса не работает + не могу загрузить код, что не так?
- Принципиальная схема для работы биполярного шагового двигателя с использованием LDR
- Непрерывное обнаружение кнопок для шагового управления
- Справка по библиотеке AccelStepper - Одновременное управление двигателем
- Как позволить шаговому двигателю вращаться постоянно?
- Почему при задержке шаговый двигатель останавливается? И почему команда break вызывает ошибку?
Пожалуйста, не используйте в заголовке фразы типа «Срочно». С этим вы не добьетесь более быстрых результатов., @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