Использование кнопки для поворота шагового двигателя на 90 градусов.
Использование двигателя 28BYJ-48 с драйвером ULN2000. Двигатель работает нормально, так как я могу вращать его, используя последовательный вход. Кнопка подключена правильно. При подключении может загореться светодиод. Я хочу, чтобы двигатель вращался на 90 градусов каждый раз, когда я нажимаю кнопку. Когда я запускаю код ниже, светодиоды на драйвере просто быстро мигают, когда я нажимаю и удерживаю кнопку, они перестают мигать, сохраняя состояние, в котором они уже были включены. например, если светодиод A на плате горел в тот момент, когда я нажимаю кнопку, он остается включенным. Если он был выключен, он остается выключенным. вы поняли идею.
используемый код:
#include <Stepper.h>;
// контакт кнопки
const int buttonPin = 2;
int STEPS = 32;
Stepper stepper(STEPS,8,9,10,11);
//создаем переменную для хранения счетчика и устанавливаем ее в 0
int counter = 0;
void setup()
{
pinMode(buttonPin, INPUT);
}
void loop()
{
// локальная переменная для хранения состояний кнопок
int buttonState;
//читаем цифровое состояние buttonPin с помощью функции digitalRead() и сохраняем //значение в переменной buttonState
buttonState = digitalRead(buttonPin);
//если кнопка нажата, увеличиваем счетчик и немного ждем, чтобы дать нам //время отпустить кнопку
if (buttonState == LOW) // зажигаем светодиод
{
counter++;
delay(150);
}
if(counter == 1)
stepper.step(512); // ноль градусов
//иначе сбросим счетчик на 0, что приведет к сбросу сервопривода на 0 градусов
else
counter = 0;
}
РЕДАКТИРОВАТЬ 1: Изменив код, который дал мне @Matej, я смог отладить проблему, из-за которой шаговый двигатель не вращался. код:
#include <Stepper.h>
// контакт кнопки
const int buttonPin = 2;
const int STEPS = 32;
Stepper stepper(STEPS, 8, 9, 10, 11);
int val = 2048;
//создаем переменную для хранения счетчика и устанавливаем ее в 0
int counter = 0;
unsigned long last_button_time = 0; //за экономию последних миллисов
void setup(){
pinMode(buttonPin, INPUT);
Serial.begin(9600);
stepper.setSpeed(1000);
}
void loop(){
bool buttonState; // локальная переменная для хранения состояний кнопок
//читаем цифровое состояние buttonPin с помощью функции digitalRead() и сохраняем //значение в переменной buttonState
buttonState = digitalRead(buttonPin);
//если кнопка нажата, увеличиваем счетчик и ждем немного, чтобы дать нам //время отпустить кнопку
if(buttonState == HIGH && millis() - last_button_time > 200){ // зажигаем светодиод
last_button_time = millis();
counter = 1;
Serial.println(counter);
}
if (counter == 1) {
Serial.println("Please Write the desired angle");
val = Serial.parseInt();
delay(5000);
counter = 0;
if(Serial.available() > 0) {
Serial.println("Stepping: ");
Serial.print(val);
stepper.step(val);
counter = 0;
Serial.println(counter);
}
else {
Serial.println("ERROR LOOPING THROUGH IF STATEMENT");
}
}
}
Последовательный вывод выглядит следующим образом:
1
Please Write the desired angle
Stepping:
00
1
Please Write the desired angle
Stepping:
20480
1
Please Write the desired angle
Stepping:
20480
Обратите внимание, что при первой попытке я написал «2048» в последовательном вводе, чтобы определить значение целого числа (val), и ничего не произошло. во второй и третьей попытке я тоже написал 2048 (0 в конце - переменная счетчика) и мотор начал трястись, но не вращался.
@MTXShift Games, 👍-1
Обсуждение2 ответа
Лучший ответ:
Я кое-что отредактировал в вашем коде. Я не уверен, что значение LOW
правильное, поэтому заменил его на HIGH
. Во-вторых, это время. Я удалил все функции delay()
, вместо них вы можете увидеть использование millis()
. Это для обработки интервала между нажатием и отпусканием кнопки — вторая часть if
проверит, превышает ли время последнего нажатия кнопки 200 мс
, если да, переместите шаговый регулятор. Последние вещи - шаг. Вы можете увидеть здесь stepper.step(STEPS/4);
. STEPS
— это переменная, которую вы объявили в начале кода. Это называется числом шагов на оборот, один оборот равен 360°
, поэтому 90°
будет STEPS/4
.
Вот код, прочитайте его и протестируйте:
#include <Stepper.h>;
// контакт кнопки
const int buttonPin = 2;
const int STEPS = 32;
Stepper stepper(STEPS, 8, 10, 9, 11);
//создаем переменную для хранения счетчика и устанавливаем ее в 0
int counter = 0;
unsigned long last_button_time = 0; //за экономию последних миллисов
void setup(){
pinMode(buttonPin, INPUT);
stepper.setSpeed(1000)
}
void loop(){
bool buttonState; // локальная переменная для хранения состояний кнопок
//читаем цифровое состояние buttonPin с помощью функции digitalRead() и сохраняем //значение в переменной buttonState
buttonState = digitalRead(buttonPin);
//если кнопка нажата, увеличиваем счетчик и немного ждем, чтобы дать нам //время отпустить кнопку
if(buttonState == HIGH && millis() - last_button_time > 200){ // зажигаем светодиод
last_button_time = millis();
counter++;
stepper.step(STEPS/4); //90° градусов
}
}
Все еще не работает :( в моем старом коде светодиоды на драйвере мигали, когда вы не нажимали кнопку, в вашем коде они мигают, когда я нажимаю кнопку., @MTXShift Games
@MTXShiftGames И это правильно, когда светодиоды на плате драйвера мигают только во время нажатия кнопок, верно?, @Matej
Я и вы оба забыли выполнить stepper.setSpeed(1000);
, но это не помогло. Когда я нажимаю кнопку, светодиоды на драйвере мигают, но ничего не происходит. Я забыл упомянуть, что двигатель подключен к макетной плате и питается от блока питания макетной платы, на случай, если это имеет значение.
РЕДАКТИРОВАТЬ: Пожалуйста, проверьте РЕДАКТИРОВАНИЕ вопроса., @MTXShift Games
@MTXShiftGames А мотор работает на примере? Правильно ли указано количество шагов на оборот 32?, @Matej
да, это работает. У меня есть программа, которая вращает двигатель на основе последовательного ввода, а ШАГИ/Обороты определены как 32, и это работает., @MTXShift Games
@MTXShiftGames Можете ли вы разместить где-нибудь этот код? Например, на сайте Pastebin.com., @Matej
Вот это: [ссылка](https://pastebin.com/erfCNHri), @MTXShift Games
@MTXShiftGames Я вижу разницу только в этом stepper.setSpeed(1000);
. Если вы поместите это в setup(), это сработает?, @Matej
Я уже это сделал. Можете ли вы проверить обновленный код в моем вопросе? Пожалуйста, вы мне очень помогли, я никуда не двинулся, @MTXShift Games
@MTXShiftGames О, посмотрите на контакты на Pastebin и здесь. Они поменяны местами., @Matej
@MTXShiftGames Я отредактировал свой ответ. Попробуйте код сейчас., @Matej
Ты такая легенда, чувак. наконец-то работает! Огромное спасибо., @MTXShift Games
@MTXShiftGames Отлично! Пожалуйста. :), @Matej
Небольшая настройка:
Обратите внимание, что при использовании Adruino при использовании "INPUT" режиме без включения внутреннего подтягивающего резистора, вам необходимо убедиться, что переключатель подключен правильно и что в вашей цепи есть внешние подтягивающие или понижающие резисторы. В предоставленном вами коде вы не включили необходимый внешний подтягивающий резистор.
Чтобы настроить и исправить код, вот простой быстрый вариант:
Использование режима »INPUT_PULLUP» вместо режима »INPUT»:
Это более простой и рекомендуемый подход. Просто измените строку:
pinMode(buttonPin, INPUT); to pinMode(buttonPin, INPUT_PULLUP);
Это включит внутренний подтягивающий резистор Arduino, устраняя необходимость во внешних резисторах в вашей схеме.
Вот код быстрого исправления:
#include <Stepper.h>;
// Использование шагового двигателя для поворота на 90 градусов
// Ссылка: https://arduino.stackexchange.com/questions/61260/using-pushbutton-to-make-stepper-motor-rotate-90-grades
// контакт кнопки
const int buttonPin = 2;
const int STEPS = 32;
Stepper stepper(STEPS, 8, 10, 9, 11);
//создаем переменную для хранения счетчика и устанавливаем ее в 0
int counter = 0;
unsigned long last_button_time = 0; //за последние миллисы
void setup(){
pinMode(buttonPin, INPUT_PULLUP);
stepper.setSpeed(1000)
}
void loop(){
bool buttonState; // локальная переменная для хранения состояний кнопок
//читаем цифровое состояние buttonPin с помощью функции digitalRead() и сохраняем //значение в переменной buttonState
buttonState = digitalRead(buttonPin);
//если кнопка нажата, увеличиваем счетчик и немного ждем, чтобы дать нам //время отпустить кнопку
if(buttonState == HIGH && millis() - last_button_time > 200){ // зажигаем светодиод
last_button_time = millis();
counter++;
stepper.step(STEPS/4); //90° градусов
}
}
Настройка подключения:
Чтобы подключить внешний переключатель к Arduino, используя внутренний подтягивающий резистор, т.е. используя «INPUT_PULLUP»; вместо просто «ВВОД» в приведенном выше коде вам необходимо будет выполнить следующие соединения:
Подключите один терминал переключателя к цифровому входу на Arduino. Предположим, в этом примере вы используете контакт 2.
Подключите другой терминал переключателя к земле (GND) на Arduino.
При такой настройке соединения вы, по сути, создаете цепь, в которой переключатель подключается между контактом цифрового входа и землей. Когда переключатель не нажат, внутренний подтягивающий резистор поднимет напряжение на входном выводе до высокого уровня (высокий логический уровень). Когда переключатель нажат, входной контакт подключается к земле, что приводит к низкому уровню (НИЗКИЙ логический уровень).
В качестве альтернативы, если вы используете "INPUT" вместо этого "INPUT_PULLUP" что здесь было бы не лучшим подходом. Вы можете следовать приведенному ниже примеру:
Вот пример схемы и кода с использованием внешнего подтягивающего резистора:
Цепь:
- Подключите один разъем переключателя к цифровому входу на Arduino.
- Подключите другой терминал переключателя к точке соединения между подтягивающим резистором (например, 10 кОм) и Vcc (5 В).
Пример кода:
const int buttonPin = 2; // Вывод подключен к внешнему переключателю
void setup() {
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH); // Включаем внутренний подтягивающий резистор
}
void loop() {
// Читаем состояние кнопки
int buttonState = digitalRead(buttonPin);
// Выполняем желаемые действия в зависимости от состояния кнопки
if (buttonState == LOW) {
// Кнопка нажата
// Сделай что-нибудь...
} else {
// Кнопка не нажата
// Делаем что-нибудь еще...
}
}
Обратите внимание, что необходимо добавить строку кода ниже внутри void setup(), чтобы включить внутренний подтягивающий резистор, как показано в приведенном выше коде. ie digitalWrite(buttonPin, HIGH); // Включение внутреннего подтягивающего резистора
надеюсь, это поможет. Отличная работа, Гайз, удачного программирования.
- Какую скорость передачи данных com порта можно использовать без ошибок?
- Насколько холодным или горячим может быть Arduino Uno?
- Accelstepper запустить степпер назад
- Как почувствовать, когда кто-то спит с моим Arduino?
- Как заставить шаговый двигатель вращаться по часовой стрелке и против часовой стрелки
- Управление направлением шагового двигателя с помощью кнопок.
- Различия между Arduino Uno SMD и Uno DIP
- Разгон шагового двигателя
я не вижу кода, который перемещает сервопривод на 90 градусов, @jsotola
Я двигаю шаговый двигатель, а не сервопривод ^__^, @MTXShift Games