Как управлять двигателями постоянного тока с помощью ESP32 и модуля L298N
Итак, вы планируете собрать собственного робота с Wi-Fi-управлением на ESP32? Это захватывающий проект — и вы в правильном месте! Одна из первых вещей, которая вам понадобится — это способ управления двигателями постоянного тока вашего робота, и именно здесь на помощь приходит модуль драйвера двигателя L298N. Это простой и надёжный способ управления скоростью и направлением вращения двух двигателей постоянного тока — идеально подходит для двухколёсного робота.
В этом руководстве вы узнаете всё необходимое, чтобы подключить драйвер двигателя L298N к вашему ESP32, управлять скоростью и направлением вращения двух двигателей постоянного тока и запустить вашего робота в кратчайшие сроки.
Давайте начнём!
Основы управления двигателем
Прежде чем изучать драйвер двигателя L298N, важно понять две ключевые концепции:
H-мост — позволяет управлять направлением вращения двигателя
PWM (широтно-импульсная модуляция) — помогает управлять скоростью двигателя постоянного тока
Управление направлением с помощью H-моста
Двигатели постоянного тока — самые простые в использовании! Если подключить батарею к двигателю постоянного тока, он будет вращаться в одном направлении. Если поменять провода местами — он будет вращаться в другом направлении. Но вы не можете каждый раз физически менять провода, когда хотите изменить направление. Вот тут и пригодится H-мост!
H-мост — это специальная схема с четырьмя электронными переключателями, расположенными в форме буквы «H», с двигателем посередине.
Включая и выключая эти переключатели в определённом порядке, можно заставить электрический ток протекать через двигатель в одном или противоположном направлении. Этот умный приём позволяет управлять направлением вращения двигателя без необходимости физически менять провода.
Анимация ниже показывает, как работает H-мост.
Управление скоростью с помощью PWM (широтно-импульсной модуляции)
Когда на двигатель постоянного тока подаётся фиксированное напряжение, он вращается с постоянной скоростью. Если вы хотите изменить скорость, нужно изменить напряжение. Более высокое напряжение заставляет двигатель вращаться быстрее, а более низкое — медленнее.
Однако постоянное физическое изменение напряжения не очень практично. Вот тут и приходит на помощь PWM, или широтно-импульсная модуляция.
PWM — это умный способ управления средним количеством мощности, подаваемой на двигатель. Вместо подачи фиксированного напряжения PWM быстро включает и выключает напряжение очень короткими импульсами.
«Ширина» каждого включённого импульса, также называемая коэффициентом заполнения, определяет, как долго напряжение находится в состоянии «включено» в каждом цикле.
Если напряжение включено большую часть времени (более широкий импульс), двигатель получает более высокое среднее напряжение и вращается быстрее.
Если напряжение выключено большую часть времени (более узкий импульс), двигатель получает более низкое среднее напряжение и вращается медленнее.
Изображение ниже показывает, как различные коэффициенты заполнения влияют на скорость двигателя.
Микросхема драйвера двигателя L298N
В центре модуля расположена большая чёрная микросхема с массивным радиатором — L298N.
Это высоковольтный, сильноточный двойной полный мостовой драйвер, предназначенный в первую очередь для управления индуктивными нагрузками, такими как двигатели постоянного тока, шаговые двигатели, реле и соленоиды. Он работает как усилитель тока, принимая слаботочные управляющие сигналы от ESP32 и усиливая их до более высоких уровней тока и напряжения, необходимых двигателям для работы.
В своей основе L298N имеет два отдельных H-моста. Помните, как H-мост помогает управлять направлением вращения двигателя постоянного тока? Поскольку в L298N два H-моста, он может управлять двумя разными двигателями постоянного тока одновременно. Вы даже можете объединить эти два H-моста для управления биполярным шаговым двигателем.
Питание
L298N довольно гибок в плане питания. Он может работать с широким диапазоном напряжений от 5V до 46V и обеспечивать до 2A непрерывного тока на канал, что позволяет управлять как небольшими любительскими двигателями, так и более крупными и мощными.
Тепловая защита
L298N также имеет встроенную тепловую защиту. Это означает, что если микросхема перегревается — например, из-за чрезмерного потребления тока двигателем или недостаточного охлаждения — L298N автоматически отключает свои выходы для предотвращения повреждения. Как только микросхема остывает до безопасной температуры, она автоматически возобновляет работу.
Технические характеристики
Вот технические характеристики:
Выходное напряжение двигателя |
5V – 46V |
Входное логическое напряжение |
4.5V – 7V |
Непрерывный ток на канал |
2A |
Максимальная рассеиваемая мощность |
25W |
Для получения дополнительной информации обратитесь к техническому описанию ниже.
Распиновка модуля драйвера двигателя L298N
Модуль L298N имеет 11 выводов.
Давайте рассмотрим каждую группу выводов, чтобы понять, что они делают и как их правильно использовать.
Выводы питания
На модуле L298N есть два входных вывода питания: VS и VSS.
VS — это основной вход питания для двигателей. На многих модулях этот вывод обозначен как +12V, но на самом деле он может работать с широким диапазоном постоянного напряжения от 5V до 46V. Однако важно понимать, что напряжение, которое фактически получают ваши двигатели, будет немного ниже того, что вы подаёте на вывод VS. Это связано с тем, что внутренние транзисторы H-моста в L298N вызывают падение напряжения около 2V. Подробнее об этом падении напряжения и о том, какое напряжение следует подавать для работы двигателей на полной скорости, объясняется в соответствующем разделе.
VSS — это вход питания для внутренней логической схемы микросхемы. Для работы логической схемы необходимо стабильное напряжение 5V. Вы можете подать эти 5V одним из двух способов. Первый вариант — подключить внешний источник питания 5V непосредственно к выводу VSS. Второй вариант — использовать встроенный стабилизатор напряжения 5V на модуле, который берёт питание от входа двигателя (VS) и автоматически обеспечивает 5V для логических цепей. При использовании встроенного стабилизатора вам не нужно подключать что-либо к выводу VSS самостоятельно. Подробности об использовании этого стабилизатора и о том, когда подключать VSS напрямую, объясняются в соответствующем разделе.
GND — это общее заземление модуля. И источник питания двигателя, и ваш ESP32 должны иметь общее заземление через этот вывод.
Выводы выхода двигателя
Это выводы, к которым непосредственно подключаются ваши двигатели постоянного тока.
Выводы OUT1 и OUT2 подключаются к первому двигателю (двигатель A), а выводы OUT3 и OUT4 — ко второму двигателю (двигатель B). К этим выводам можно подключить любой двигатель постоянного тока, работающий от 5 до 46 вольт.
Выводы управления направлением
Эти выводы управляют направлением вращения двигателей, включая и выключая внутренние переключатели H-моста:
Микросхема имеет по два вывода управления направлением для каждого двигателя. Выводы IN1 и IN2 управляют направлением вращения двигателя A, а выводы IN3 и IN4 — направлением вращения двигателя B.
Устанавливая различные комбинации сигналов HIGH или LOW на этих выводах, вы можете заставить двигатели вращаться вперёд, назад или остановиться. Таблица ниже показывает, как именно это работает:
Input1 |
Input2 |
Направление вращения |
|---|---|---|
Low(0) |
Low(0) |
Двигатель ВЫКЛЮЧЕН |
High(1) |
Low(0) |
Вперёд |
Low(0) |
High(1) |
Назад |
High(1) |
High(1) |
Двигатель ВЫКЛЮЧЕН |
Выводы управления скоростью
Выводы ENA и ENB управляют скоростью вращения двигателей.
На самом деле, эти выводы работают как простые переключатели включения/выключения. Когда вы подаёте на один из них HIGH, соответствующий двигатель включается и вращается на полной скорости. Когда вы подаёте LOW, двигатель полностью отключается и не будет вращаться.
Но эти выводы могут делать больше, чем просто включать и выключать двигатели. Подавая сигнал PWM (широтно-импульсной модуляции) на ENA или ENB, вы можете управлять скоростью каждого двигателя.
PWM работает путём очень быстрого включения и выключения двигателя — много раз в секунду. Скорость зависит от того, как долго двигатель остаётся включённым в каждом цикле (это называется коэффициент заполнения). Если сигнал остаётся включённым большую часть времени, двигатель вращается быстрее. Если он включён лишь на короткое время, двигатель вращается медленнее.
Модуль L298N обычно поставляется с перемычками, установленными на выводах ENA и ENB, которые подключают их напрямую к 5V. Это заставляет двигатели вращаться на полной скорости по умолчанию. Если вы хотите управлять скоростью двигателей через ESP32, вам нужно снять эти перемычки и подключить выводы ENA и ENB к выводам с поддержкой PWM на вашем ESP32.
Падение напряжения L298N
Вы, возможно, знаете, что когда транзистор находится во «включённом» состоянии или в состоянии «насыщения», позволяя току протекать через него, всегда существует небольшое падение напряжения на нём. L298N использует биполярные транзисторы (BJT) внутри своей схемы H-моста, которые известны заметным падением напряжения при прохождении тока.
Согласно техническому описанию, падение напряжения на L298N может составлять от примерно 1,8V до 3,2V при токе около 1 ампера, и может достигать почти 5V при токе 2 ампера.
Таким образом, как общее правило, можно предполагать падение напряжения около 2V при типичном использовании.
Что это падение напряжения означает для ваших двигателей: если вы подаёте 12V на вход питания двигателей (VS), ваши двигатели получат только приблизительно 10V мощности. Вот почему ваши 12V двигатели постоянного тока могут не работать на полной скорости при питании через L298N с ровно 12V.
Чтобы убедиться, что ваш двигатель работает на максимальной скорости, вы должны подать напряжение на вход питания двигателей, которое примерно на 2V выше, чем фактическое напряжение, необходимое вашему двигателю. Например, если вы используете двигатель на 5V, вам нужно подать около 7V на клемму питания двигателя. Аналогично, если у вас двигатели на 12V, напряжение питания двигателей должно составлять около 14V, чтобы они достигли полной скорости.
Встроенный стабилизатор 5V и перемычка
Модуль драйвера двигателя L298N оснащён встроенным стабилизатором напряжения 78M05. Задача этого стабилизатора — брать питание от входа питания двигателей (подключённого к выводу VS) и преобразовывать его в стабильные 5V. Эти 5V затем используются для питания внутренней логической схемы микросхемы L298N, что означает, что вам не нужно подключать отдельный источник питания 5V к выводу VSS.
На модуле есть небольшая перемычка, которая позволяет включить или отключить этот стабилизатор.
Когда перемычка установлена, стабилизатор 5V включён. В этом режиме стабилизатор 5V автоматически питает внутреннюю логическую схему микросхемы от входа питания двигателей, а вывод VSS становится выходом 5V. Этот выход может обеспечить до 0,5 ампер тока, чего часто достаточно для питания ESP32 или других небольших электронных компонентов.
Однако важно отметить, что встроенный стабилизатор 5V не рассчитан на входное напряжение выше 12V. Поэтому вы должны использовать эту функцию только если напряжение питания двигателей менее 12V. Если напряжение питания двигателей превышает 12V, вы должны снять перемычку, чтобы предотвратить повреждение встроенного стабилизатора 5V.
Вот принципиальная схема, которая поможет вам понять, как протекает питание, когда перемычка стабилизатора установлена.
Когда перемычка снята, стабилизатор 5V отключён, и теперь вывод VSS становится обязательным входом. Это означает, что вы должны подать 5V от внешнего источника питания для питания внутренней логической схемы микросхемы.
Подключение модуля драйвера двигателя L298N к ESP32
Теперь, когда мы знаем, как работает модуль L298N, можно приступить к его подключению к нашему ESP32!
Начнём с подключения питания двигателей. В этом эксперименте мы используем TT-двигатели, которые обычно применяются в двухколёсных роботах. Эти двигатели обычно хорошо работают при напряжении от 3V до 6V. Поскольку модуль L298N вызывает падение напряжения около 2V, мы подключим внешний источник питания 6V к клемме VS. Таким образом наши двигатели получат необходимые им 4V.
Далее нам нужно обеспечить питание 5V для внутренней логической схемы L298N. Вместо использования отдельного источника питания для этого, мы воспользуемся встроенным стабилизатором 5V на модуле. Для этого просто оставьте перемычку стабилизатора 5V на месте. Таким образом модуль будет брать 5V от источника питания двигателей.
Теперь подключим управляющие выводы. Модуль L298N имеет четыре входных вывода — IN1, IN2, IN3 и IN4, которые используются для управления направлением вращения двигателей. Мы подключим их к GPIO-выводам 27, 26, 25 и 33 на ESP32.
Для управления скоростью вращения двигателей мы будем использовать PWM (широтно-импульсную модуляцию). Для этого нам нужно снять маленькие перемычки на ENA и ENB и вместо этого подключить их к GPIO-выводам 14 и 32 на ESP32.
Наконец, подключите двигатели к выходным клеммам модуля L298N. Один двигатель подключается к клемме A — это OUT1 и OUT2. Другой двигатель подключается к клемме B — это OUT3 и OUT4. Не беспокойтесь о том, какой провод двигателя к какому выходу подключать — если ваш двигатель вращается в неправильном направлении, вы можете просто поменять провода местами позже, поскольку нет «правильного» или «неправильного» способа подключения.
Вот краткая справочная таблица подключений выводов:
L298N Motor Driver |
ESP32 |
|
|---|---|---|
GND |
GND |
|
ENA |
14 |
|
IN1 |
27 |
|
IN2 |
26 |
|
IN3 |
25 |
|
IN4 |
33 |
|
ENB |
32 |
Изображение ниже показывает полную схему подключения для этой конфигурации.
Настройка Arduino IDE
Мы будем использовать Arduino IDE для программирования ESP32, поэтому убедитесь, что у вас установлено дополнение ESP32, прежде чем продолжить:
Микроконтроллер ESP32 быстро стал одной из самых популярных плат среди любителей, инженеров и людей, интересующихся Интернетом вещей (IoT)…
Пример кода
Вот простой скетч, который показывает, как управлять направлением и скоростью вращения двух двигателей постоянного тока с помощью драйвера двигателя L298N и ESP32.
Этот пример — отличный способ получить практический опыт использования L298N для управления скоростью и направлением вращения двигателей. Как только вы разберётесь в этом, вы сможете легко создавать более сложные системы управления двигателями, такие как те, что используются в простых роботах или машинках с дистанционным управлением.
// Motor A connections
int enA = 14; // ENA pin
int in1 = 27; // IN1 pin
int in2 = 26; // IN2 pin
// Motor B connections
int enB = 32; // ENB pin
int in3 = 25; // IN3 pin
int in4 = 33; // IN4 pin
// PWM properties
const int freq = 1000; // PWM frequency
const int pwmChannelA = 0; // PWM channel for motor A
const int pwmChannelB = 1; // PWM channel for motor B
const int resolution = 8; // 8-bit resolution (0-255)
void setup() {
// Set all the motor control pins to outputs
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Configure PWM for motor speed control using new API
ledcAttachChannel(enA, freq, resolution, pwmChannelA);
ledcAttachChannel(enB, freq, resolution, pwmChannelB);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
// Set initial PWM duty cycle to 0 (motors off)
ledcWrite(enA, 0);
ledcWrite(enB, 0);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
// This function lets you control spinning direction of motors
void directionControl() {
// Set motors to maximum speed
ledcWrite(enA, 255);
ledcWrite(enB, 255);
// Turn on motor A & B (forward direction)
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions (reverse direction)
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// This function lets you control speed of the motors
void speedControl() {
// Turn on motors (reverse direction)
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
ledcWrite(enA, i);
ledcWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
ledcWrite(enA, i);
ledcWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Примечание
При разгоне или замедлении двигателя постоянного тока вы можете услышать гудящий звук, особенно при низких значениях PWM. Не волнуйтесь — это совершенно нормально. Это происходит потому, что двигателям постоянного тока требуется определённое минимальное напряжение для начала вращения, и при низких значениях PWM напряжение может быть недостаточным для плавной работы двигателя.
Объяснение кода
В начале кода мы объявляем, какие выводы на ESP32 подключены к модулю драйвера двигателя L298N для управления двумя двигателями постоянного тока — двигателем A и двигателем B. Для каждого двигателя есть один вывод включения для управления скоростью с помощью PWM и два входных вывода для управления направлением вращения.
// Motor A connections
int enA = 14; // ENA pin
int in1 = 27; // IN1 pin
int in2 = 26; // IN2 pin
// Motor B connections
int enB = 32; // ENB pin
int in3 = 25; // IN3 pin
int in4 = 33; // IN4 pin
Затем мы настраиваем свойства PWM: частоту 1000 Гц, 8-битное разрешение (так что скорость может изменяться от 0 до 255) и два отдельных PWM-канала — по одному для каждого двигателя.
// PWM properties
const int freq = 1000; // PWM frequency
const int pwmChannelA = 0; // PWM channel for motor A
const int pwmChannelB = 1; // PWM channel for motor B
const int resolution = 8; // 8-bit resolution (0-255)
В функции setup() мы настраиваем все выводы управления направлением как выходы, поскольку мы будем отправлять сигналы HIGH или LOW от ESP32 к L298N для управления поведением двигателей.
// Set all the motor control pins to outputs
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
Далее мы используем функцию ledcAttachChannel() для настройки PWM-каналов на выводах включения. Эта функция подключает определённый PWM-канал к GPIO-выводу с заданной частотой и разрешением.
// Configure PWM for motor speed control using new API
ledcAttachChannel(enA, freq, resolution, pwmChannelA);
ledcAttachChannel(enB, freq, resolution, pwmChannelB);
Мы также убеждаемся, что оба двигателя выключены, установив все выводы управления направлением в LOW и коэффициент заполнения PWM в 0. Это гарантирует, что двигатели не начнут внезапно вращаться при включении ESP32.
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
// Set initial PWM duty cycle to 0 (motors off)
ledcWrite(enA, 0);
ledcWrite(enB, 0);
В функции loop() мы вызываем две пользовательские функции с задержкой в одну секунду между ними. Первая функция — directionControl(), а вторая — speedControl().
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
Давайте разберём, что делает каждая из этих функций.
Функция directionControl() демонстрирует, как управлять направлением вращения обоих двигателей. Сначала мы устанавливаем оба двигателя на максимально возможную скорость, записывая коэффициент заполнения 255. Затем мы отправляем необходимые сигналы на выводы управления направлением, чтобы оба двигателя — A и B — вращались вперёд. После того как они повращаются в этом направлении две секунды, мы изменяем сигналы на выводах направления, что заставляет оба двигателя изменить направление вращения ещё на две секунды. Наконец, мы останавливаем двигатели, установив все выводы управления направлением в LOW.
// This function lets you control spinning direction of motors
void directionControl() {
// Set motors to maximum speed
ledcWrite(enA, 255);
ledcWrite(enB, 255);
// Turn on motor A & B (forward direction)
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions (reverse direction)
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Функция speedControl() демонстрирует, как управлять скоростью двигателей с помощью PWM. Мы начинаем с установки выводов управления направлением так, чтобы оба двигателя вращались в одном направлении. Затем мы медленно увеличиваем скорость двигателей, постепенно повышая значение PWM от 0 до 255. Это имитирует эффект ускорения. Как только двигатели достигают полной скорости, мы выполняем обратный процесс — медленно уменьшаем значение PWM с 255 обратно до 0, что заставляет двигатели постепенно замедляться и останавливаться. Наконец, мы останавливаем двигатели, установив все выводы управления направлением в LOW.
// This function lets you control speed of the motors
void speedControl() {
// Turn on motors (reverse direction)
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
ledcWrite(enA, i);
ledcWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
ledcWrite(enA, i);
ledcWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}