Примеры применения драйвера шагового двигателя с аналоговым входом. Arduino и шаговый двигатель Nema


Пропорциональное управление шаговым двигателем

Описываемое ниже устройство позволяет управлять униполярным шаговым двигателем типа СДХ 1,8/40 и аналогичным. Схема электрическая принципиальная блока управления изображена на рис.1. Он выполнен на базе микроконтроллера ATmega 8 работающего от встроенного тактового генератора на частоте 2 МГц. В качестве ключей, коммутирующих обмотки шагового двигателя М1, использованы логические элементы микросхем DD2, DD3 типа SN75452 (русский аналог - К155ЛА18). Это микросхемы - повышенной мощности с открытым коллекторным выходом.

Блок поддерживает пропорциональное и дискретное управление мотором. В режиме пропорционального управления - угол поворота ротора двигателя, задается переменный резистором R1. В режиме дискретного управления - вращение двигателя «влево», «вправо», «стоп» осуществляется кнопками S1 и S2. Кроме этого, в схеме можно выбирать шаговый или полушаговый режим работы, а также скорость вращения двигателя.
Установкой перемычки X4 выбирается пропорциональное управление, а при ее отсутствии - дискретное управление. Перемычкой X5 определяется шаговый и полушаговый режим работы двигателя. Все эти режимы работы инициализируются только в момент включения схемы или сброса микроконтроллера. Поэтому нужные перемычки необходимо установить перед включением питания. В микроконтроллере задействованы два канала АЦП. На вход одного из них - ADC5 (28 ножка) подключен подстроечный резистор R3. С его помощью регулируется скорость вращения двигателя при любом режиме работы схемы.
В режиме пропорционального управления задействуется еще один канал АЦП - ADC4 (27 ножка). На его вход через интегрирующую цепь R2, C1 подключен переменный резистор R1, который задает угол поворота ротора мотора. Скорость работы АЦП в данной управляющей программе осуществляет преобразования с 8 - битной точностью. Поэтому положение ручки переменного резистора R1 программа контроллера условно разбивает на 255 шагов. После включения питания, программа выполняет калибровку положения ротора шагового двигателя. Для этого, перед началом работы, автоматически выполняется команда «вращение двигателя влево» до тех пор, пока флажок, закрепленный на роторе мотора, не «доедет» до концевого датчика (оптопары) VT1, HL1. При поступлении сигнала с датчика VT1, программа обнуляет регистр-счетчик количества шагов двигателя, измеряет напряжение на выходе переменного резистора R1, преобразует его в цифровой код в диапазоне от 0 до 255, записывает его в старший байт регистра результата преобразования АЦП (это количество шагов переменного резистора R1), а затем сравнивает его содержимым регистра-счетчика количества шагов двигателя. Если число шагов резистора R1 больше чем шагов двигателя М1, то выдается команда: «вращение двигателя вправо». При этом с каждым шагом ротора происходит инкремент счетчика шагов двигателя и его сравнение с числом в регистре АЦП (шаги резистора R1). Когда число шагов двигателя станет равно числу в регистре АЦП, выполняется команда: «стоп». Поворачивая ручку резистора R1 «влево», уменьшается уровень постоянного напряжения на входе АЦП. При этом число в регистре результата преобразования АЦП станет меньше чем текущее значение регистра - счетчика шагов. В этом случае выдается команда: «вращение двигателя влево». С каждым шагом двигателя происходит декремент регистра-счетчика шагов двигателя до тех пор, пока числа в обоих регистрах не станут равны. Таким образом, вращая ручку переменного резистора R1, ротор двигателя поворачивается в том же направлении и на такое же количество шагов.
Отмечу, что предлагаемый двигатель совершает один оборот на 360° за 200 шагов (т.е. один шаг - 1,8 град.). Следовательно, в данной схеме, за 255 условных шагов от переменного резистора R1, ротор мотора сделает более одного оборота и повернется на угол 459°. Поэтому для ограничения угла поворота двигателя используется концевой датчик (оптопара) для крайнего правого положения ротора. Он выполнен на элементах VT2, HL2. Для более точного копирования угла поворота ручки переменного резистора ротором двигателя необходимо установить в разрыв вывода сопротивления R1, подключенного к «+5 В», ограничительный резистор Rогр.. Его номинал следует тщательно подобрать (в пределах от 1 до 3 кОм).
В управляющей программе предусмотрена функция повторной калибровки положения ротора двигателя в процессе работы устройства. Например, в случае проскальзывания шагов ротора, по какой либо причине (двигатель перегружен, зацепился за что-то и т.д.), можно повернуть ручку переменного резистора R1 в крайнее левое положение и подождать 2 - 3 секунды. При этом происходит проверка положения флажка ротора с помощью оптического датчика крайнего левого положения VT1. Если флажок не зашел в зону срабатывания датчика, значит в процессе работы произошло смещение шагов ротора мотора М1 относительно шагов резистора R1. В этом случае запускается программа повторной калибровки системы, и работа устройства восстанавливается.
Для работы схемы в режиме пропорционального управления оптический датчик крайнего левого положения и калибровки VT1 - обязателен. Датчик крайнего правого положения VT2 можно не ставить, если нет необходимости в ограничении положения ротора при вращении вправо. Но, тогда, необходимо 14 вывод микроконтроллера подключить к +5 В.
При пропорциональном управлении двигателем в полушаговом режиме ротор совершает поворот в пределах от 0° до 230°. Мощность мотора уменьшается, зато увеличивается плавность хода. Это необходимо учитывать при выборе этого режима работы.
В режиме дискретного управления вращение «вправо» осуществляется кнопкой S1, вращение «влево» - кнопкой S2. Если кнопки не нажаты, выполняется команда «стоп». Программа калибровки двигателя и переменный резистор R1 в этом режиме не используются. Оптические датчики VT1, HL1 и VT2, HL2 работают как ограничители крайних положений ротора двигателя М1. Если ограничение вращения не требуется, то эти оптопары можно не ставить. Но при этом необходимо выводы 14, 15 микроконтроллера припаять к +5В.
В случае необходимости контроля над работой шагового двигателя другими (внешними) устройствами, в схеме предусмотрены специальные выходы на старших пинах порта D микроконтроллера. На выводе PD7 «step» формируется кратковременный импульс прямоугольной формы при каждом шаге двигателя (может пригодиться для внешнего счетчика шагов). Вывод PD6 «rewers» - сигнал реверса двигателя (лог. 0 - вращение вправо, лог. 1 - вращение влево). При обнулении (сбросе) программного счетчика - регистра количества шагов, на выводе PD5 формируется кратковременный импульс «reset». Эти выходы работают и в режиме пропорционального управления.
Управляющая программа для микроконтроллера написана на языке Ассемблер. Файл прошивки прилагается. Кроме этого, необходимо запрограммировать фьюзы: CKSEL0=0, CKSEL1=1, CKSEL2=0, CKSEL3=0, SUT0=0, SUT1=1, SKOPT=1.


Печатная плата блока управления изображена на рис. 2. Она изготовлена из одностороннего фольгированного стеклотекстолита размерами 42 × 58 мм. В прикрепленном файле с расширением.lay прилагается рисунок для «лазерно-утюжной» технологии изготовления платы. Расположение элементов схемы на печатной плате приведено на рисунке 3.

Управление шаговым двигателем с помощью платы 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. Сначала мотор совершает полный оборот в одну сторону, потом в другую*/

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);
delay(move_delay);
digitalWrite(pinStep, LOW);
delay(move_delay);
}

delay(move_delay*10);


digitalWrite(pinDir, LOW);

for(int i = 0; i < steps_rotate_360; i++)
{
digitalWrite(pinStep, HIGH);
delay(move_delay);
digitalWrite(pinStep, LOW);
delay(move_delay);
}

delay(move_delay*10);
}

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

/*Программа для вращения шагового мотора NEMA 17, серии 17HS4402 + драйвер A4988. Программа приводит мотор в движение.
По-умолчанию вращение происходит по часовой стрелке, так как на контакт DIRECTION драйвера подключён к земле. Если его подключить к питанию 5V, то
мотор вращается против часовой стрелки*/
/*целочисленная константа, хранящая номер цифрового контакта Arduino, который подаёт сигнал Step на драйвер. Каждый импульс от этого контакта - это перемещение мотора на один шаг*/

const int pinStep = 5;

//временная задержка между шагами мотора в мс
const int move_delay = 3;

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

/*Функция-цикл в которой задаётся поведение программы*/
void loop()
{
/*через заданную задержку происходит перемещение мотора на один шаг*/
digitalWrite(pinStep, HIGH);
delay(move_delay);
digitalWrite(pinStep, LOW);
delay(move_delay);
}

Всё это мы рассматривали шаговый режим мотора, то есть 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 на драйвер. Наличие импульса - мотор вращается в одну сторону, отсутствие - в другую*/
const int pinDir = 4;

//временная задержка между шагами мотора в мс
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()
{
/*задаём контактам Step и Direction режим вывода, то есть они выдают напряжение*/
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 ? HIGH: LOW);
}

//вращаем мотор в одну сторону, затем в другую
MakeRoundRotation();
}
}

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

for(int i = 0; i < steps_rotate_360; i++)
{
digitalWrite(pinStep, HIGH);
delay(move_delay);
digitalWrite(pinStep, LOW);
delay(move_delay);
}

delay(move_delay*10);

//устанавливаем направление вращения обратное
digitalWrite(pinDir, LOW);

for(int i = 0; i < steps_rotate_360; i++)
{
digitalWrite(pinStep, HIGH);
delay(move_delay);
digitalWrite(pinStep, LOW);
delay(move_delay);
}

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 на драйвер. Наличие импульса - мотор вращается в одну сторону, отсутствие - в другую*/
const int pinDir = 4;

/*Контакты от двух положений кнопки - цифровые*/
const int ButtonOn1 = 9;
const int ButtonOn2 = 10;

/*Контакт регистрирующий значение потенциометра - аналоговый*/
const int PotenciomData = 1;

//временная задержка между шагами мотора в мс
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()
{
/*задаём контактам Step и Direction режим вывода, то есть они выдают напряжение*/
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;
}

if(ButtonState == 1)
{
MakeMotorStep();
}

delay(move_delay);
CurrentButtonDelay += move_delay;
}

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

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

bool readbuttonparam = digitalRead(ButtonOn1);

if(readbuttonparam)
{
CurrentButtonState = 1;
CurrentButtonDirection = 1;
}

readbuttonparam = digitalRead(ButtonOn2);

if(readbuttonparam)
{
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]);
}
}
}

Теперь появилась задача поинтереснее. Управлять шаговым двигателем Nema 17 (даташит). Данная модель от оригинального производителя реализуется по цене около 40 долларов. Китайские копии стоят раза в полтора-два дешевле - около 20-30 долларов. Очень удачная модель, которая часто используется в 3D принтерах и CNC-проектах. Первая возникшая проблема - как подобрать драйвер для этого двигателя. Силы тока на пинах Arduino для питания не хватит.

Выбор драйвера для управления Nema 17

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

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

Подключение Nema 17 через A4988

Подключение было реализовано на основании этой темы на Arduino форуме. Рисунок приведен ниже.


Собственно, данная схема присутствует практически на каждом блоге-сайте, посвященном Arduino. Плата была запитана от 12 вольтового источника питания. Но двигатель не вращался. Проверили все соединения, еще раз проверили и еще раз...

Первая проблема

Наш 12 вольтовый адаптер не выдавал достаточной силы тока. В результате адаптер был заменен на 8 батареек АА. И двигатель начал вращаться! Что ж, тогда захотелось перескочить с макетной платы на прямое подключение. И тут возникла

Вторая проблема

Когда все было распаяно, двигатель опять перестал двигаться. Почему? Не понятно до сих пор. Пришлось вернуться к макетной плате. И вот тут возникла вторая проблема. Стоит предварительно было посидеть на форумах или внимательно почитать даташит. Нельзя подключать-отключать двигатель когда на контроллер подано питание! В результате контроллер A4988 благополучно сгорел.

Эта проблема была решена покупкой нового драйвера на eBay. Теперь, уже с учетом накопленного грустного опыта, Nema 17 был подключен к A4988и запущен, но...

Шаговый двигатель сильно вибрирует

Во время вращения ротора двигатель сильно вибрировал. О плавном движении не было и речи. Гугл вновь в помощь. Первая мысль - неправильное подключение обмоток. Ознакомление с даташитом шагового двигателя и несколько форумов убедили, что проблема не в этом. При неправильном подключении обмоток двигатель просто не будет работать. Решение проблемы крылось в скетче.

Программа для Arduino

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

Основные выводы

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

Скетчи для управления шаговым двигателем

Простой Arduino-код для проверки шагового двигателя

//простое подключение A4988

//пины reset и sleep соединены вместе

//подключите VDD к пину 3.3 В или 5 В на Arduino

//подключите GND к Arduino GND (GND рядом с VDD)

//подключите 1A и 1B к 1 катушке шагового двигателя

//подключите 2A и 2B к 2 катушке шагового двигателя

//подключите VMOT к источнику питания (9В источник питания + term)

//подключите GRD к источнику питания (9В источник питания - term)

int stp = 13; //подключите 13 пин к step

int dir = 12; //подключите 12 пин к dir

pinMode(stp, OUTPUT);

pinMode(dir, OUTPUT);

if (a < 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 library .

#include

AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (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, благодаря чему реализуется вращение в противоположном направлении

delay(1000); //задержка на 1 секунду

Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя

Здесь мы научимся писать элементарную программу способную сделать что-либо интересное для новичка. Здесь вы узнаете, как написать простейший скетч для Arduino используя стандартый IDE. Мы пока пропустим использование входов-выходов, но обратим внимание на связь через USB. Синтаксис языка Arduino точно повторяет язык C, поэтому на нем мы останавливаться не будем. Мы сконцентрируемся на конкретных аспектах Arduino языка, в котором вы можете использовать все принципы, которые присущи языку C: переменные, операторы, состояния, типы, константы и т.д.

Использование шаговых двигателей является одним из самых простых, дешевых и легких решений для реализации систем точного позиционирования. Эти двигатели очень часто используются в различных станках ЧПУ и роботах. Сегодня я расскажу о том, как устроены шаговые двигатели и как они работают.

Енкодер вращения KY-040 - это поворотный датчик, который индицирует степень поворота оси и в каком направлении она вращается.

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

Необходимое железо - Arduino и USB-кабель

В этом руководстве предполагается, что вы используете Arduino Uno, Arduino Duemilanove, Nano или Diecimila.

Вам потребуется также кабель стандарта USB (с разъемами типа USB-A и USB-B): такой, каким, к примеру, подключается USB-принтер. (Для Arduino Nano вам потребуется вместо этого кабель с разъемами А и мини-В).

Так же сейчас популярны стали платы с микро юсб - например от китайских производителей Robotdyn.Они мне больше импонируют со стороны

универсальности, но как говорят олдфаги - чем больше металла в разъеме,тем он надежнее!

1. Управляем маленькими моторчиками

Управление маленьким двигателем может быть может осуществляться довольно просто. Если двигатель достаточно маленький, он может быть непосредственно соединен с выводом Arduino, и просто изменяя уровень управляющего сигнала от логической единицы до нуля будем контролировать моторчик. Этот проект раскроет вам основную логику в управлении электродвигателем; однако, это не является стандартным способом подключения двигателей к Arduino. Мы рекомендуем, вам изучить данный способ, а затем перейти на следующую ступень - заняться управлением двигателями при помощи транзисторов.

Подключим миниатюрный вибромоторчик к нашему Arduino.

Серводвигатель MG995 и Arduino

Серводвигатель MG995 поставляется с проводом длиной 30 см и 3-мя ‘S’ контактами типа мама. Выходной вал сервопривода поворачивается приблизительно на 120 градусов (60 градусов в каждом направлении). Для управления сервами MG995 можно использовать любые контроллеры с питанием логики 5 В, в том числе и Arduino.

Сервомашинка изготавливается в пластиковом корпусе. На выходе стоит редуктор с металлическими шестернями. В комплекте поставляются пластиковые качалки различных форм-факторов.

Подключаем мотор, источник питания и реле

Схема подключения:

Позитивный контакт мотора - switch 1 COM input на реле

Отрицательный контакт мотора - switch 2 COM input на реле

Наша компания начала поставки драйвера DM805-AI .

Главной изюминкой драйвера является возможность управлять вращением шагового двигателя без внешнего импульсного устройства. Это обеспечивается за счет встроенного генератора импульсов, частота которых определяется напряжением, подаваемым на вход 0 - 5В драйвера. Причем, это напряжение может быть взято как от внешнего источника (например выходной сигнал напряжения с какого-либо контроллера) так и от самого драйвера. Наличие внутреннего источника напряжения на 5В, позволяет использовать внешний потенциометр.

Драйвер DM805-AI подойдет для задач, в которых требуется задавать скорость вращения двигателя с помощью потенциометра или аналогового сигнала 0 - 5В, и в которых обычно применяли бесколлекторные двигатели с редуктором. Данный же драйвер позволяет для таких задач применять шаговые двигатели без редуктора, так как шаговый двигатель обеспечивает высокий момент с минимальных оборотов, а также не шумит на низких скоростях.

Особенности :

  • самодиагностика и автоматическая установка рабочего тока обмоток;
  • микрошаг до 12800 импульсов/оборот;
  • электрическая схема обеспечивает защиту от среднечастотного резонанса;
  • внутренний источник 5VDC;
  • встроенные потенциометры;
  • две предустанавливаемые скорости;
  • предустановленные задания для разгона и торможения;
  • регулировка скорости вращения вала двигателя сигналом 0 - 5В;
  • ток обмоток от 0,3 до 5А;
  • защита от превышения напряжений и токов.

Драйвер можно использовать в четырех режимах:

  1. Импульсный - это классический STEP/DIR.
  2. Задание скорости сигналом 0 - 5В.
  3. Задание скорости с помощью потенциометра.
  4. Вращение на любой из двух заранее заданных скоростей.

Пример использования режима задания скорости от внешнего источника 5В.

Если для поставленной задачи не нужно точное дискретное позиционирование, а достаточно, например, движение одного конечного выключателя до другого, то в данном случае нет необходимости применять импульсное управление драйвером, а можно обойтись более простым задатчиком напряжения. Импульсное управление требует наличия модуля вывода, поддерживающего высокочастотный дискретный вывод (в случае применения PLC, модуль ввода-вывода поддерживающий высокочастотный режим стоит намного дороже типовых модулей), а также необходимо грамотно написать математику, учитывая и такие моменты, как разгонная и тормозная характеристики. При использовании задания скорости напряжением, нет необходимости в сложных алгоритмах: тормозная и разгонная характеристики, а также ограничение скорости устанавливается с помощью регуляторов на самом драйвере, и все что требуется от системы управления - подать сигнал в диапазона от 0 до 5В. Соответствующие модули аналогового вывода, как правило, недороги. Направление вращения при этом также определяется подаваемым напряжением: если напряжение находится между 0 и 2,5В - вращение в одну сторону, от 2,5 до 5В - в другую.

Пример использования режима управления от внешнего потенциометра.

Четырех позиционный джойстик-потенциометр, задающий отклонения по осям Х и Y. К джойстику подключается два драйвера DM805-AI, обеспечивающие работу по соответствующим осям. Направление отклонения джойстика задает ось и направление, амплитуда отклонения задает скорость вращения.

Пример использования заданных скоростей.

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

Данный режим позволяет еще больше упростить управление скоростью, по сравнению даже с управлением напряжением 0 - 5В. Например, можно автоматически переключать скорость с высокой на низкую, с помощью релейного выхода контроллера, при наступлении какого-либо события.

Про управление в импульсном режиме читайте нашу статью «Управление шаговым двигателем».

Возможность автоматической настройки под конкретный шаговый двигатель очень удобна, или полезна особенно тогда, когда под рукой нет паспорта на двигатель, а его рабочий ток вы не помните (а так чаще всего и бывает). Однако, если вы хотите самостоятельно повозиться с настройками, то к вашим услугам последовательный порт RS232 и необходимое программное обеспечение для персонального компьютера.

В заключение можно сказать, что драйвер DM805-AI позволит вам опробовать и выбрать тот тип управления шаговым двигателем, который удобен для вас.