Управление шаговым двигателем - запуск и остановка кнопкой.
- Войдите на сайт для отправки комментариев
Пнд, 28/09/2015 - 00:21
Здравствуйте! Пробую разобратся с ардуино. Опыта в програмировании 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;
}
}
а если заменить delay(500) на delay(10)?
тогда мотор крутится пока я держу кнопку! Но мне нужно чтобы он крутился пока горит светодиод.. я вообще не могу понять почему так происходит...
Мне кажется, что ты перепутал 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++; //добавляем количество шагов по одному т.к. процедура блокирует процесс } }Спасибо. Все работает. У меня кстати мотор был привяан не к кнопке, а к состоянию светодиода, потому что да - переменная val - отвечала за состояние кноки и сразу после нажатия сбрасывала - я просто тупо скопипастил код потомучто) Но все равно по логике должно было работать. Буду разбиратся. Главное есть правильный пример.