» »

Стъпков двигател Nema 17 Каква е разликата между видовете стъпкови двигатели Nema

26.10.2019

Стъпковите двигатели се използват в производството на оборудване и CNC машини. Те не са скъпи и много надеждни, поради което са спечелили такава популярност.

Разлики между двигателните типове Nema

В зависимост от размера на напречното сечение, стъпковите двигатели се класифицират в Nema 17, Nema 23, Nema 34 и т.н. Размерът на напречното сечение се определя чрез умножаване на числото (17, 23, 34 и т.н.) по 0,1 инча. Сечението се посочва в mm (за Nema 17 - 42 mm, за Nema 23 - 57 mm, за Nema 34 - 86 mm и др.).

Друга разлика е дължината на двигателя. Според този параметър той е най-приложим в машинните инструменти, той е най-много най-добър вариантпо отношение на мощност и цена.

Стъпковите двигатели също се различават по мощност, като основният показател е въртящият момент. От това в машините зависи с какви размери ще се използва двигателят. Стъпковите двигатели Nema 23 са в състояние да създадат въртящ момент до 30 kg*cm, Nema 34 - до 120 kg*cm и до 210kgf*cm за стъпкови двигатели с напречно сечение 110 mm.

Взаимодействие между стъпков двигател и шпиндел

Механизмите за радиално подаване и въртене на инструмента, които има, съдържат стъпкови двигатели. Механизмът за аксиално движение съдържа друг двигател. Те трябва да взаимодействат стриктно помежду си и да осигуряват равномерно въртене на шпиндела.

Преди да започне следващия проект на Arduino, беше решено да се използва стъпков двигател Nema 17.

Защо Nema 17? На първо място, заради отличното съотношение цена/качество.

Преди да свържа Nema 17, имах известен опит в работата със степер 24byj48 (лист с данни). Той също успя с помощта на Arduino, и използвайки Raspberry pi, нямаше проблеми. Основната привлекателност на този двигател е цената (около $3 в Китай). Освен това за тази сума купувате двигател с включен драйвер. Съгласете се, можете дори да изгорите нещо подобно, без наистина да съжалявате за това, което сте направили.

Сега се появи по-интересна задача. Управлявайте стъпков мотор Nema 17 (лист с данни). Този моделот оригиналния производител се продава за около $40. китайски копияТе струват един и половина до два пъти по-евтино - около 20-30 долара. Много успешен модел, който често се използва в 3D принтери и CNC проекти. Първият проблем, който възникна, беше как да избера драйвер за този двигател. Токът на щифтовете на Arduino не е достатъчен, за да го захранва.

Избор на драйвер за управление на Nema 17

Google предложи, за да съживите Nema 17, можете да използвате драйвера A4988 от Poulou (лист с данни).

Освен това има възможност за използване на чипове L293D. Но A4988 се счита за повече подходящ вариант, така че спряхме дотук, за да избегнем потенциални проблеми.

Както бе споменато по-горе, използвани са двигател и драйвер, поръчани от Китай. Връзки по-долу.

  • КУПЕТЕ драйвер за стъпков двигател A4988 с доставка от Китай;

Няма 17 връзка чрез A4988

Връзката е реализирана въз основа на тази тема във форума на Arduino. Картината е показана по-долу.


Всъщност тази схема присъства в почти всеки блог сайт, посветен на Arduino. Платката се захранва от 12 волтов източник. Но двигателят не се завъртя. Проверихме всички връзки, проверихме отново и отново...

Първи проблем

Нашият 12-волтов адаптер не произвежда достатъчно ток. В резултат на това адаптерът беше заменен с 8 батерии тип АА. И двигателят започна да се върти! Е, тогава исках да скоча от breadboard към директна връзка. И тогава възникна

Втори проблем

Когато всичко беше разпоено, двигателят пак спря. Защо? Все още не е ясно. Трябваше да се върна към макета. И тук се появи вторият проблем. Заслужаваше си първо да седнете на форумите или внимателно да прочетете листа с данни. Не можете да свързвате или изключвате двигателя, когато към контролера е подадено захранване!В резултат на това контролерът A4988 изгоря безопасно.

Този проблем беше решен чрез закупуване на нов драйвер от eBay. Сега, като се вземе предвид натрупаният тъжен опит, Nema 17 беше свързан с A4988 и изстрелян, но...

Стъпковият двигател вибрира много

Докато роторът се въртеше, двигателят вибрираше силно. За плавно движение не можеше да се говори. Google отново идва на помощ. Първата мисъл е, че намотките са свързани неправилно. Запознаването с листа с данни на стъпковия двигател и няколко форума ме убедиха, че не това е проблемът. Ако намотките са свързани неправилно, двигателят просто няма да работи.Решението на проблема беше в скицата.

Програма за Arduino

Оказа се, че има чудесна библиотека за стъпкови двигатели, написана от момчетата от Adafruit. Използваме библиотеката AcclStepper и стъпковият двигател започва да работи гладко, без излишни вибрации.

Основни изводи

  1. Никога не свързвайте/разединявайте двигателя, докато контролерът е захранен.
  2. Когато избирате източник на захранване, обърнете внимание не само на напрежението, но и на мощността на адаптера.
  3. Не се разстройвайте, ако контролерът A4988 се повреди. Просто поръчайте нов ;)
  4. Използвайте библиотеката AcclStepper вместо чист код на Arduino. Стъпков двигател, използващ тази библиотека, ще работи без ненужни вибрации.

Скици за управление на стъпков двигател

Прост код на Arduino за тестване на стъпков двигател

//лесна връзка A4988

// изводите за нулиране и заспиване са свързани заедно

//свържете VDD към 3.3V или 5V щифт на Arduino

//свържете GND към Arduino GND (GND до VDD)

//свържете 1A и 1B към 1 намотка на стъпков двигател

//свържете 2A и 2B към бобина 2 на стъпков двигател

//свържете VMOT към захранване (9V захранване + термин)

//свържете GRD към източник на захранване (9V захранване - срок)

int stp = 13; //свържете пин 13 към стъпка

int dir = 12; //свържете 12 пина към dir

pinMode(stp, ИЗХОД);

pinMode(dir, OUTPUT);

ако< 200) // вращение на 200 шагов в направлении 1

digitalWrite(stp, HIGH);

digitalWrite(stp, LOW);

else ( digitalWrite(dir, HIGH);

digitalWrite(stp, HIGH);

digitalWrite(stp, LOW);

if (a>400) // завъртете 200 стъпки в посока 2

digitalWrite(dir, LOW);

Вторият код е за Arduino, за да накара двигателя да се върти гладко. Използва се библиотеката AccelStepper.

#включи

AccelStepper Stepper1(1,13,12); //използва пинове 12 и 13 за dir и стъпка, 1 - режим "външен драйвер" (A4988)

int dir = 1; // използва се за промяна на посоката

Stepper1.setMaxSpeed(3000); //задайте максималната скорост на въртене на ротора на двигателя (стъпки/секунда)

Stepper1.setAcceleration(13000); //задайте ускорение (стъпки/секунда^2)

if(Stepper1.distanceToGo()==0)( //проверка дали двигателят е завършил предишното движение

Stepper1.move(1600*dir); //задава следващия ход на 1600 стъпки (ако dir е -1 ще се движи -1600 -> обратна посока)

dir = dir*(-1); //отрицателна стойност на dir, поради което се осъществява въртене в обратна посока

забавяне (1000); // забавяне за 1 секунда

Stepper1.run(); //стартираме стъпковия двигател. Тази линия се повтаря отново и отново, за да поддържа двигателя да се върти непрекъснато.

Оставете вашите коментари, въпроси и споделете личния си опит по-долу. Новите идеи и проекти често се раждат в дискусии!

Стъпковите двигатели NEMA 17 са едни от най-популярните и широко разпространени, поради своя диапазон на въртящ момент, компактен размер и ниска цена, те са отлични за по-голямата част от дизайните, където се изисква прецизна система за движение.

Този размер е отличен избор при изграждане на 3D принтери. В популярните модели се използват от три до четири части за организиране на движение по три оси (4 части за онези модели, които използват два двигателя за движение по оста Y - например RepRap Prusa i3 или RepRap Prusa Mendel и други подобни). Ще ви трябва също така едно парче на екструдер, който печата с една пластмасова нишка, или две части на екструдер, който може да печата с две пластмасови нишки едновременно. Обикновено се използват по-мощни модели за оста и по-слаби за екструдера, тъй като малък въртящ момент е достатъчен за екструдера, а по-ниското тегло на използваните двигатели позволява намаляване на натоварването върху осите на движение.

Стандартът NEMA определя размерите на фланеца на стъпковия двигател, NEMA 17 означава размер на фланеца от 1,7 инча, в метричната система това би съответствало на 42,3 mm, а разстоянието между монтажните размери ще бъде 31 mm. По-голямата част от двигателите с този размер имат дебелина на вала от 5 mm. Можете да видите чертежа на фланеца за този размер на изображението по-горе.

За да контролирате движенията, ще ви е необходим и драйвер за стъпков двигател. Огромен брой драйвери в различни ценови категории са подходящи за този стандартен размер. Например, поради ниската си цена, често се използват микродрайвери като A4988, DVR8825 и други подобни. Те са удобни за използване във връзка с Arduino - в този случай ще ви е необходим отличният щит RAMPS 1.4, който ви позволява да свържете до 5 оси. Едноплатковите драйвери, базирани на чипове TB6560 и TB6600 от Toshiba, също се използват широко; Тези устройства вече могат да бъдат класифицирани като полупрофесионални драйвери, имат оптоизолирани входове и изходи, могат да се свързват директно към LPT порта на компютъра, реализират по-разширена логика за управление и мощността им е достатъчна за по-големи двигатели. Можете също така да споменете професионални модулни драйвери, те могат да контролират прескачането на стъпки, да изпълняват движение с ускорение и способността да се справят с критични ситуации (например късо съединение), но те не са особено популярни в аматьорския сегмент поради тяхната по-висока цена.

В отделен клас са специализираните контролери за 3D принтери, например Printrboard За разлика от конвенционалните драйвери, освен че изпълняват движения по осите, те могат да контролират и следят температурата на дюзата на екструдера, температурата на нагревателната маса и да реализират други възможности. които са специфични за района. Използването на такива контролери е за предпочитане.

Тук можете да изберете и закупите стъпкови двигатели NEMA 17 за изграждане на 3D принтер на конкурентни цени.

Еднополюсен двуфазен стъпков двигател е задвижване, което може да завърти определен брой стъпки. Един пълен оборот е разделен на 200 стъпки. По този начин можете да принудите вала на двигателя да се върти под произволен ъгъл, кратен на 1,8°.

Моторът има индустриален стандартен размер на фланеца 42 mm, известен като Nema размер 17. Тези двигатели често се използват за изграждане на CNC машини, 3D принтери и други машини, където се изисква прецизно позициониране.

Изводите на двигателя са 6 проводника със свободни краища, като всеки три е свързан към краищата и центъра на намотката, която отговаря за собствената си фаза. По този начин можете да свържете двигателя както в еднополярен, така и в биполярен режим. За да управлявате двигателя с помощта на микроконтролер, ще ви е необходим междинен драйвер, като например драйвер за стъпков двигател (модул Troyka), монтаж на Darlington ULN2003 или H-мост L293D. Разширителната платка на Motor Shield също е подходяща за управление с помощта на Arduino.

Можете да прочетете повече за свързването на стъпкови двигатели към Arduino в статията на официалното wiki.

За закрепване на колела, ролки и други елементи към вала на двигателя е удобно да използвате специална адаптерна втулка.

Препоръчителното захранващо напрежение на двигателя е 12 V. В този случай токът през намотките ще бъде 400 mA. Ако за вашето устройство е трудно да получи зададения режим на мощност, можете да завъртите двигателя, като използвате по-ниско напрежение. В този случай консумацията на ток и въртящият момент ще бъдат съответно намалени.

Характеристики

  • Наклон: 1,8°±5% (200 на оборот)
  • Номинално захранващо напрежение: 12 V
  • Номинален фазов ток: 400mA
  • Въртящ момент (задържащ момент): не по-малко от 3,17 kg×cm
  • Задържащ момент: 0,2 kg×cm
  • Максимална стартова скорост: 2500 стъпки/сек
  • Диаметър на вала: 5 мм
  • Дължина на вала: 24 мм
  • Размери на корпуса: 42×42×48 mm (Nema 17)
  • Тегло: 350 гр

Управление на стъпков двигател с помощта на платка Arduino.

В тази статия продължаваме да се занимаваме с темата за стъпковите двигатели. Последния път свързахме малък мотор 28BYJ-48 (5V) към платката Arduino NANO. Днес ще направим същото, но с друг мотор - NEMA 17, серия 17HS4402 и различен драйвер - A4988.

Стъпковият двигател NEMA 17 е биполярен двигател с висок въртящ момент. Може да върти определен брой стъпки. В една стъпка прави завъртане от 1,8°, съответно пълно завъртане от 360° се извършва в 200 стъпки.
Биполярният двигател има две намотки, по една във всяка фаза, които се обръщат от драйвера, за да се промени посоката на магнитното поле. Съответно четири проводника идват от двигателя.

Този двигател се използва широко в CNC машини, 3D принтери, скенери и др.
Ще се управлява с помощта на платка Arduino NANO.

Тази платка може да произвежда напрежение от 5V, докато моторът работи при по-високо напрежение. Избрахме 12V захранване. Така че ще ни трябва допълнителен модул - драйвер, способен да управлява по-високо напрежение чрез импулси на Arduino с ниска мощност. Драйверът A4988 е идеален за това.

Драйвер за стъпков двигател A4988.

Платката е базирана на чип A4988 от Allegro - драйвер за биполярен стъпков двигател. A4988 разполага с регулируем ток, защита от претоварване и прегряване, а драйверът има и пет опции за микростъпка (до 1/16-та стъпка). Работи от 8 - 35 V и може да осигури ток до 1 A на фаза без радиатор и допълнително охлаждане (необходимо е допълнително охлаждане при подаване на ток от 2 A към всяка намотка).

Характеристики:

Модел: A4988;
захранващо напрежение: от 8 до 35 V;
възможност за настройка на стъпката: от 1 до 1/16 от максималната стъпка;
логическо напрежение: 3-5,5 V;
защита от прегряване;
максимален ток на фаза: 1 A без радиатор, 2 A с радиатор;
разстояние между редовете на краката: 12 мм;
размер на дъската: 20 х 15 мм;
размери на водача: 20 x 15 x 10 mm;
размери на радиатора: 9 x 5 x 9 mm;
тегло с радиатора: 3 гр.;
без радиатор: 2гр.

За да работите с драйвера, имате нужда от мощност на логическо ниво (3 - 5,5 V), доставена към VDD и GND щифтовете, както и мощност на двигателя (8 - 35 V) към VMOT и GND щифтовете. Платката е много уязвима на пренапрежения на захранването, особено ако захранващите проводници са по-дълги от няколко сантиметра. Ако тези пренапрежения надхвърлят максимално допустимата стойност (35 V за A4988), платката може да изгори. Един от начините да защитите платката от такива пренапрежения е да инсталирате голям (поне 47 uF) електролитен кондензатор между захранващия щифт (VMOT) и земята близо до платката.
Свързването или изключването на стъпков двигател, докато драйверът е включен, може да повреди двигателя!
Избраният двигател прави 200 стъпки на пълно завъртане на 360°, което съответства на 1,8° на стъпка. Микростъпков драйвер като A4988 позволява повишена разделителна способност, като може да контролира междинните стъпки. Например, пускането на двигател в режим на четвърт стъпка ще даде на двигател с 200 стъпки на оборот 800 микростъпки, когато се използва. различни ниватекущ
Разделителната способност (размерът на стъпката) се задава чрез комбинации от превключватели на входовете (MS1, MS2 и MS3).

MS1 MS2 MS3 Резолюция на микростъпка
Къс Къс Къс Пълна стъпка
Високо Къс Къс 1/2 стъпка
Къс Високо Къс 1/4 стъпка
Високо Високо Къс 1/8 стъпка
Високо Високо Високо 1/16 стъпка

Всеки импулс на входа STEP съответства на една микростъпка на двигателя, чиято посока на въртене зависи от сигнала на извода DIRECTION. Щифтовете STEP и DIRECTION не се изтеглят към конкретно вътрешно напрежение, така че не трябва да се оставят плаващи, когато създавате приложения. Ако просто искате да завъртите мотора в една посока, можете да свържете DIR директно към VCC или GND. Чипът има три различни входа за контрол на състоянието на захранването: RESET, SLEEP и ENABLE. Щифтът RESET плава; ако не е необходимо да го използвате, трябва да го свържете към съседния щифт SLEEP печатна електронна платкада кандидатствате за него високо нивои включете дъската.

Схема на свързване.

Използвахме това захранване (12V).

За по-лесно свързване към платката Arduino UNO използвахме част, която направихме сами. Пластмасовият калъф е отпечатан на 3D принтер, като към него са залепени контакти.

Също така използвахме следния набор от проводници, някои от тях имат контакт от единия край, щифт от другия, други имат контакти от двете страни.

Свързваме всичко според схемата.

След това отваряме средата за разработка на програми за Arduino и пишем програма, която върти мотора първо в едната посока на 360°, след това в другата.

/*Програма за въртене на стъпков двигател NEMA 17, серия 17HS4402 + драйвер A4988. Първо моторът прави пълен оборот в едната посока, след това в другата */

const int pinStep = 5;


const int pinDir = 4;


const int move_delay = 3;

//стъпки на пълен оборот


void setup()
{

pinMode(pinStep, OUTPUT);
pinMode(pinDir, OUTPUT);


digitalWrite(pinDir, LOW);
}


void loop()
{

digitalWrite(pinDir, HIGH);

for(int i = 0; i< steps_rotate_360; i++)
{
digitalWrite(pinStep, HIGH);
забавяне (преместване_закъснение);
digitalWrite(pinStep, LOW);
забавяне (преместване_закъснение);
}

забавяне (преместване_закъснение*10);


digitalWrite(pinDir, LOW);

for(int i = 0; i< steps_rotate_360; i++)
{
digitalWrite(pinStep, HIGH);
забавяне (преместване_закъснение);
digitalWrite(pinStep, LOW);
забавяне (преместване_закъснение);
}

забавяне (преместване_закъснение*10);
}

Ако искаме моторът просто да се върти постоянно в една или друга посока, тогава можем да свържем контакта на драйвера DIRECTION към маса (въртене по часовниковата стрелка) или захранване (обратно на часовниковата стрелка) и да качим следната проста програма в Arduino:

/*Програма за въртене на стъпков двигател NEMA 17, серия 17HS4402 + драйвер A4988. Програмата задвижва двигателя.
По подразбиране въртенето се извършва по посока на часовниковата стрелка, тъй като щифтът DIRECTION на драйвера е свързан към маса. Ако го свържете към 5V захранване, тогава
моторът се върти обратно на часовниковата стрелка*/
/*цялочислена константа, съхраняваща номера на цифровия щифт Arduino, който доставя сигнала Step към драйвера. Всеки импулс от този контакт е движение на мотора с една стъпка*/

const int pinStep = 5;

//закъснение между стъпките на двигателя в ms
const int move_delay = 3;

/*Функция, в която се инициализират всички програмни променливи*/
void setup()
{
/*настройте стъпковия контакт на изходен режим, т.е. извежда напрежение*/
pinMode(pinStep, OUTPUT);
// задаване на начален режим
digitalWrite(pinStep, LOW);
}

/*Цикълна функция, в която се определя поведението на програмата*/
void loop()
{
/*след определено забавяне моторът се движи с една стъпка*/
digitalWrite(pinStep, HIGH);
забавяне (преместване_закъснение);
digitalWrite(pinStep, LOW);
забавяне (преместване_закъснение);
}

Всичко това, което разгледахме, беше стъпковият режим на двигателя, тоест 200 стъпки на пълен оборот. Но, както вече беше описано, двигателят може да работи в режими на 1/2, 1/4, 1/8, 1/16 стъпки, в зависимост от това каква комбинация от сигнали се подава към контактите на драйвера MS1, MS2, MS3.
Нека се упражняваме с това, свържете тези три контакта към платката Arduino, според диаграмата, и качете програмния код.

Код на програма, която демонстрира всичките пет режима на работа на двигателя, като върти двигателя в едната посока и в другата с 200 стъпки във всеки от тези режими.

/*Програма за въртене на стъпков двигател NEMA 17, серия 17HS4402 + драйвер A4988. Програмата редува стъпкови режими: пълна стъпка, 1/2, 1/4, 1/8, 1/16 стъпки, при всяка от които двигателят се върти 200 стъпки в едната посока, след това в другата */
/*цялочислена константа, съхраняваща номера на цифровия щифт Arduino, който доставя сигнала Step към драйвера. Всеки импулс от този контакт е движение на мотора с една стъпка*/

const int pinStep = 5;

/*цяло числова константа, съхраняваща номера на цифровия щифт Arduino, който доставя сигнала за посока към драйвера. Наличие на импулс - двигателят се върти в една посока, липса - в друга */
const int pinDir = 4;

//закъснение между стъпките на двигателя в ms
const int move_delay = 3;

//стъпки на пълен оборот
const int steps_rotate_360 = 200;


bool StepMode = (
{ 0, 0, 0},
{ 1, 0, 0},
{ 0, 1, 0},
{ 1, 1, 0},
{ 1, 1, 1} };

//размер на масив StepMode
const int StepModeSize = 5;

/*Функция, в която се инициализират всички програмни променливи*/
void setup()
{
/*настройте контактите за стъпка и посока на изходен режим, т.е. извеждат напрежение*/
pinMode(pinStep, OUTPUT);
pinMode(pinDir, OUTPUT);

for(int i = 0; i< StepModePinsCount; i++)
{

}

// задаване на начален режим
digitalWrite(pinStep, HIGH);
digitalWrite(pinDir, LOW);
}

/*Цикълна функция, в която се определя поведението на програмата*/
void loop()
{
for(int i = 0; i< StepModeSize; i++)
{
for(int j = 0; j< StepModePinsCount; j++)
{
digitalWrite(StepModePins[j], StepMode[i][j] == 1 ? ВИСОКО: НИСКО);
}

//завъртете мотора в едната посока, след това в другата
MakeRoundRotation();
}
}

/*функция, при която моторът прави 200 стъпки в една посока, след това 200 в обратна посока*/
void MakeRoundRotation()
{
//задайте посоката на въртене
digitalWrite(pinDir, HIGH);

for(int i = 0; i< steps_rotate_360; i++)
{
digitalWrite(pinStep, HIGH);
забавяне (преместване_закъснение);
digitalWrite(pinStep, LOW);
забавяне (преместване_закъснение);
}

забавяне (преместване_закъснение*10);

//настройване на обратна посока на въртене
digitalWrite(pinDir, LOW);

for(int i = 0; i< steps_rotate_360; i++)
{
digitalWrite(pinStep, HIGH);
забавяне (преместване_закъснение);
digitalWrite(pinStep, LOW);
забавяне (преместване_закъснение);
}

забавяне (преместване_закъснение*10);
}

Е, последното нещо, което трябва да добавим към веригата, е външно управление. Както в предишната статия, ще добавим бутон, който задава посоката на въртене и променлив резистор (потенциометър), който ще променя скоростта на въртене. Ще имаме само 5 скорости, в количество възможни режимистъпка за мотора.

Допълваме диаграмата с нови елементи.

За свързване на бутоните ще използваме следните проводници.

Програмен код.

/*Програма за въртене на стъпков двигател NEMA 17, серия 17HS4402 + драйвер A4988. Схемата включва бутон с 3 позиции (I, II, средно - изключено) и потенциометър. Бутонът регулира посоката на въртене на мотора, а данните от потенциометъра показват кой от петте стъпкови режима на мотора да се включи (пълна стъпка, 1/2, 1/4, 1/8, 1/16 стъпка)* /
/*цялочислена константа, съхраняваща номера на цифровия щифт Arduino, който доставя сигнала Step към драйвера. Всеки импулс от този контакт е движение на мотора с една стъпка*/

const int pinStep = 5;

/*цяло числова константа, съхраняваща номера на цифровия щифт Arduino, който доставя сигнала за посока към драйвера. Наличие на импулс - двигателят се върти в една посока, липса - в друга */
const int pinDir = 4;

/*Контактите от две позиции на бутона са цифрови*/
const int ButtonOn1 = 9;
const int ButtonOn2 = 10;

/*Контакт за регистриране на стойността на потенциометъра - аналог*/
const int PotenciomData = 1;

//закъснение между стъпките на двигателя в ms
const int move_delay = 3;

/*целочислена константа, показваща забавянето във времето между отчитането на състоянието на бутона и потенциометъра*/
const int CheckButtonDelay = 15;

/*Цяла променлива, показваща колко време е минало и дали е време да се прочете състоянието на бутона*/
int CurrentButtonDelay = 0;

/*контакти на драйвера, задаващ стъпковия режим на двигателя - MS1, MS2, MS3*/
int StepModePins = (8, 7, 6);

//размер на масива StepModePins
const int StepModePinsCount = 3;

//състоянието на бутона е включено/изключено
int ButtonState = 0;

//посока на въртене според бутона I - 1, II - 0
int ButtonDirection = 0;

/*Масив, съхраняващ състоянията на контактите MS1, MS2, MS3 на драйвера, при които са зададени различни режими на въртене: пълна стъпка, 1/2, 1/4, 1/8, 1/16 стъпка*/
bool StepMode = (
{ 0, 0, 0},
{ 1, 0, 0},
{ 0, 1, 0},
{ 1, 1, 0},
{ 1, 1, 1} };

//размер на масив StepMode
const int StepModeSize = 5;

//текущ индекс на масив StepMode
int StepModeIndex = 0;

/*Функция, в която се инициализират всички програмни променливи*/
void setup()
{
/*настройте контактите за стъпка и посока на изходен режим, т.е. извеждат напрежение*/
pinMode(pinStep, OUTPUT);
pinMode(pinDir, OUTPUT);

for(int i = 0; i< StepModePinsCount; i++)
{
pinMode(StepModePins[i], OUTPUT);
}

/*контактите от бутона и потенциометъра са поставени в режим на въвеждане*/
pinMode(ButtonOn1, INPUT);
pinMode(ButtonOn2, INPUT);
pinMode(PotenciomData, INPUT);

// задаване на начален режим
digitalWrite(pinStep, LOW);
digitalWrite(pinDir, LOW);
}

/*Цикълна функция, в която се определя поведението на програмата*/
void loop()
{
if(CurrentButtonDelay >= CheckButtonDelay)
{
CheckButtonState();
CurrentButtonDelay = 0;
}

ако (ButtonState == 1)
{
MakeMotorStep();
}

забавяне (преместване_закъснение);
CurrentButtonDelay += move_delay;
}

//функция, при която се изпълнява една двигателна стъпка
void MakeMotorStep()
{
digitalWrite(pinStep, HIGH);
digitalWrite(pinStep, LOW);
}

/*функция, при която се проверява текущото състояние на бутона и потенциометъра*/
void CheckButtonState()
{
int CurrentButtonState = 0, CurrentButtonDirection = 0, CurrentStepModeIndex = 0;

bool readbuttonparam = digitalRead(ButtonOn1);

ако (четене на бутонпараметр)
{
CurrentButtonState = 1;
CurrentButtonDirection = 1;
}

readbuttonparam = digitalRead(ButtonOn2);

ако (четене на бутонпараметр)
{
CurrentButtonState = 1;
CurrentButtonDirection = 0;
}

if(ButtonState != CurrentButtonState)
{
ButtonState = CurrentButtonState;
}

if(ButtonDirection != CurrentButtonDirection)
{
ButtonDirection = CurrentButtonDirection;
digitalWrite(pinDir, ButtonDirection);
}

CurrentStepModeIndex = map(analogRead(PotenciomData), 0, 1023, 0, StepModeSize-1);
if(StepModeIndex != CurrentStepModeIndex)
{
StepModeIndex = CurrentStepModeIndex;
for(int i = 0; i< StepModePinsCount; i++)
{
digitalWrite(StepModePins[i], StepMode[i]);
}
}
}