Какой-нибудь совет, который вы можете дать мне по моему коду шагового двигателя?

Я новичок в Arduino, в настоящее время занимаюсь уни-проектом, в котором моя команда хочет создать своего рода устройство в стиле игровых автоматов, использующее шаговый двигатель для вращения барабана (например, одного из цилиндров в игровом автомате). ).

То, что я сейчас пытался сделать, это объединить некоторый код, который использует переменную-счетчик и кнопку, чтобы позволить сервоприводу вращаться несколько раз с помощью одной кнопки, с кодом, который, как я обнаружил, используется для тестирования шагового двигателя. ? На мой взгляд, код, который у меня есть, должен позволять мне поворачивать степпер на 45 градусов после каждого нажатия кнопки, но я понятия не имею, имеет ли мой код какой-либо смысл. Не могли бы вы, ребята, сказать мне, если я близко или это куча мусора. если он работает нормально, я бы установил более высокую скорость и заставил двигатель совершать несколько полных оборотов перед каждой остановкой, чтобы он работал больше как настоящий спиннер игрового автомата. любой совет, который вы могли бы дать, был бы замечательным, заранее извиняюсь, если я не совсем понимаю некоторые вещи, которые вы можете объяснить, поскольку я новичок в кодировании, как я уже упоминал.

Вот код:

#include <Stepper.h>

//переменные
int counter = 0;
const int buttonPin = 8;
const int stepsPerRevolution = 90;

Stepper myStepper(stepsPerRevolution,1,2,3,4);

void setup() {

 pinMode(buttonPin, INPUT);
 myStepper.setSpeed(60);

}

void loop() {

  int buttonState;  

  buttonState = digitalRead(buttonPin);

   if (buttonState == LOW) 
  {
    counter++;

 delay(150);
  }

if(counter == 0)
   myStepper.step(0);

 else if(counter == 1)
   myStepper.step(45);

 else if(counter == 2)
  myStepper.step(90);

 else if(counter == 3)  
    myStepper.step(135);

else if(counter == 4)
   myStepper.step(180);

 else if(counter == 5)
  myStepper.step(225);

else if(counter == 6)  
    myStepper.step(270);

else if(counter == 7)
  myStepper.step(315);

else if(counter == 8)  
    myStepper.step(360);

  else
   counter = 0;

}

, 👍-1


2 ответа


0

Событие нажатия кнопки в вашем случае не является детерминированным. Как правило, ваш подход delay() в сочетании с чтением текущего состояния кнопки не таков, как sth. как это работает. Вместо этого вы должны определить, когда кнопка нажата/отпущена. Один из способов сделать это:

#define buttonPin 8
bool last_state=false;

void loop(){
  if(!digitalRead(buttonPin)) {
    if(last_state) {
      //кнопка отпущена
      //увеличим ваш счетчик здесь
    }
    last_state=false;
  } else {
    last_state=true;
  }
}
,

0

Сначала поймите, что метод myStepper.step(x) является относительным шагом, а не абсолютным. Поэтому, если вы хотите, чтобы мотор делал два оборота по 45 шагов подряд, вы должны написать

myStepper.step(45);
myStepper.step(45);    /// НЕ myStepper.step(90) <-- это БОЛЬШЕ 90 шагов

Во-вторых, похоже, что ваш код увеличивает число шагов на 45, пока УДЕРЖИВАЕТ кнопку нажатой, но также должен вращать двигатель на 45 шагов для каждого нажатия кнопки, если последующие нажатия не происходят, когда двигатель находится в середине вращения.

Кроме того, вы можете удалить следующие дополнительные операторы else if, и он все равно будет работать.

else if(counter == 2)
  myStepper.step(90);

 else if(counter == 3)  
    myStepper.step(135);

else if(counter == 4)
   myStepper.step(180);

 else if(counter == 5)
  myStepper.step(225);

else if(counter == 6)  
    myStepper.step(270);

else if(counter == 7)
  myStepper.step(315);

else if(counter == 8)  
    myStepper.step(360);
,