Управление шаговым двигателем - запуск и остановка кнопкой.

Shinigammi
Offline
Зарегистрирован: 28.09.2015

 Здравствуйте! Пробую разобратся с ардуино. Опыта в програмировании 0. Для начала хотел-бы научится управлять шаговым двигателем - 28BYJ-48. Мне необходимо управлять им кнопкой - т.е. нажал - он поехал, нажал еще раз - остановился. Я пытаюсь использовать пример работы с кнопкой и что-то не получается - мотор делает один шаг, хотя в родном примере, те-же функциии заставляют его непрерывно вращатся шаг за шагом...

#include <Stepper_28BYJ.h> //Библиотека для управления мотором
int val=0; 
const int stepsPerRevolution = 4078; // количество шагов на один оборот
const int button = 14;
const int led = 13;
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 8,9,10,11); // инициализируем библиотеку Stepper_28BYJ на выходы 8-11 
int stepCount = 0; // количество шагов, которые мотор уже сделал    
 void setup()     
 {   
      pinMode(led, OUTPUT);          
      pinMode (button, INPUT);
 } 

 void loop() 
 { 
      if(digitalRead(button)==HIGH)//если кнопка нажата ... 
      { 
        val++;// прибавляем к переменной 1 при каждой смене цикла.     
      delay(500);//небольшая защита от "дребезга" контактов кнопки
      } 
      if(val>=1) 
      { 
        digitalWrite(led,!digitalRead(led));//инвертируем состояние пина 
      if(digitalRead(led)==HIGH) //если светодиод работает ...
      {
        myStepper_28BYJ.step(1);  // делаем 1 шаг
        delay(5);
        stepCount++; //добавляем количество шагов по одному т.к. процедура блокирует процесс
        }  
        val=0;
      } 
          
          
 } 
 

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а если заменить delay(500) на delay(10)?

Shinigammi
Offline
Зарегистрирован: 28.09.2015

тогда мотор крутится пока я держу кнопку! Но мне нужно чтобы он крутился пока горит светодиод.. я вообще не могу понять почему так происходит...

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

Мне кажется, что ты перепутал 2 части кода.  место с val=0; не правильное. зачем ты его сбрасываешь? И шаг надо вынест за пределы места, где происходит переключение светодиода. У меня так получилось...

boolean val = false

 void loop()
 {
      if(digitalRead(button)==HIGH)//если кнопка нажата ...
      {
        val =  !val; // 
      delay(500);//небольшая защита от "дребезга" контактов кнопки
      digitalWrite(led,val);
      }
      if(val)
      {
        myStepper_28BYJ.step(1);  // делаем 1 шаг
        delay(5);
        stepCount++; //добавляем количество шагов по одному т.к. процедура блокирует процесс
        } 
        
      }
           
           

 

Shinigammi
Offline
Зарегистрирован: 28.09.2015

Спасибо. Все работает. У меня кстати мотор был привяан не к кнопке, а к состоянию светодиода, потому что да - переменная val - отвечала за состояние кноки и сразу после нажатия сбрасывала - я просто тупо скопипастил код потомучто) Но все равно по логике должно было работать. Буду разбиратся. Главное есть правильный пример.