Шаговый мотор и пару кнопок, не могу понять как это сделать ?
- Войдите на сайт для отправки комментариев
Пт, 16/01/2015 - 09:49
Вот скетч он работает и почти меня устраивает !
за исключением того что пока выполняется какое то действие другие не работают !
тобиж мне нужно чтобы вовремя работы нажатия кнопки пуск мотор , срабатывала кнопка смена направления , вот
а сейчас пока мотор не отчитает заданное количество шагов, кнопка смены направления не работает!
возможно это както реализовать ?
#include <Stepper.h>
Stepper stepper(200,8,9);
int flag0=0;
int flag1=0;
int flag2=0;
int regim=1;
int direct = 1;
int Step_rev = 0;
#define ButtonDirect A3 // вращение
#define ButtonRegim A1 //два режима работы мотора
#define StartMotor A2
#define Start A0
void setup()
{
Step_rev = 6400;
digitalWrite(13,HIGH);
stepper.setSpeed(300);
pinMode(13, OUTPUT);
}
void loop() {
//Обработка нажатия кнопки пуск мотор
if (digitalRead(Start) == HIGH)
{
stepper.step(direct-1*Step_rev);
}
//Обработка нажатия кнопки пуск мотор
if (digitalRead(StartMotor) == HIGH&&flag0==0)
{
stepper.step(direct*Step_rev);
flag0=1;
}
if(digitalRead(StartMotor)==LOW&&flag0==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag0=0;//обнуляем переменную flag
}
//Обработка нажатия кнопки смена направления
if (digitalRead(ButtonDirect) == HIGH&&flag1==0)//если кнопка нажата ...
{
direct=-1*direct;
flag1=1;
}
if(digitalRead(ButtonDirect)==LOW&&flag1==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag1=0;//обнуляем переменную flag
}
// Режимы
if (digitalRead(ButtonRegim) == HIGH&&flag2==0 ){//если кнопка нажата ...
{
regim++;
if(regim>2)//ограничим количество режимов
{
regim=1;//так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
if(regim==1)//первый режим
{
digitalWrite(13,HIGH);
Step_rev=6400;
}
if(regim==2)//второй режим
{
digitalWrite(13,LOW);
Step_rev=3555;
}
delay (500);
flag2=1;
}
if(digitalRead(ButtonRegim)==LOW&&flag2==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag2=0;//обнуляем переменную flag
}
}
millis() в помощь
и логику продумайте, перепишите заново код
для решения подобной задачи я задействовал аппаратное прерываение http://arduino.ru/Reference/AttachInterrupt
но сразу возникла проблема с дребезгом контактов и простым delay ее решить не удалось, так как прерывание игнорирует эту функцию. для меня было важно одно нажатие кнопки, так как два-три (из-за дребезга) это уже было критично.
заюзал инвертирующий триггер шмитта (ссылку потерял с хорошего видеоурока)
и проблема решилась. по нажатию кнопки прерывает выполнение любой задачи, обрабатывает вызванную функцию, и делает дальше уже Ваш код
для решения подобной задачи я задействовал аппаратное прерываение http://arduino.ru/Reference/AttachInterrupt
но сразу возникла проблема с дребезгом контактов и простым delay ее решить не удалось, так как прерывание игнорирует эту функцию. для меня было важно одно нажатие кнопки, так как два-три (из-за дребезга) это уже было критично.
заюзал инвертирующий триггер шмитта (ссылку потерял с хорошего видеоурока)
и проблема решилась. по нажатию кнопки прерывает выполнение любой задачи, обрабатывает вызванную функцию, и делает дальше уже Ваш код
А програмное подавление после обработки прерывания? Неа? Зачем плодить излишние сущности?
А програмное подавление после обработки прерывания? Неа? Зачем плодить излишние сущности?
можно подробнее? ссылку на пример или сюда код реализации?
Естьтакие step-dir контроллеры от CNC, стоят копейки, легко управляются и не занимают место в программе.
http://www.ebay.com/itm/Geeetech-A4988-Stepper-Motor-Driver-Module-Reprap-Stepper-Driver-Board-Heat-Sink-/351205737354?pt=Motoren_Getriebe&hash=item51c57e438a
http://www.ebay.com/itm/3D-Printer-StepStick-A4988-Stepper-Driver-Module-Reprap-Prusa-RAMPS-F5-/291354079277?pt=LH_DefaultDomain_2&hash=item43d60e702d
Если надо несколько каналов- берите готовый набор вместе с Мега2560 - подали питание и пишите код (или ищите готовый) http://www.banggood.com/RAMPS-1_4-Controller-2560-R3-Control-Board-A4988-Driver-Kit-p-938555.html
А програмное подавление после обработки прерывания? Неа? Зачем плодить излишние сущности?
можно подробнее? ссылку на пример или сюда код реализации?
В прерывании подняли флаг нажатия кнопки. В основном цикле установили требуемую задержку на следующее срабатывание и обработали нажатие. По окончании задержки сбросили флаг.