Управление шаговым двигателем с помощью платы Arduino.
В данной статье мы продолжаем разбираться с темой шаговых двигателей. В прошлый раз мы подключили к плате Arduino NANO небольшой моторчик 28BYJ-48 (5V). Сегодня мы будем делать то же самое, но с другим мотором - NEMA 17, серии 17HS4402 и другим драйвером - A4988.
Шаговый мотор NEMA 17 — это биполярный двигатель с высоким крутящим моментом. Может поворачиваться на заданное число шагов. За один шаг совершает оборот на 1,8°, соответственно полный оборот на 360° осуществляет за 200 шагов.
Биполярный двигатель имеет две обмотки, по одной в каждой фазе, которая для изменения направления магнитного поля переполюсовывается драйвером. Соответственно, от мотора отходят четыре провода.
Такой мотор широко применяется в станках ЧПУ, 3D принтерах, сканерах и т. д.
Управляться он будет с помощью платы Arduino NANO.
Эта плата способна выдавать напряжение 5V, тогда как мотор работает от большего напряжения. Мы выбрали блок питания 12V. Так что нам понадобится дополнительный модуль — драйвер, способный управлять более высоким напряжением через маломощные импульсы Arduino. Для этого отлично подходит драйвер А4988.
Драйвер шагового двигателя А4988.
Плата создана на базе микросхемы A4988 компании Allegro - драйвера биполярного шагового двигателя. Особенностями A4988 являются регулируемый ток, защита от перегрузки и перегрева, драйвер также имеет пять вариантов микрошага (вплоть до 1/16-шага). Он работает от напряжения 8 - 35 В и может обеспечить ток до 1 А на фазу без радиатора и дополнительного охлаждения (дополнительное охлаждение необходимо при подаче тока в 2 A на каждую обмотку).
Характеристики:
Модель: A4988;
напряжения питания: от 8 до 35 В;
возможность установки шага: от 1 до 1/16 от максимального шага;
напряжение логики: 3-5.5 В;
защита от перегрева;
максимальный ток на фазу: 1 А без радиатора, 2 А с радиатором;
расстояние между рядами ножек: 12 мм;
размер платы: 20 х 15 мм;
габариты драйвера: 20 х 15 х 10 мм;
габариты радиатора: 9 х 5 х 9 мм;
вес с радиатором: 3 г;
без радиатора: 2 г.
Для работы с драйвером необходимо питание логического уровня (3 - 5,5 В), подаваемое на выводы VDD и GND, а также питание двигателя (8 - 35 В) на выводы VMOT и GND. Плата очень уязвима для скачков напряжения, особенно если питающие провода длиннее нескольких сантиметров. Если эти скачки превысят максимально допустимое значение (35 В для A4988) ,то плата может сгореть. Одним из способов защиты платы от подобных скачков является установка большого (не меньше 47 мкФ) электролитического конденсатора между выводом питания (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. Сначала мотор совершает полный оборот в одну сторону, потом в другую*/ /*целочисленная константа, хранящая номер цифрового контакта Arduino, который подаёт сигнал Step на драйвер. Каждый импульс от этого контакта — это перемещение мотора на один шаг*/ const int pinStep = 5; /*целочисленная константа, хранящая номер цифрового контакта Arduino, который подаёт сигнал Direction на драйвер. Наличие импульса - мотор вращается в одну сторону, отсутствие - в другую*/ //временная задержка между шагами мотора в мс //шагов на полный оборот /*Функция, в которой происходит инициализация всех переменных программы*/ /*Функция-цикл в которой задаётся поведение программы*/ for(int i = 0; i < steps_rotate_360; i++) delay(move_delay*10); //устанавливаем направление вращения обратное for(int i = 0; i < steps_rotate_360; i++) delay(move_delay*10); |
Если мы хотим, чтобы мотор просто постоянно вращался в ту или иную сторону, то можно подключить контакт драйвера DIRECTION к земле (вращение по часовой стрелке) или питанию (против часовой) и залить в Arduino такую простенькую программу:
/*Программа для вращения шагового мотора NEMA 17, серии 17HS4402 + драйвер A4988. Программа приводит мотор в движение. По-умолчанию вращение происходит по часовой стрелке, так как на контакт DIRECTION драйвера подключён к земле. Если его подключить к питанию 5V, то мотор вращается против часовой стрелки*/ /*целочисленная константа, хранящая номер цифрового контакта Arduino, который подаёт сигнал Step на драйвер. Каждый импульс от этого контакта — это перемещение мотора на один шаг*/ const int pinStep = 5; //временная задержка между шагами мотора в мс /*Функция, в которой происходит инициализация всех переменных программы*/ /*Функция-цикл в которой задаётся поведение программы*/ |
Всё это мы рассматривали шаговый режим мотора, то есть 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, который подаёт сигнал Direction на драйвер. Наличие импульса - мотор вращается в одну сторону, отсутствие - в другую*/ //временная задержка между шагами мотора в мс //шагов на полный оборот /*контакты на драйвере, задающие режим шага мотора - MS1, MS2, MS3*/ //размер массива StepModePins /*Массив, хранящий состояния контактов MS1, MS2, MS3 драйвера, при которых задаются разные режимы вращения: полношаговый, 1/2, 1/4, 1/8, 1/16я шага*/ //размер массива StepMode /*Функция, в которой происходит инициализация всех переменных программы*/ for(int i = 0; i < StepModePinsCount; i++) //устанавливаем начальный режим /*Функция-цикл в которой задаётся поведение программы*/ //вращаем мотор в одну сторону, затем в другую /*функция, в которой мотор совершает 200 шагов в одном направлении, затем 200 в обратном*/ for(int i = 0; i < steps_rotate_360; i++) delay(move_delay*10); //устанавливаем направление вращения обратное for(int i = 0; i < steps_rotate_360; i++) delay(move_delay*10); |
Ну, и последнее, что нам осталось добавить в схему, так это внешнее управление. Как и в предыдущей статье добавим кнопку, задающую направление вращения и переменный резистор (потенциометр), который будет менять скорость вращения. Скоростей же у нас будет только 5, по количеству возможных режимов шага для мотора.
Дополняем схему новыми элементами.
Для подключения кнопок воспользуемся такими проводочками.
Код программы.
/*Программа для вращения шагового мотора NEMA 17, серии 17HS4402 + драйвер A4988. В схему включены кнопка с 3мя положениями (I, II, среднее — выключено) и потенциометр. Кнопка регулирует направление вращения мотора, а данные с потенциометра показывают какой из пяти режимов шага мотора включить (полношаговый, 1/2, 1/4, 1/8, 1/16 шага)*/ /*целочисленная константа, хранящая номер цифрового контакта Arduino, который подаёт сигнал Step на драйвер. Каждый импульс от этого контакта — это перемещение мотора на один шаг*/ const int pinStep = 5; /*целочисленная константа, хранящая номер цифрового контакта Arduino, который подаёт сигнал Direction на драйвер. Наличие импульса - мотор вращается в одну сторону, отсутствие - в другую*/ /*Контакты от двух положений кнопки - цифровые*/ /*Контакт регистрирующий значение потенциометра - аналоговый*/ //временная задержка между шагами мотора в мс /*целочисленная константа, показывающая временную задержку между считыванием состояния кнопки и потенциометра*/ /*Целочисленная переменная показывающая, сколько прошло времени и не пора ли считывать состояние кнопки*/ /*контакты на драйвере, задающие режим шага мотора - MS1, MS2, MS3*/ //размер массива StepModePins //состояние кнопки включено-выключено //направление вращения согласно кнопке I - 1, II - 0 /*Массив, хранящий состояния контактов MS1, MS2, MS3 драйвера, при которых задаются разные режимы вращения: полношаговый, 1/2, 1/4, 1/8, 1/16я шага*/ //размер массива StepMode //текущий индекс массива StepMode /*Функция, в которой происходит инициализация всех переменных программы*/ for(int i = 0; i < StepModePinsCount; i++) /*контакты от кнопки и потенциометра устанавливаем в режим входных*/ //устанавливаем начальный режим /*Функция-цикл в которой задаётся поведение программы*/ if(ButtonState == 1) delay(move_delay); //функция, в которой совершается один шаг мотора /*функция, в которой проверяется текущее состояние кнопки и потенциометра*/ bool readbuttonparam = digitalRead(ButtonOn1); if(readbuttonparam) readbuttonparam = digitalRead(ButtonOn2); if(readbuttonparam) if(ButtonState != CurrentButtonState) if(ButtonDirection != CurrentButtonDirection) CurrentStepModeIndex = map(analogRead(PotenciomData), 0, 1023, 0, StepModeSize-1); |