Использование кнопки для поворота шагового двигателя на 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 в конце - переменная счетчика) и мотор начал трястись, но не вращался.

, 👍-1

Обсуждение

я не вижу кода, который перемещает сервопривод на 90 градусов, @jsotola

Я двигаю шаговый двигатель, а не сервопривод ^__^, @MTXShift Games


2 ответа


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

0

Я кое-что отредактировал в вашем коде. Я не уверен, что значение 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


-1

Небольшая настройка:

Обратите внимание, что при использовании 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»; вместо просто «ВВОД» в приведенном выше коде вам необходимо будет выполнить следующие соединения:

  1. Подключите один терминал переключателя к цифровому входу на Arduino. Предположим, в этом примере вы используете контакт 2.

  2. Подключите другой терминал переключателя к земле (GND) на Arduino.

При такой настройке соединения вы, по сути, создаете цепь, в которой переключатель подключается между контактом цифрового входа и землей. Когда переключатель не нажат, внутренний подтягивающий резистор поднимет напряжение на входном выводе до высокого уровня (высокий логический уровень). Когда переключатель нажат, входной контакт подключается к земле, что приводит к низкому уровню (НИЗКИЙ логический уровень).

В качестве альтернативы, если вы используете "INPUT" вместо этого "INPUT_PULLUP" что здесь было бы не лучшим подходом. Вы можете следовать приведенному ниже примеру:

Вот пример схемы и кода с использованием внешнего подтягивающего резистора:

Цепь:

  1. Подключите один разъем переключателя к цифровому входу на Arduino.
  2. Подключите другой терминал переключателя к точке соединения между подтягивающим резистором (например, 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); // Включение внутреннего подтягивающего резистора

надеюсь, это поможет. Отличная работа, Гайз, удачного программирования.

,