Адаптер драйвера шагового двигателя (Trema-модуль v2.0)
Trema-модуль Адаптер драйвера шагового двигателя входит в линейку Trema-модулей, что позволяет подключить его к Arduino через Trema Shield по одному 3-проводному и двум 1-проводным шлейфам (идёт в комплекте) без пайки, без дополнительных проводов и переходников, его можно подключать к цифровому выводу Arduino.
Адаптер драйвера шагового двигателя подключается к 3 любым цифровым выводам Arduino.
| Выводы адаптера | Значение | Выводы Arduino |
|---|---|---|
| E (Enable) | Разрешение чипу начать работу. Инверсный вывод (0 — разрешить, 1 — запретить); | Любой цифровой вывод |
| G (GND) | Земля | GND |
| V (VCC) | Питание логики | 3V3/5V |
| S (STEP) | Подача импульсного сигнала шаговому двигателю для поворота (1 импульс — 1 шаг) | Любой цифровой вывод |
| D (DIR) | Указание направления вращения шагового двигателя (0 или 1) | Любой цифровой вывод |
Модуль удобно подключать 3 способами, в зависимости от ситуации:
Способ — 1 : Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO

Способ — 2 : Используя Trema Set Shield
Модуль можно подключить к любому из цифровых входов Trema Set Shield.

Способ — 3 : Используя проводной шлейф и Shield
Используя 5-проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Подключение шагового двигателя к адаптеру:
После установки драйвера мотора в адаптер подключите питание ШД и сам ШД согласно следующей схеме:

Настройка размера шага двигателя:

На плате имеется блок перемычек для регулировки размера шага двигателя.
Для каждого драйвера таблица шагов будет своя, в зависимости от модели драйвера.
Ниже приведены таблицы настройки размера шага для драйверов DRV8825 и A4988.
Драйвер A4988:
| Размер шага | MS-3 | MS-2 | MS-1 |
|---|---|---|---|
| Полный шаг | 0 | 0 | 0 |
| 1/2 шага | 0 | 0 | 1 |
| 1/4 шага | 0 | 1 | 0 |
| 1/8 шага | 0 | 1 | 1 |
| 1/16 шага | 1 | 1 | 1 |
Драйвер DRV8825:
| Размер шага | MS-3 | MS-2 | MS-1 |
|---|---|---|---|
| Полный шаг | 0 | 0 | 0 |
| 1/2 шага | 0 | 0 | 1 |
| 1/4 шага | 0 | 1 | 0 |
| 1/8 шага | 0 | 1 | 1 |
| 1/16 шага | 1 | 0 | 0 |
| 1/32 шага | 1 | 0 | 1 |
| 1/32 шага | 1 | 1 | 0 |
| 1/32 шага | 1 | 1 | 1 |
Питание:
Адаптер драйвера шагового двигателя имеет колодку для подключения внешнего питания (для шагового двигателя) согласно указанной полярности, а так же выводы G и V для питания логики, которые подключаются соответственно к выводам GND и 5V Arduino.
Примеры:
Управление вращением шагового двигателя с помощью потенциометра.
Для управления шаговым двигателем (ШД) понадобится драйвер мотора. В данном случае используется драйвер мотора A4988.
Устанавливаем его в адаптер, а после этого подключаем адаптер и потенциометр к Arduino.
Адаптер драйвера шагового двигателя:
- E — цифровой вывод 7;
- G — GND;
- V — 5V;
- S — цифровой вывод 6;
- D — цифровой вывод 10;
Потенциометр:
const int8_t Step = 6; // импульсы вращения двигателя const int8_t Dir = 10; // направление вращения двигателя const int8_t Enable = 7; // разрешение работы чипу драйвера ШД const int8_t Potenc = A0; // потенциометр int16_t move_delay; // временная задержка между шагами мотора int16_t val_potenc; // Переменная для хранения значения потенциометра void setup() < pinMode (Potenc, INPUT); // Настраиваем вывод Potenc на работу в режиме входа pinMode(Step, OUTPUT); // Настраиваем вывод Step на работу в режиме выхода pinMode(Dir, OUTPUT); // Настраиваем вывод Dir на работу в режиме выхода pinMode(Enable, OUTPUT); // Настраиваем вывод Enable на работу в режиме выхода digitalWrite(Enable, LOW); // Устанавливаем состояние на выходе равным 0 (LOW) >void loop() < val_potenc = analogRead(Potenc); // считываем значение потенциометра в переменную val_potenc if (val_potenc < 470 ) < // Если значение меньше заданного, то val_potenc = 470 - val_potenc; // определяем значение val_potenc digitalWrite(Dir, LOW); // Устанавливаем направление вращения (против часовой стрелки) >else if (val_potenc > 554) < // Если значение больше заданного, то val_potenc = val_potenc - 554; // определяем значение val_potenc digitalWrite(Dir, HIGH); // Устанавливаем направление вращения (по часовой стрелке) >else < val_potenc = 0; // Если значение не удовлетворяет ни одному условию, то обнуляем значение переменной val_potenc >if (val_potenc) < // Если значение val_potenc отлично от 0, то move_delay = map(val_potenc, 1, 470, 5000, 500); // переносим диапазон полученных значений с потенциометра в диапазон значений временной задержки между шагами двигателя digitalWrite(Step, HIGH); delayMicroseconds(move_delay); // Подаём сигнал на вывод Step в течении времени move_delay; digitalWrite(Step, LOW); delayMicroseconds(move_delay); // Снимаем сигнал с вывода Step и ждём время move_delay; >>
После загрузки скетча и подключения питания к двигателю, обратите внимание на потенциометр. При плавном повороте ручки потенциометра вправо двигатель будет плавно набирать скорость и вращаться по-часовой стрелке, а при плавном повороте ручки влево двигатель будет плавно набирать скорость и вращаться против часовой стрелки.
Управление вращением 2 шаговых двигателей с помощью джойстика.
Для управления шаговым двигателем (ШД) понадобится драйвер мотора. В данном случае используется драйвер мотора A4988.
Устанавливаем его в адаптер, а после этого подключаем адаптер и джойстик к Arduino:
Адаптер драйвера шагового двигателя:
- E — цифровой вывод 7;
- G — GND;
- V — 5V;
- S — цифровой вывод 6;
- D — цифровой вывод 10;
Джойстик:
- X — A2;
- K — не подключен;
- V — 5V;
- G — GND;
- Y — A1;
const int8_t Step1 = 6; // импульсы вращения двигателя оси У const int8_t Step2 = 11; // импульсы вращения двигателя оси Х const int8_t Dir1 = 10; // направление вращения двигателя оси У const int8_t Dir2 = 13; // направление вращения двигателя оси Х const int8_t Enable1 = 7; // разрешение работы чипу драйвера ШД оси У const int8_t Enable2 = 12; // разрешение работы чипу драйвера ШД оси Х const int8_t Potenc1 = A1; // потенциометр оси У const int8_t Potenc2 = A2; // потенциометр оси Х int16_t move_delay1; // временная задержка между шагами мотора оси У int16_t move_delay2; // временная задержка между шагами мотора оси Х int16_t val_potenc1; // Переменная для хранения значения потенциометра оси У int16_t val_potenc2; // Переменная для хранения значения потенциометра оси Х void setup() < pinMode (Potenc1, INPUT); // Настраиваем вывод Potenc1 на работу в режиме входа pinMode (Potenc2, INPUT); // Настраиваем вывод Potenc2 на работу в режиме входа pinMode(Step1, OUTPUT); // Настраиваем вывод Step1 на работу в режиме выхода pinMode(Step2, OUTPUT); // Настраиваем вывод Step2 на работу в режиме выхода pinMode(Dir1, OUTPUT); // Настраиваем вывод Dir1 на работу в режиме выхода pinMode(Dir2, OUTPUT); // Настраиваем вывод Dir2 на работу в режиме выхода pinMode(Enable1, OUTPUT); // Настраиваем вывод Enable1 на работу в режиме выхода pinMode(Enable2, OUTPUT); // Настраиваем вывод Enable2 на работу в режиме выхода digitalWrite(Enable1, LOW); // Устанавливаем состояние на выходе Enable1 равным 0 (LOW) digitalWrite(Enable2, LOW); // Устанавливаем состояние на выходе Enable2 равным 0 (LOW) >void loop() < val_potenc1 = analogRead(Potenc1); // считываем значение потенциометра оси У в переменную val_potenc1 if (val_potenc1 < 470 ) < // Если значение меньше заданного, то val_potenc1 = 470 - val_potenc1; // инвертируем значение val_potenc1, чтобы оно принимало значения от 0 до 469 digitalWrite(Dir1, LOW); // Устанавливаем направление вращения (против часовой стрелки) >else // if (val_potenc1 > 554) < // Если значение больше заданного, то val_potenc1 = val_potenc1 - 554; // инвертируем значение val_potenc1, чтобы оно принимало значения от 0 до 469 digitalWrite(Dir1, HIGH); // Устанавливаем направление вращения (по часовой стрелке) >else < // Если значение не удовлетворяет ни одному условию, то val_potenc1 = 0; // обнуляем значение переменной val_potenc1 >val_potenc2 = analogRead(Potenc2); // считываем значение потенциометра оси Х в переменную val_potenc2 if (val_potenc2 < 470 ) < // Если значение меньше заданного, то val_potenc2 = 470 - val_potenc2; // инвертируем значение val_potenc2, чтобы оно принимало значения от 0 до 469 digitalWrite(Dir2, LOW); // Устанавливаем направление вращения (против часовой стрелки) >else // if (val_potenc2 > 554) < // Если значение больше заданного, то val_potenc2 = val_potenc2 - 554; // инвертируем значение val_potenc2, чтобы оно принимало значения от 0 до 469 digitalWrite(Dir2, HIGH); // Устанавливаем направление вращения (по часовой стрелке) >else < // Если значение не удовлетворяет ни одному условию, то val_potenc2 = 0; // обнуляем значение переменной val_potenc2 >if (val_potenc1) < // Если значение val_potenc1 отлично от 0, то move_delay1 = map(val_potenc1, 1, 470, 5000, 500); // переносим диапазон полученных значений с потенциометра оси У в диапазон значений временной задержки между шагами двигателя digitalWrite(Step1, HIGH); delayMicroseconds(move_delay1); // Подаём сигнал на вывод Step1 в течении времени move_delay1; digitalWrite(Step1, LOW); delayMicroseconds(move_delay1); // Снимаем сигнал с вывода Step1 и ждём время move_delay1; >if (val_potenc2) < // Если значение val_potenc2 отлично от 0, то move_delay2 = map(val_potenc2, 1, 470, 5000, 1000); // переносим диапазон полученных значений с потенциометра оси Х в диапазон значений временной задержки между шагами двигателя digitalWrite(Step2, HIGH); delayMicroseconds(move_delay2); // Подаём сигнал на вывод Step2 в течении времени move_delay2; digitalWrite(Step2, LOW); delayMicroseconds(move_delay2); // Снимаем сигнал с вывода Step2 и ждём время move_delay2; >>
После загрузки скетча и подключения питания к двигателю, обратите внимание на джойстик. При повороте ручки джойстика вправо/вверх двигатели оси Х/У будет плавно набирать скорость и вращаться по-часовой стрелке, а при плавном повороте ручки влево/вниз двигатели будут плавно набирать скорость и вращаться против часовой стрелки.
Применение:
- Станки резки/гравировки/3D-печати;
Ссылки:
- Адаптер драйвера шагового двигателя;
- Драйвер шагового двигателя DRV8825;
- Драйвер шагового двигателя A4988;
Сигналы управления драйвера ШД: PUL/DIR, STEP/DIR, CW/CCW. Управление шаговыми драйверами DM860H, DM556, TB6600. с Arduino.
ГЛАВНАЯ / КАтегории / Сигналы управления драйвера ШД: PUL/DIR, STEP/DIR, CW/CCW. Управление шаговыми драйверами DM860H, DM556, TB6600. с Arduino.
Общие сведения:
Шаговый двигатель это бесколлекторный двигатель, ротор которого вращается не плавно, а шагами (дискретно). Один оборот ротора (360°) состоит из определённого количества шагов. Количество полных шагов в одном обороте указывается в технической документации двигателя.
Например, ротор шагового двигателя 17HS1352-P4130, за один полный шаг, поворачивается на 1,8°. Значит для поворота ротора на 360° двигатель должен совершить 200 полных шагов.
Для совершения одного полного шага на обмотки двигателя поступает серия сигналов от драйвера (как в полношаговом «1», так и в микрошаговых режимах «2», «4», «8», «16»).

С принципом работы шаговых двигателей можно ознакомиться в разделе Wiki — ШД.
Микрошаг:
Большинство драйверов позволяют разделить полный шаг двигателя на несколько микрошагов. Выбор микрошага устанавливается согласно таблице в инструкции к драйверу. В таблице указывается количество микрошагов на полный шаг «Microstep» (1/2/4/8/16/32/. ) и/или количество тактов на полный оборот вала «Pulse/rev» (200/400/800/1600/3200/6400/. ).
Если для целого поворота ротора двигателя в режиме 1 микрошаг на полный шаг требуется 200 тактов, то в режиме 4 микрошага на полный шаг, потребуется уже 800 тактов.
Чем больше микрошагов в полном шаге, тем точнее и плавнее поворачивается ротор шагового двигателя, но для поддержания той же скорости, требуется увеличивать частоту следования тактовых импульсов.
Ограничение тока фазы:
Большинство драйверов позволяют ограничить ток фазы (ток протекающий через обмотки двигателя). Выбор тока фазы осуществляется согласно таблице в инструкции к драйверу. В таблице указывается действующий ток «Current» и/или пиковый ток «PK Current». Чем выше ток, тем выше отдаваемый момент (сила двигателя).
Слишком большой ток приведёт к перегреву двигателя и может вызвать его поломку, а слишком маленький может привести к пропуску шагов, или нестабильному вращению ротора.
У некоторых драйверов ограничение тока осуществляется поворотом потенциометра.
Ток удержания:
Ток удержания это постоянный ток проходящий через обмотки двигателя, удерживающий вал в неподвижном состоянии. Некоторые драйверы позволяют снизить ток удержания.
Снижение тока удержания приводит к снижению нагрева двигателя при его удержании.
Силовые выводы драйвера:
Силовые выводы используются для подачи напряжения питания шагового двигателя и подключения его обмоток.
- Входы «VCC», «GND» / «+V», «GND» / «AC+», «AC-» — предназначены для получения напряжения питания шагового двигателя.
- Выводы «A+» и «A-» — предназначены для подключения первой обмотки шагового двигателя.
- Выводы «B+» и «B-» — предназначены для подключения второй обмотки шагового двигателя.
Подключение обмоток двигателя к драйверу зависит от количества выводов у двигателя.

Драйверы DM860H, DM556, TB6600 позволяют работать только с биполярными двигателями. Двигатели с 4 выводами подключаются по схеме А. Двигатели с 6 выводами подключаются по схеме Б или В. Двигатели с 8 выводами подключаются по схеме Г или Д.
Запрещается подключать или отключать обмотки двигателя на включенном драйвере!
Сигналы управления STEP/DIR (PUL/DIR):

- Вход драйвера «STEP» (он же «PULSE») — предназначен для получения тактовых импульсов. За один импульс ротор двигателя поворачивается на один микрошаг. Вход может работать по фронту или спаду импульса. Чем выше частота импульсов, тем выше скорость вращения ротора.
- Вход драйвера «DIR» — предназначен для выбора направления вращения двигателя («0» — в одну сторону, «1» — в другую сторону). Смена состояния вывода «DIR» должна осуществляться при отсутствии импульсов на выводе «STEP».
- Вход драйвера «ENABLE» — разрешает работу двигателя. У большинства драйверов данный вход является инверсным, работа двигателя разрешена при отсутствии напряжения на входе. Некоторые драйверы позволяют вообще не подключать этот вход. Если работа двигателя запрещена, то его обмотки электрически отключаются и вал двигателя не удерживается.
- Двигатель отключён если на входе «ENABLE» есть напряжение.
Сигналы на входах «STEP» и «DIR» игнорируются драйвером. Вал двигателя освобождён. - Вал поворачивается на один микрошаг с каждым импульсом на входе «STEP», при условии что на входе «ENABLE» нет напряжения.
Направление поворота вала зависит от состояния на входе «DIR». - Вал двигателя удерживается в неподвижном состоянии если на входе «ENABLE» нет напряжения и на вход «STEP» не подаются импульсы.
- t1: После снятия напряжения со входа «ENABLE» должно пройти не менее 5мкс до изменения уровня на входе «STEP» или «DIR».
- t2: После изменения состояния на входе «DIR» должно пройти не менее 5мкс до подачи импульса на вход «STEP».
- t3, t4: Длительность импульса или паузы на входе «STEP» не должна быть меньше 2,5мкс.
- t5: Автоматическое снижение тока удержания происходит через 1-2 сек после подачи последнего импульса на вход «STEP». Время зависит от типа драйвера.
Сигналы управления CW/CCW:
(Данные сигналы не поддерживаются драйверами DM860H, DM556, TB6600)

- Вход драйвера «CW» — предназначен для получения тактовых импульсов. За один импульс ротор двигателя поворачивается на один микрошаг. Вход может работать по фронту или спаду импульса. Чем выше частота импульсов, тем выше скорость вращения ротора.
- Вход драйвера «CCW» — выполняет те же действия что и вход «CW», но ротор двигателя поворачивается в другую сторону.
- Вход драйвера «ENABLE» — разрешает работу двигателя. У большинства драйверов данный вход является инверсным, работа двигателя разрешена при отсутствии напряжения на входе. Некоторые драйверы позволяют вообще не подключать этот вход. Если работа двигателя запрещена, то его обмотки электрически отключаются и вал двигателя не удерживается.
- Двигатель отключён если на входе «ENABLE» есть напряжение.
Сигналы на входах «CW» и «CCW» игнорируются драйвером. Вал двигателя освобождён. - Вал поворачивается на один микрошаг с каждым импульсом на входе «CW» или «CCW», при условии что на входе «ENABLE» нет напряжения.
Направление поворота вала зависит от того, на какой вход поступают импульсы. - Вал двигателя удерживается в неподвижном состоянии если на входе «ENABLE» нет напряжения и на входы «CW» и «CCW» не подаются импульсы.
- t1: После снятия напряжения со входа «ENABLE» должно пройти не менее 5мкс до подачи импульса на вход «CW» или «CCW».
- t2: После последнего импульса на одном входе должно пройти не менее 5мкс до подачи импульса на дрогой вход.
- t3, t4: Длительность импульса или паузы не должна быть меньше 2,5мкс.
- t5: Автоматическое снижение тока удержания происходит через 1-2 сек после подачи последнего импульса. Время зависит от типа драйвера.
Подключение управляющих выводов драйвера:
Для подключения управляющих выводов можно использовать одну их следующих схем:

Допускается подключать драйвер к контроллеру без использования сигнала ENABLE, тогда выводы ENA+ и ENA- остаются свободными (не подключёнными).
- При уровне логической «1» = 5В, все сопротивления R исключаются из схемы.
- При уровне логической «1» = 12В, все сопротивления R равны 1кОм.
- При уровне логической «1» = 24В, все сопротивления R равны 2кОм.
Подключение драйвера к Arduino:
Так как логические уровни Arduino UNO равны 5В, то при подключении управляющих выводов к драйверу, ограничивающие сопротивления R не нужны.
Для подключения драйвера к Arduino воспользуемся схемой где выводы PUL-, DIR-, ENA- подключены к GND контроллера (правая схема на картинке выше).
Если подключить драйвер к Arduino без использования сигнала ENABLE, оставив выводы ENA+ и ENA- не подключёнными, то приведённый ниже скетч не сможет освобождать вал. Вал двигателя будет удерживаться всё время, пока он не вращается.

Выводы драйвера ENA+, DIR+ и PUL+ можно подключить к любым выводам Arduino, их номера указываются в начале скетча. В примере это выводы 2, 3 и 4 соответственно.
Если для подключения драйвера воспользоваться схемой где выводы PUL+, DIR+, ENA+ подключены к 5V контроллера (левая схема на картинке выше), то в скетче нужно изменить логические уровни устанавливаемые функциями digitalWrite().
Управление двигателем при помощи Arduino:
Для работы скетча установите микрошаг 1/4, что соответствует 800 тактов на 1 оборот. Микрошаг устанавливается DIP-переключателями драйвера согласно таблице на его корпусе.
Скетч постоянно повторяет 4 действия:
- Поворот вала на 2 полных оборота в одну сторону.
- Остановка двигателя на 5 секунд с удержанием вала.
- Поворот вала на 2 полных оборота в другую сторону.
- Остановка двигателя на 5 секунд с освобождением вала.
const uint8_t pin_ENA = 2; // Вывод Arduino подключённый к входу драйвера ENA+. const uint8_t pin_DIR = 3; // Вывод Arduino подключённый к входу драйвера DIR+. const uint8_t pin_PUL = 4; // Вывод Arduino подключённый к входу драйвера PUL+. // Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-. uint32_t f = 1000; // Определяем частоту следования микрошагов от 1 до 200'000 Гц. // Чем выше частота, тем выше скорость вращения вала. void setup() < // pinMode( pin_ENA, OUTPUT ); // Конфигурируем вывод Arduino как выход. pinMode( pin_DIR, OUTPUT ); // Конфигурируем вывод Arduino как выход. pinMode( pin_PUL, OUTPUT ); // Конфигурируем вывод Arduino как выход. >// // uint32_t t = 1000000/f/2; // Определяем длительность импульсов t3 и пауз t4 в мкс. // void loop() < // // Готовимся к движению вала: // digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя. delayMicroseconds(5); // Выполняем задержку t1 (см. график STEP/DIR). digitalWrite( pin_DIR, 0 ); // Выбираем направление вращения. delayMicroseconds(5); // Выполняем задержку t2 (см. график STEP/DIR). // Поворачиваем вал на 2 оборота: // for(int i=0; i// // Останавливаем вал удерживая его: // Двигатель не вращается, если на вывод PUL не поступают импульсы. delay(5000); // Ждём 5 секунд. В это время двигатель остановлен, его вал удерживается. // Меняем направление движения вала: // digitalWrite( pin_DIR, 1 ); // Меняем логический уровень вывода DIR с 0 на 1. delayMicroseconds(5); // Выполняем задержку t2 (см. график STEP/DIR). // Поворачиваем вал на 2 оборота: // for(int i=0; i // // Останавливаем вал без удержания: // digitalWrite( pin_ENA, 1 ); // Запрещаем работу двигателя, отключаем токи в обмотках. delay(5000); // Ждём 5 секунд. В это время двигатель отключен, его вал свободен. > //
- Движение вала на 2 оборота в одну сторону:
Перед началом движения вала мы разрешаем работу двигателя (установив 0 на выводе ENA) и выбираем направление движения (установив 0 или 1 на вывод DIR), далее выполняем движение подачей импульсов на вывод PUL в теле цикла for. Каждый импульс поворачивает ротор на угол одного микрошага. Микрошаг установлен DIP-переключателями в положение 800 тактов на полный оборот. Код цикла выполняется 1600 раз, значит вал повернётся на 2 оборота. - Остановка вала с удержанием:
Двигатель не вращается, если на вывод PUL не поступают импульсы. Значит обычная задержка на 5000 мс приведёт к остановке двигателя на 5 секунд. Так как работа двигателя была разрешена (на выводе ENA ранее был установлен 0), то через обмотки двигателя будет протекать ток удержания вала. - Движение вала на 2 оборота в другую сторону:
Направление движения вала определяется логическим уровнем на выводе DIR. Ранее на нём был установлен 0, значит теперь нужно установить 1. Далее подачей импульсов на вывод PUL мы заставляем вращаться вал, но теперь в другую сторону. - Остановка вала без удержания:
В предыдущий раз мы останавливали двигатель прекращая подавать импульсы на вывод PUL, но не запрещали работу двигателя, в результате через его обмотки протекал ток удержания вала. Теперь мы запретим работу двигателя установив на выводе ENA уровень логической 1, что приведёт к исчезновению токов в обмотках двигателя. Теперь в течении 5 секунд, двигатель будет не только остановлен, но и его вал можно свободно вращать руками.
Управление шаговым двигателем по прерываниям от 2 таймера Arduino:
const uint8_t pin_ENA = 2; // Вывод Arduino подключённый к входу драйвера ENA+. const uint8_t pin_DIR = 3; // Вывод Arduino подключённый к входу драйвера DIR+. const uint8_t pin_PUL = 4; // Вывод Arduino подключённый к входу драйвера PUL+. // Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-. volatile uint32_t step=0; // Переменная хранит количество микрошагов, которые требуется совершить. // void setup() < // pinMode( pin_ENA, OUTPUT ); // Конфигурируем вывод Arduino как выход. pinMode( pin_DIR, OUTPUT ); // Конфигурируем вывод Arduino как выход. pinMode( pin_PUL, OUTPUT ); // Конфигурируем вывод Arduino как выход. funcSetTimer2( 1000 ); // Запускаем 2 таймер указав частоту следования микрошагов от 1 до 200'000 Гц. >// Чем выше частота, тем выше скорость вращения вала. // void loop() < // // Готовимся к движению вала: // digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя. delayMicroseconds(5); // Выполняем задержку t1 (см. график STEP/DIR). digitalWrite( pin_DIR, 0 ); // Выбираем направление вращения. delayMicroseconds(5); // Выполняем задержку t2 (см. график STEP/DIR). // Поворачиваем вал на 2 оборота: // step=1600; // Указываем количество микрошагов, которые требуется совершить. while(step)// Ждём обнуления переменной. // Останавливаем вал удерживая его: // Двигатель не вращается, если на вывод PUL не поступают импульсы. delay(5000); // Ждём 5 секунд. В это время двигатель остановлен, его вал удерживается. // Меняем направление движения вала: // digitalWrite( pin_DIR, 1 ); // Меняем логический уровень вывода DIR с 0 на 1. delayMicroseconds(5); // Выполняем задержку t2 (см. график STEP/DIR). // Поворачиваем вал на 2 оборота: // step=1600; // Указываем количество микрошагов, которые требуется совершить. while(step) // Ждём обнуления переменной. // Останавливаем вал без удержания: // digitalWrite( pin_ENA, 1 ); // Запрещаем работу двигателя, отключаем токи в обмотках. delay(5000); // Ждём 5 секунд. В это время двигатель отключен, его вал свободен. > // // // ОБРАБОТКА ПРЕРЫВАНИЙ 2 ТАЙМЕРА: // ISR(TIMER2_COMPA_vect) < // Функция вызывается по совпадению регистров TCNT2 и OCR2A. if( step )< // Если требуется выполнять микрошаги, то . bool p = digitalRead(pin_PUL); // Определяем текущее состояние на выводе PUL. digitalWrite(pin_PUL, !p); // Меняем состояние на выводе PUL. if( p )< step--; >// Уменьшаем количество требуемых микрошагов. > // > // // // ФУНКЦИЯ НАСТРОЙКИ 2 ТАЙМЕРА: // void funcSetTimer2(uint32_t f)< // Параметр: «f» - частота тактирования ШД от 1 до 200'000 Гц. if(f>200000) // Определяем значение предделителя: uint16_t i; uint8_t j; f*=2; if(f>(F_CPU/255/ 1))else if(f>(F_CPU/255/ 8))else if(f>(F_CPU/255/ 32))else if(f>(F_CPU/255/ 64))else if(f>(F_CPU/255/128))else if(f>(F_CPU/255/256))else // Устанавливаем регистры 2 таймера: TCCR2A = 0<
Как только переменной step присваивается число отличное от 0, то на драйвер начинают поступать импульсы. Значение step убывает с каждым поданным импульсом, пока не достигнет 0, что приведёт к остановке вала двигателя. Частота подачи импульсов в Гц указывается функцией funcSetTimer2().
В данном скетче мы ждём завершение вращения вала проверяя значение step в цикле while, вместо этого можно выполнять другие действия, например, опрашивать концевики, датчики, измерять пройденное расстояние и т.д.
Код работает на Arduino UNO, Pro Mini, Nano, Mega.
Ссылки
- Шаговые двигатели.
- Драйвер шагового двигателя, TB6600 (4.0А).
- Драйвер шагового двигателя DM556 (5.6A).
- Драйвер шагового двигателя DM860H (7.2A).
- Wiki — Шаговые двигатели.
Каким кабелем подключать шаговый двигатель к драйверу?
Выбирая провод, прежде всего, следует учитывать, что он должен быть тоньше по сравнению с проводом, выходящим из шагового двигателя. Делать кабель толще также не нужно. Поэтому рекомендуется использовать обычный монтажный многожильный медный провод:
Для 42 и 57 ШД сечением 0,5кв. 0,75кв. мм
Для 86 ШД сечением 1кв. мм
Для 110 и 130 ШД сечением 1,5кв. мм.
Лучше, если проводники будут переплетены пофазно, а на провод желательно надеть экранирующую оплетку.
Разводка шин питания драйверов «звездой»
При разводке питающих шин следует действовать сообразно следующим правилам:
Линия питания должна быть достаточно толстая (для драйвера PLD86 лучше всего использовать провод сечением 1.5кв).
Одна линия питания питает только одно устройство (своя линия питания у каждого драйвера). Все шины питания соединяются лишь в одной точке — на клеммах блока питания (разводка шин «звездой»). Если нужно, в точке соединения производится установка дополнительного фильтрующего конденсатора. При разводке шин «звездой» исключено взаимное влияние силовых модулей. При выходе из строя одного устройства, все другие модули продолжают работать.
В разрыв линии питания каждого из драйверов желательно устанавливать быстрые предохранители на ток 7А (для драйверов шаговых двигателей) и 20А (для драйверов серводвигателей).
Заметим также, что контроллер шагового двигателя может быть предназначен для работы с различным количеством осей.
Выбираем фрезерный станок по металлу
Благодаря качественным фрезерным ЧПУ по металлу можно обрабатывать плоскости и заготовки даже со сложной формой. Они прекрасно подходят для изготовления штампов и пресс-форм. Настольные ЧПУ по металлу можно приобрести по невысокой цене. При этом не стоит опасаться за их качество.
Подключение униполярных шаговых двигателей к биполярному драйверу.
Шаговый двигатель (далее ШД) — особая разновидность двигателей, который позволяет точно управлять углом поворота ротора. ШД относится к синхронным безщёточным двигателям, имеет несколько обмоток на статоре (2, 4 или 8), ротор же выполнен из магнито-мягких (способных намагничиваться) или магнито-твердых материалов (постоянных магнитов) и их сочетаний.
На данный момент распространены биполярные ШД, обладающие двумя обмотками на статоре. Например, ШД типоразмера NEMA17, одни из самых распространенных биполярных ШД.

Ток в обмотках статора течет то в одну, то в другую сторону попеременно. Поэтому для управления биполярным ШД необходимы два Н-моста, по одному мосту на обмотку.
На следующей схеме приведена реализация управления биполярным ШД при помощи двух Н-мостов, каждый из которых построен из 6 транзисторов. Управление осуществляется при помощи микроконтроллера, у которого задействовано 4 выхода. Да и в самой прошивке микроконтроллера придется перебирать выводы управления ШД “вручную”.

Также можно использовать, например, микросхему L293 и аналогичные ей микросхемы (сдвоенный Н-мост), но и в этом случае для управление одним биполярным ШД потребуется 4 вывода микроконтроллера.

На фото пример готовой платы с микросхемой L298 для подключения по вышеприведенной схеме.

Следующая схема состоит из сдвоенного Н-моста L298 и специального драйвера L297, который преобразует протокол step/dir в понятный микросхеме L298 порядок переключения обмоток. Кроме того, L297 способна реализовать полушаговый режим работы ШД. То есть логика управления упростилась, но драйвер “оброс” ещё одной микросхемой.

На данный момент все вышеприведенные схемы управления биполярными ШД потеряли актуальность. Потому что рынок наполнен драйверами биполярных ШД, стоимость которых достаточно низка, чтобы перестать заниматься изобретением велосипеда.
Драйверы для управления биполярными ШД работают по протоколу step/dir, содержат в себе защитные диоды, позволяют устанавливать силу тока, протекающую через обмотки ШД и позволяют устанавливать дробный шаг ШД (?, ?, ? и так далее), что в свою очередь позволяет контролировать угол поворота ротора с большей точностью.


Сейчас это всё доступно, как по цене, так и по наличию в онлайн и оффлайн магазинах. Но изначально на рынке отсутствовали доступные решения для управления биполярными ШД, поэтому широкое распространение получили униполярные ШД с 4 (реже с 8) обмотками, ток в каждой из которых течет только в одном направлении. Это позволяет управлять униполярным ШД при помощи ключей. Как видно из следующей схемы, для управления униполярным ШД при помощи транзисторов снова необходимо задействовать четыре вывода микроконтроллера, а также необходимо тратить ресурсы микроконтроллера на перебор выходов “вручную”. Но в этом случае, используется всего 4 транзистора, а не 12, как в случае с биполярным ШД.

Изготовление драйверов униполярных ШД, работающих по протоколу step/dir представляет некоторые сложности для новичков-радиолюбителей, но является вполне выполнимой задачей.
Реализация драйвера униполярного ШД показана на следующей схеме.

Но зачем снова изобретать велосипед, если драйверы для ШД стоят не дорого и доступны… ах да, я об этом уже говорил.
Но позвольте, те ШД, что в обилии встречаются в магазинах, предназначены для биполярных ШД. Причем тут униполярные?
Дело в том, что почти любой униполярный ШД можно переделать в биполярный, чаще всего даже без разборки, лишь правильным подключением обмоток.
Униполярный в биполярный.
Чтобы определить, какой тип ШД перед вами, достаточно посчитать количество выводов.
- 4 вывода — перед вами биполярный ШД, поздравляю вас, переделка не требуется.

- 5 выводов — униполярный ШД, в котором один из выводов каждой из четырех катушек соединен с остальными (смотрите изображение). Пример такого ШД — распространенный в настоящее время компактный ШД 28BYJ-48.

Переделать такой ШД в биполярный простым переключением катушек не представляется возможным. Необходима разборка двигателя.

В случае с 28BYJ-48 (на фото выше) переделка сводится к снятию крышки и перерезанию одной дорожки на печатной плате. Ну и соответственно один провод (красный) можно будет выпаять и удалить. При этом момент увеличится в 1,4 раза.

- 6 выводов — очень похож на 5-выводной, за исключением того, что центральные выводы катушек не соединены между собой. Для такого ШД существует 2 способа использования:
- игнорируем центральные выводы катушек, при этом момент увеличивается в 1.4 раза (корень из 2). Момент стабилен на низких частотах.
- игнорируем один из крайних выводов катушки — ШД работает с параметрами, заявленными в даташите (момент, ток). Момент стабилен на высоких частотах.

- 8 выводов, четыре независимых катушки. Существует три способа подключения таких ШД:
- игнорируем одну из обмоток в паре обмоток, ШД работает с параметрами, заявленными в даташите (момент, ток), момент стабилен на высоких частотах.
- соединяем пару обмоток последовательно — момент увеличивается в 1,4 раза, момент становится стабилен на более низких частотах, чем в первом варианте.
- соединяем пару обмоток параллельно — момент увеличивается в 2 раза и становится стабилен на более высоких частотах, чем в первом варианте.

Как видно из приведенных выше примеров, использование униполярных ШД с биполярными драйверами вполне реально. Кроме того, в зависимости от типа ШД и способа его подключения его параметры могут меняться, что можно использовать в соответствии с вашими целями.
Заключение.
На данный момент у меня набралась коллекция униполярных ШД от старых матричных принтеров, жестких дисков 80-х годов и прочего устаревшего оборудования. К тому же, я активно использую миниатюрные 28BYJ-48, каждый из которых переделываю для работы с биполярным драйвером для шаговых двигателей. С каждым годом количество униполярных двигателей в обиходе радиолюбителей становится всё меньше. Причиной тому снижение цен на шаговые двигатели типоразмера NEMA и утилизация старых двигателей охотниками за цветными металлами. Тем не менее, я надеюсь, что приведенная мной информация позволит дать вторую жизнь устаревшим униполярным шаговым двигателям, которые еще остались в использовании у радиолюбителей.