Шаговый мотор и пару кнопок, не могу понять как это сделать ?
- Войдите на сайт для отправки комментариев
Пт, 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
А програмное подавление после обработки прерывания? Неа? Зачем плодить излишние сущности?
можно подробнее? ссылку на пример или сюда код реализации?
В прерывании подняли флаг нажатия кнопки. В основном цикле установили требуемую задержку на следующее срабатывание и обработали нажатие. По окончании задержки сбросили флаг.