Шаговый мотор и пару кнопок, не могу понять как это сделать ?

SONIC300077
Offline
Зарегистрирован: 15.10.2013

Вот скетч он работает и почти меня устраивает !

за исключением того что пока выполняется какое то действие другие не работают !

тобиж мне нужно чтобы вовремя работы нажатия кнопки пуск мотор , срабатывала кнопка смена направления , вот

а сейчас пока мотор не отчитает заданное количество шагов, кнопка смены направления не работает!

возможно это както реализовать ?


#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 
     }
}

 

fagci
Offline
Зарегистрирован: 12.01.2015

millis() в помощь

и логику продумайте, перепишите заново код

vov4ik
Offline
Зарегистрирован: 10.09.2013
первое прописать в библиотеке смену направления от кнопки и переименовать библиотеку чтоб не было путаницы
второе отказаться от библиотеки и описать работу мотора в скече и установить смену направления где вам угодно
verhmax
Offline
Зарегистрирован: 21.12.2014

для решения подобной задачи я задействовал аппаратное прерываение http://arduino.ru/Reference/AttachInterrupt

но сразу возникла проблема с дребезгом контактов и простым delay ее решить не удалось, так как прерывание игнорирует эту функцию. для меня было важно одно нажатие кнопки, так как два-три (из-за дребезга) это уже было критично.

заюзал инвертирующий триггер шмитта (ссылку потерял с хорошего видеоурока)

и проблема решилась. по нажатию кнопки прерывает выполнение любой задачи, обрабатывает вызванную функцию, и делает дальше уже Ваш код

bwn
Offline
Зарегистрирован: 25.08.2014

verhmax пишет:

для решения подобной задачи я задействовал аппаратное прерываение http://arduino.ru/Reference/AttachInterrupt

но сразу возникла проблема с дребезгом контактов и простым delay ее решить не удалось, так как прерывание игнорирует эту функцию. для меня было важно одно нажатие кнопки, так как два-три (из-за дребезга) это уже было критично.

заюзал инвертирующий триггер шмитта (ссылку потерял с хорошего видеоурока)

и проблема решилась. по нажатию кнопки прерывает выполнение любой задачи, обрабатывает вызванную функцию, и делает дальше уже Ваш код

А програмное подавление после обработки прерывания? Неа? Зачем плодить излишние сущности?

verhmax
Offline
Зарегистрирован: 21.12.2014

bwn пишет:

А програмное подавление после обработки прерывания? Неа? Зачем плодить излишние сущности?

можно подробнее? ссылку на пример или сюда код реализации?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Естьтакие 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

bwn
Offline
Зарегистрирован: 25.08.2014

verhmax пишет:

bwn пишет:

А програмное подавление после обработки прерывания? Неа? Зачем плодить излишние сущности?

можно подробнее? ссылку на пример или сюда код реализации?

В прерывании подняли флаг нажатия кнопки. В основном цикле установили требуемую задержку на следующее срабатывание и обработали нажатие. По окончании задержки сбросили флаг.