Управление шаговым двигателем с помощью драйвера L298N и Arduino
Если вы увлекаетесь робототехникой, 3D-печатью или сборкой собственного станка с ЧПУ, велика вероятность, что вы столкнётесь с шаговыми двигателями. По принципу работы эти двигатели занимают промежуточное положение между обычными двигателями постоянного тока и сервоприводами. Как и двигатели постоянного тока, они могут вращаться непрерывно, но, как и сервоприводы, они также могут перемещаться точными, контролируемыми шагами. Это делает их идеальными для проектов, где требуется точное управление движением, например позиционирование головки 3D-принтера или управление роботизированной рукой.
Один из самых простых и популярных способов управления шаговым двигателем — использование модуля драйвера двигателя L298N. Он доступен по цене, широко распространён и может управлять как скоростью, так и направлением малых и средних биполярных шаговых двигателей, таких как NEMA 17 или NEMA 23.
В этом руководстве мы расскажем вам всё, что нужно знать для начала работы. Вы узнаете, как работает L298N, как подключить его к шаговому двигателю и Arduino, и как управлять им двумя способами: с помощью встроенной библиотеки Arduino Stepper для простого управления и более продвинутой библиотеки AccelStepper для плавного и гибкого движения.
Давайте начнём и добавим движения вашему следующему проекту!
Драйвер двигателя L298N
В центре модуля находится большая чёрная микросхема с массивным радиатором — L298N.
Это высоковольтный, сильноточный двухканальный полномостовой драйвер, предназначенный в первую очередь для управления индуктивными нагрузками, такими как двигатели постоянного тока, шаговые двигатели, реле и соленоиды.
Микросхема работает как усилитель тока: она принимает управляющие сигналы малого тока от Arduino и усиливает их до более высоких уровней тока и напряжения, необходимых для работы двигателей.
Внутри микросхемы находятся две отдельные схемы H-моста. H-мост — это специальная схема из четырёх электронных ключей, расположенных в форме буквы «H». Каждый H-мост управляет одной из электромагнитных катушек шагового двигателя.
Включая и выключая эти ключи в определённом порядке, вы управляете направлением тока через катушку. Подавая ток на катушки в правильной последовательности, можно заставить вал двигателя вращаться вперёд или назад.
Анимация ниже показывает, как H-мосты работают вместе для управления шаговым двигателем.
Питание
L298N довольно гибок в плане питания. Он может работать с широким диапазоном напряжений — от 5V до 46V — и обеспечивать до 2A непрерывного тока на канал. Это означает, что он может управлять как маленькими шаговыми двигателями, так и более крупными и мощными.
Тепловая защита
Ещё одна полезная функция — встроенная тепловая защита. Если микросхема перегревается — возможно, из-за слишком большого тока двигателя или недостаточного охлаждения радиатора — L298N автоматически временно отключает выходы для предотвращения повреждений. Как только микросхема остынет до безопасной температуры, она автоматически возобновляет работу.
Технические характеристики
Вот технические характеристики:
Выходное напряжение двигателя |
5V – 46V |
|---|---|
Логическое входное напряжение |
4.5V – 7V |
Непрерывный ток на канал |
2A |
Максимальная рассеиваемая мощность |
25W |
Для получения дополнительной информации обратитесь к техническому описанию ниже.
Распиновка модуля драйвера L298N
Модуль L298N имеет 11 выводов.
Давайте рассмотрим каждую группу выводов, чтобы понять их назначение и правильное использование.
Выводы питания
Модуль L298N имеет два основных входных вывода питания: VS и VSS.
VS — это основной вход питания для двигателей. На многих модулях L298N этот вывод обозначен как +12V, но фактически он может принимать широкий диапазон постоянного напряжения — от 5V до 46V. Однако важно знать, что напряжение, которое фактически получают двигатели, будет немного ниже, чем напряжение, подаваемое на вывод VS. Это связано с тем, что внутренние транзисторы H-моста L298N создают падение напряжения около 2V. Подробнее об этом падении напряжения рассказано далее.
VSS — вход питания для внутренней логической схемы микросхемы. Для правильной работы этой схемы требуется стабильное напряжение 5V. Вы можете подать эти 5V двумя способами. Один способ — подключить внешний источник питания 5V напрямую к выводу VSS. Другой — использовать встроенный стабилизатор напряжения 5V, который берёт питание от входа питания двигателей (VS) и автоматически преобразует его в 5V для логических цепей. При использовании встроенного стабилизатора подключать что-либо к выводу VSS не нужно. Подробности об использовании этого стабилизатора описаны далее.
GND — это общий вывод заземления модуля. Источник питания двигателя и Arduino должны иметь общее заземление через этот вывод.
Выходные выводы
К этим выводам подключается шаговый двигатель. OUT1 и OUT2 подключаются к одной катушке двигателя, а OUT3 и OUT4 — к другой.
Управляющие выводы
Выводы IN1, IN2, IN3 и IN4 используются для управления порядком подачи тока на катушки двигателя. Эти выводы фактически управляют внутренними ключами H-мостов L298N, и, отправляя различные последовательности сигналов на них, вы управляете движением двигателя.
Время и порядок подачи управляющих сигналов определяют поведение двигателя:
Последовательность сигналов определяет направление вращения.
Скорость подачи сигналов определяет скорость вращения двигателя.
Общее количество сигналов определяет, насколько далеко повернётся двигатель.
Тщательно управляя этими сигналами через Arduino, вы можете перемещать шаговый двигатель с очень высокой точностью.
Выводы разрешения
ENA и ENB — это выводы разрешения для двух H-мостов. Поскольку каждый H-мост управляет одной катушкой шагового двигателя, ENA относится к одной катушке, а ENB — к другой. Когда вывод разрешения установлен в HIGH, соответствующий H-мост включён и позволяет току протекать через катушку. Когда вывод разрешения установлен в LOW, H-мост выключен и ток через катушку не проходит. Это позволяет независимо включать и отключать каждую катушку.
Модуль L298N обычно поставляется с перемычками на выводах ENA и ENB. Эти перемычки подключают выводы разрешения напрямую к 5V, что означает, что двигатель всегда включён и готов к работе.
Падение напряжения на L298N
Вы, вероятно, знаете, что при протекании тока через электронные компоненты, такие как транзисторы, небольшая часть напряжения всегда теряется. L298N использует биполярные транзисторы (BJT) внутри своих схем H-моста, и эти типы транзисторов имеют заметное падение напряжения при протекании тока.
Согласно техническому описанию, падение напряжения на L298N может составлять от 1.8V до 3.2V при токе около 1 ампера и достигать почти 5V при токе 2 ампера.
Поэтому, как общее правило, можно считать, что падение напряжения составляет около 2V при обычном использовании.
Это падение напряжения напрямую влияет на мощность, получаемую двигателями. Например, если вы подключите источник питания 12V ко входу питания двигателей (VS), двигатель фактически получит не полные 12V, а около 10V.
Для шагового двигателя это пониженное напряжение уменьшает ток через каждую катушку, а поскольку крутящий момент шагового двигателя практически прямо пропорционален току катушки, это означает, что вы получите меньший крутящий момент.
Например, предположим, что ваш шаговый двигатель рассчитан на 12V с сопротивлением катушки 30 Ом, что даёт номинальный ток около 0.4A. Если вы подадите 12V на L298N, двигатель фактически получит только 10V (12V – 2V = 10V) после падения напряжения. Ток через двигатель составит I = 10V / 30 Ом = 0.33A. Это лишь около 83% от номинального тока двигателя, что означает, что вы получите только около 83% возможного крутящего момента.
Чтобы шаговый двигатель работал на полной номинальной мощности, вы должны подать на L298N напряжение примерно на 2V выше, чем фактически требуется двигателю. Например, если вы используете двигатель на 5V, вам нужно подать около 7V на клемму питания двигателя. Аналогично, если у вас двигатель на 12V, источник питания должен быть около 14V.
Встроенный стабилизатор 5V и перемычка
Модуль драйвера L298N оснащён встроенным стабилизатором напряжения 78M05. Задача этого стабилизатора — преобразовывать напряжение от входа питания двигателей (вывод VS) в стабильные 5V. Эти 5V затем используются для питания внутренней логической схемы микросхемы L298N, что избавляет от необходимости подключать отдельный источник 5V к выводу VSS.
На модуле есть небольшая перемычка, позволяющая включать или отключать этот стабилизатор.
Когда перемычка установлена, стабилизатор 5V включён. В этом режиме стабилизатор автоматически питает внутреннюю логическую схему микросхемы от входа питания двигателей, а вывод VSS становится выходом 5V, а не входом. Этот выход может обеспечить ток до 0.5 ампер, чего часто достаточно для питания Arduino или других небольших электронных компонентов проекта.
Однако важно отметить, что встроенный стабилизатор 5V не рассчитан на входное напряжение выше 12V. Поэтому используйте эту функцию, только если источник питания двигателя меньше 12V. Если источник питания двигателя выше 12V, необходимо снять перемычку, чтобы не повредить встроенный стабилизатор.
Ниже приведена электрическая схема, которая поможет понять, как течёт ток при установленной перемычке.
Когда перемычка снята, стабилизатор 5V отключён. В этом случае вывод VSS становится обязательным входом, а не выходом. Это означает, что вам необходимо подать 5V от внешнего источника питания на вывод VSS для питания внутренней логической схемы микросхемы.
Внимание
НЕ подавайте питание одновременно на вывод VSS и вывод VS, когда перемычка установлена. Это может серьёзно повредить ваш модуль!
Определение фаз биполярного шагового двигателя
Прежде чем подключать биполярный шаговый двигатель к модулю L298N, сначала нужно выяснить, какие провода принадлежат одной фазе. Биполярный шаговый двигатель имеет две отдельные катушки, и каждая катушка (или фаза) имеет два провода. Есть два простых способа определить эти пары.
Способ 1
Первый способ — повернуть вал двигателя рукой. Сначала вал должен вращаться довольно свободно. Затем возьмите любые два провода двигателя и кратковременно замкните их. Пока эти провода замкнуты, попробуйте снова повернуть вал. Если вал стал значительно труднее поворачивать, вы нашли фазу! Если вал по-прежнему вращается легко, пробуйте другие комбинации, пока не найдёте пару, создающую сопротивление.
Способ 2
Другой способ — использовать мультиметр в режиме прозвонки. Прикоснитесь щупами мультиметра к двум проводам одновременно. Если мультиметр подаёт звуковой сигнал или показывает наличие цепи, эти два провода принадлежат одной фазе. Если тишина и нет цепи, попробуйте другую пару проводов.
После определения обеих фаз можно переходить к подключению.
Схема подключения биполярного шагового двигателя к модулю L298N и Arduino
Для начала подключим питание двигателей. В этом эксперименте мы используем биполярный шаговый двигатель NEMA 17, который широко применяется в 3D-принтерах и станках с ЧПУ. Эти двигатели обычно рассчитаны на 12V. Поэтому мы подключим внешний источник питания 12V к клемме VS на модуле. Поскольку L298N создаёт падение напряжения около 2V, двигатели фактически получат около 10V и будут работать с немного меньшим крутящим моментом, чем при полной номинальной мощности. Но для многих экспериментов и начальных проектов это вполне приемлемо.
Далее нужно обеспечить питание 5V для внутренней логической схемы L298N. Вместо использования отдельного источника 5V мы воспользуемся встроенным стабилизатором 5V на модуле. Для этого просто оставьте перемычку стабилизатора на месте.
Если вы хотите, чтобы двигатели получали идеальные номинальные 12V, нужно действовать немного иначе. Вам потребуется подать внешний источник питания 14V на клемму VS. Также нужно подать отдельные 5V на клемму VSS для питания внутренней логической схемы; эти 5V можно взять с вывода 5V Arduino. И не забудьте снять перемычку стабилизатора с модуля.
После подключения питания подсоедините управляющие выводы IN1, IN2, IN3 и IN4 на модуле L298N к цифровым выводам 8, 9, 10 и 11 на Arduino.
Чтобы двигатель был всегда включён и готов к работе, оставьте обе перемычки ENA и ENB на месте.
Наконец, подключите провода шагового двигателя к выходным клеммам модуля L298N. Поскольку вы уже определили две фазы ранее, подключите одну пару проводов к OUT1 и OUT2, а другую пару — к OUT3 и OUT4. Не беспокойтесь о том, какой провод идёт к какой клемме внутри пары; порядок не имеет значения.
Вот краткая справочная таблица подключений выводов:
| L298N Motor Driver | Arduino | |
| GND | GND | |
| IN1 | 8 | |
| IN2 | 9 | |
| IN3 | 10 | |
| IN4 | 11 |
На изображении ниже показана полная схема подключения.
Пример кода Arduino 1 — Использование встроенной библиотеки Stepper
В этом примере мы будем использовать библиотеку Stepper, входящую в состав Arduino IDE. Эта библиотека берёт на себя все сложные последовательности шагов, значительно упрощая управление как униполярными, так и биполярными шаговыми двигателями.
Вот простой скетч, который заставит двигатель медленно вращаться в одном направлении, а затем быстро — в противоположном.
// Include the Arduino Stepper Library
#include <Stepper.h>
// Define the number of steps per rotation
const int stepsPerRevolution = 200;
// Create Instance of Stepper library
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
void setup() {
// Nothing to do (Stepper Library sets pins as outputs)
}
void loop() {
// Rotate CW slowly at 50 RPM
myStepper.setSpeed(50);
myStepper.step(stepsPerRevolution);
delay(1000);
// Rotate CCW quickly at 100 RPM
myStepper.setSpeed(100);
myStepper.step(-stepsPerRevolution);
delay(1000);
}
Объяснение кода
Давайте разберём, как работает эта программа.
Скетч начинается с подключения библиотеки Stepper. Эта библиотека предоставляет функции для управления шаговыми двигателями.
#include <Stepper.h>
Далее мы сообщаем Arduino, сколько шагов нужно сделать для одного полного оборота, что в данном случае составляет 200 шагов.
const int stepsPerRevolution = 200;
После этого мы создаём объект класса Stepper. Мы передаём ему два параметра: количество шагов на оборот и номера выводов Arduino, подключённых к плате драйвера двигателя.
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
Функция setup() в нашей программе пуста. Обычно здесь мы настраиваем выводы, но библиотека Stepper автоматически настраивает выводы за нас, поэтому ничего добавлять не нужно.
void setup() {
// Nothing to do
}
В функции loop() мы сначала устанавливаем скорость двигателя с помощью setSpeed(). Затем вызываем функцию step(), чтобы указать двигателю, сколько шагов нужно сделать. Если число, переданное в step(), положительное, двигатель вращается по часовой стрелке. Если отрицательное — против часовой стрелки.
Таким образом, в нашей программе двигатель сначала медленно вращается по часовой стрелке со скоростью 50 об/мин на 200 шагов (один полный оборот). Затем ждёт одну секунду. После этого он быстро вращается в противоположном направлении со скоростью 100 об/мин ещё на 200 шагов. Этот процесс повторяется бесконечно.
void loop() {
// Rotate CW slowly at 50 RPM
myStepper.setSpeed(50);
myStepper.step(stepsPerRevolution);
delay(1000);
// Rotate CCW quickly at 100 RPM
myStepper.setSpeed(100);
myStepper.step(-stepsPerRevolution);
delay(1000);
}
Важно понимать, что функция step() является блокирующей. Это означает, что когда вы говорите двигателю сделать шаги, Arduino останавливается и ждёт завершения всех шагов, прежде чем перейти к следующей инструкции. Например, если вы установите скорость 1 об/мин и скажете двигателю сделать один полный оборот (200 шагов), Arduino приостановится на целую минуту, прежде чем перейти к следующей строке кода.
Пример кода Arduino 2 — Использование библиотеки AccelStepper
Встроенная библиотека Arduino Stepper отлично работает для простых проектов с одним двигателем. Однако, если вам нужно управлять несколькими шаговыми двигателями одновременно или вы хотите более плавное движение с ускорением и замедлением, вам понадобится что-то более продвинутое.
Вот тут-то и пригодится библиотека AccelStepper! Эта мощная библиотека специально разработана для более сложного управления шаговыми двигателями. В отличие от базовой библиотеки Stepper, AccelStepper может:
Управлять несколькими шаговыми двигателями одновременно, с независимым шагом для каждого двигателя.
Поддерживать ускорение и замедление.
Поддерживать полушаговый режим для более плавного и точного движения.
Поскольку эта библиотека не предустановлена в Arduino IDE, её необходимо установить перед использованием.
Установка библиотеки
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.
Введите «accelstepper» в поле поиска для фильтрации результатов.
Найдите библиотеку AccelStepper от Mike McCauley.
Нажмите кнопку Install, чтобы добавить её в Arduino IDE.
Код Arduino
Вот простой скетч, который заставляет двигатель ускоряться в одном направлении, а затем замедляться до полной остановки. После завершения одного полного оборота двигатель меняет направление и повторяет процесс.
// Include the AccelStepper Library
#include <AccelStepper.h>
// Define step constant
#define MotorInterfaceType 4
// Creates an instance
AccelStepper myStepper(MotorInterfaceType, 8, 9, 10, 11);
void setup() {
// set the maximum speed, acceleration factor,
// initial speed and the target position
myStepper.setMaxSpeed(1000.0);
myStepper.setAcceleration(50.0);
myStepper.setSpeed(200);
myStepper.moveTo(200);
}
void loop() {
// Change direction once the motor reaches target position
if (myStepper.distanceToGo() == 0)
myStepper.moveTo(-myStepper.currentPosition());
// Move the motor one step
myStepper.run();
}
Объяснение кода
Скетч начинается с подключения только что установленной библиотеки AccelStepper.
#include <AccelStepper.h>
Затем мы определяем тип интерфейса двигателя. Поскольку мы используем 4-проводный шаговый двигатель в режиме полного шага, мы устанавливаем эту константу равной 4. Если вы хотите более плавное движение, можно использовать полушаговый режим, изменив это значение на 8.
#define MotorInterfaceType 4
Далее мы создаём объект класса AccelStepper. При создании мы передаём два параметра: только что определённый тип интерфейса двигателя и выводы Arduino, подключённые к плате драйвера.
AccelStepper myStepper(MotorInterfaceType, 8, 9, 10, 11);
В функции setup() мы настраиваем несколько важных параметров:
setMaxSpeed()устанавливает максимальную допустимую скорость двигателяsetAcceleration()управляет тем, насколько быстро двигатель набирает скорость или замедляется — это помогает создать плавное движение вместо резких рывковsetSpeed()устанавливает начальную скоростьmoveTo()указывает двигателю первую целевую позицию, которая в данном случае составляет 200 шагов (один полный оборот для NEMA 17)
void setup() {
myStepper.setMaxSpeed(1000.0);
myStepper.setAcceleration(50.0);
myStepper.setSpeed(200);
myStepper.moveTo(200);
}
В функции loop() мы проверяем, достиг ли двигатель целевой позиции, с помощью distanceToGo(). Когда это значение становится нулём, это означает, что двигатель прибыл в пункт назначения. В этот момент мы меняем направление двигателя, устанавливая новую цель, противоположную текущей позиции. Это заставляет двигатель двигаться вперёд-назад бесконечно, меняя направление после каждого полного оборота.
В конце цикла мы вызываем функцию run(). Это крайне важно! В отличие от базовой библиотеки Stepper, где двигатель начинает двигаться сразу при вызове step(), библиотека AccelStepper работает иначе. Вы должны вызывать run() многократно, чтобы двигатель фактически двигался. Если вы забудете этот шаг, двигатель не будет работать вообще, даже если вы установили скорость и цель.
void loop() {
// Change direction once the motor reaches target position
if (myStepper.distanceToGo() == 0)
myStepper.moveTo(-myStepper.currentPosition());
// Move the motor one step
myStepper.run();
}