Подключение модуля драйвера двигателя L298N к Arduino

Подключение модуля драйвера двигателя L298N к Arduino

Итак, вы планируете собрать собственного двухколёсного робота? Это замечательно! В какой-то момент вам нужно будет разобраться, как управлять двигателями, приводящими его в движение. Наиболее распространённый тип, который вы будете использовать — это двигатель постоянного тока. Эти двигатели просты, надёжны и идеально подходят для начинающих проектов. Им не нужны сложные сигналы — просто подайте напряжение, и они начнут вращаться.

Звучит просто, правда? Так почему бы не подключить двигатели напрямую к Arduino? Дело в том, что двигатели постоянного тока потребляют гораздо больше тока, чем Arduino может безопасно предоставить. Если попытаться запустить двигатель напрямую от вывода Arduino, вы рискуете перегрузить его и, возможно, повредить ваш Arduino.

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

В этом руководстве вы узнаете всё необходимое для подключения драйвера двигателя L298N к Arduino, управления скоростью и направлением вращения двух двигателей постоянного тока и запуска вашего робота в кратчайшие сроки.

Давайте начнём!

Основы управления двигателем

Прежде чем изучать драйвер двигателя L298N, важно понять две ключевые концепции:

  • H-мост — позволяет управлять направлением вращения двигателя

  • PWM (широтно-импульсная модуляция) — помогает управлять скоростью двигателя постоянного тока

Управление направлением с помощью H-моста

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

H-мост — это специальная схема с четырьмя электронными переключателями, расположенными в форме буквы «H», с двигателем посередине.

Включая и выключая эти переключатели в определённом порядке, можно заставить электрический ток протекать через двигатель в одном или противоположном направлении. Этот умный приём позволяет управлять направлением вращения двигателя без необходимости физически менять провода.

Анимация ниже показывает, как работает H-мост.

Подключение модуля драйвера двигателя L298N к Arduino

Управление скоростью с помощью PWM (широтно-импульсной модуляции)

Когда на двигатель постоянного тока подаётся фиксированное напряжение, он вращается с постоянной скоростью. Если вы хотите изменить скорость, нужно изменить напряжение. Более высокое напряжение заставляет двигатель вращаться быстрее, а более низкое — медленнее.

Однако постоянное физическое изменение напряжения не очень практично. Вот тут и приходит на помощь PWM, или широтно-импульсная модуляция.

PWM — это умный способ управления средним количеством мощности, подаваемой на двигатель. Вместо подачи фиксированного напряжения PWM быстро включает и выключает напряжение очень короткими импульсами.

«Ширина» каждого включённого импульса, также называемая коэффициентом заполнения, определяет, как долго напряжение находится в состоянии «включено» в каждом цикле.

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

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

Изображение ниже показывает, как различные коэффициенты заполнения влияют на скорость двигателя.

Подключение модуля драйвера двигателя L298N к Arduino

Микросхема драйвера двигателя L298N

В центре модуля расположена большая чёрная микросхема с массивным радиатором — L298N.

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

Подключение модуля драйвера двигателя L298N к Arduino

В своей основе L298N имеет два отдельных H-моста. Помните, как H-мост помогает управлять направлением вращения двигателя постоянного тока? Поскольку в L298N два H-моста, он может управлять двумя разными двигателями постоянного тока одновременно. Вы даже можете объединить эти два H-моста для управления биполярным шаговым двигателем.

Питание

L298N довольно гибок в плане питания. Он может работать с широким диапазоном напряжений от 5V до 46V и обеспечивать до 2A непрерывного тока на канал, что позволяет управлять как небольшими любительскими двигателями, так и более крупными и мощными.

Тепловая защита

L298N также имеет встроенную тепловую защиту. Это означает, что если микросхема перегревается — например, из-за чрезмерного потребления тока двигателем или недостаточного охлаждения — L298N автоматически отключает свои выходы для предотвращения повреждения. Как только микросхема остывает до безопасной температуры, она автоматически возобновляет работу.

Технические характеристики

Вот технические характеристики:

Выходное напряжение двигателя

5V – 46V

Входное логическое напряжение

4.5V – 7V

Непрерывный ток на канал

2A

Максимальная рассеиваемая мощность

25W

Для получения дополнительной информации обратитесь к техническому описанию ниже.

Распиновка модуля драйвера двигателя L298N

Модуль L298N имеет 11 выводов.

Подключение модуля драйвера двигателя L298N к Arduino

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

Выводы питания

На модуле L298N есть два входных вывода питания: VS и VSS.

Подключение модуля драйвера двигателя L298N к Arduino

VS — это основной вход питания для двигателей. На многих модулях этот вывод обозначен как +12V, но на самом деле он может работать с широким диапазоном постоянного напряжения от 5V до 46V. Однако важно понимать, что напряжение, которое фактически получают ваши двигатели, будет немного ниже того, что вы подаёте на вывод VS. Это связано с тем, что внутренние транзисторы H-моста в L298N вызывают падение напряжения около 2V. Подробнее об этом падении напряжения и о том, какое напряжение следует подавать для работы двигателей на полной скорости, объясняется в соответствующем разделе.

VSS — это вход питания для внутренней логической схемы микросхемы. Для работы логической схемы необходимо стабильное напряжение 5V. Вы можете подать эти 5V одним из двух способов. Первый вариант — подключить внешний источник питания 5V непосредственно к выводу VSS. Второй вариант — использовать встроенный стабилизатор напряжения 5V на модуле, который берёт питание от входа двигателя (VS) и автоматически обеспечивает 5V для логических цепей. При использовании встроенного стабилизатора вам не нужно подключать что-либо к выводу VSS самостоятельно. Подробности об использовании этого стабилизатора и о том, когда подключать VSS напрямую, объясняются в соответствующем разделе.

GND — это общее заземление модуля. И источник питания двигателя, и ваш Arduino должны иметь общее заземление через этот вывод.

Выводы выхода двигателя

Это выводы, к которым непосредственно подключаются ваши двигатели постоянного тока.

Подключение модуля драйвера двигателя L298N к Arduino

Выводы OUT1 и OUT2 подключаются к первому двигателю (двигатель A), а выводы OUT3 и OUT4 — ко второму двигателю (двигатель B). К этим выводам можно подключить любой двигатель постоянного тока, работающий от 5 до 46 вольт.

Выводы управления направлением

Эти выводы управляют направлением вращения двигателей, включая и выключая внутренние переключатели H-моста:

Подключение модуля драйвера двигателя L298N к Arduino

Микросхема имеет по два вывода управления направлением для каждого двигателя. Выводы IN1 и IN2 управляют направлением вращения двигателя A, а выводы IN3 и IN4 — направлением вращения двигателя B.

Устанавливая различные комбинации сигналов HIGH или LOW на этих выводах, вы можете заставить двигатели вращаться вперёд, назад или остановиться. Таблица ниже показывает, как именно это работает:

Вход 1

Вход 2

Направление вращения

Low(0)

Low(0)

Двигатель ВЫКЛЮЧЕН

High(1)

Low(0)

Вперёд

Low(0)

High(1)

Назад

High(1)

High(1)

Двигатель ВЫКЛЮЧЕН

Выводы управления скоростью

Выводы ENA и ENB управляют скоростью вращения двигателей.

Подключение модуля драйвера двигателя L298N к Arduino

Фактически эти выводы работают как простые переключатели вкл/выкл. Когда вы подаёте HIGH на один из них, соответствующий двигатель включается и вращается на полной скорости. Когда подаёте LOW, двигатель полностью отключается и не вращается.

Но эти выводы могут делать больше, чем просто включать и выключать двигатели. Посылая PWM-сигнал (широтно-импульсная модуляция) на ENA или ENB, вы можете управлять скоростью каждого двигателя.

PWM работает путём очень быстрого включения и выключения двигателя — много раз в секунду. Скорость зависит от того, как долго двигатель остаётся включённым в каждом цикле (это называется коэффициентом заполнения). Если сигнал включён большую часть времени, двигатель вращается быстрее. Если он включён лишь на короткое время, двигатель вращается медленнее.

Модуль L298N обычно поставляется с перемычками на выводах ENA и ENB, которые подключают их напрямую к 5V. Это заставляет двигатели вращаться на полной скорости по умолчанию. Если вы хотите управлять скоростью двигателей через Arduino, вам нужно снять эти перемычки и подключить выводы ENA и ENB к выводам с поддержкой PWM на Arduino.

Падение напряжения L298N

Вы, возможно, знаете, что когда транзистор включён или находится в состоянии «насыщения», пропуская через себя ток, всегда происходит небольшая потеря напряжения на нём. L298N использует биполярные транзисторы (BJT) внутри своей схемы H-моста, которые известны заметным падением напряжения при прохождении тока.

Согласно техническому описанию, падение напряжения на L298N может составлять от примерно 1.8V до 3.2V при токе около 1 ампера и достигать почти 5V при токе 2 ампера.

Подключение модуля драйвера двигателя L298N к Arduino

Таким образом, в качестве общего правила можно предположить падение напряжения около 2V при типичном использовании.

Что это означает для ваших двигателей: если вы подадите 12V на вход питания двигателей (VS), ваши двигатели фактически получат приблизительно 10V. Вот почему ваши двигатели постоянного тока на 12V могут не работать на полной скорости при питании через L298N с напряжением ровно 12V.

Подключение модуля драйвера двигателя L298N к Arduino

Чтобы убедиться, что ваш двигатель работает на максимальной скорости, следует подавать напряжение на вход питания двигателя примерно на 2V выше, чем фактическое напряжение, необходимое двигателю. Например, если вы используете двигатель на 5V, нужно подать около 7V на клемму питания двигателя. Аналогично, если у вас двигатели на 12V, напряжение питания двигателя должно быть около 14V, чтобы они достигли полной скорости.

Встроенный стабилизатор 5V и перемычка

Модуль драйвера двигателя L298N оснащён встроенным стабилизатором напряжения 78M05. Назначение этого стабилизатора — брать питание от входа питания двигателя (подключённого к выводу VS) и преобразовывать его в стабильные 5V. Эти 5V затем используются для питания внутренней логической схемы микросхемы L298N, что означает, что вам не нужно подключать отдельный источник питания 5V к выводу VSS.

На модуле есть небольшая перемычка, позволяющая включить или отключить этот стабилизатор.

Подключение модуля драйвера двигателя L298N к Arduino

Когда перемычка установлена, стабилизатор 5V включён. В этом режиме стабилизатор автоматически питает внутреннюю логику микросхемы от входа питания двигателя, а вывод VSS становится выходом 5V. Этот выход может обеспечить ток до 0,5 ампера, чего обычно достаточно для питания Arduino или других небольших электронных компонентов.

Однако важно отметить, что встроенный стабилизатор 5V не рассчитан на входное напряжение выше 12V. Поэтому использовать эту функцию следует только при напряжении питания двигателя менее 12V. Если напряжение питания двигателя выше 12V, необходимо снять перемычку, чтобы предотвратить повреждение встроенного стабилизатора.

Вот принципиальная схема, которая поможет понять, как протекает ток при установленной перемычке стабилизатора.

Подключение модуля драйвера двигателя L298N к Arduino

Когда перемычка снята, стабилизатор 5V отключён, и теперь вывод VSS становится обязательным входом. Это означает, что вы должны подать 5V от внешнего источника питания для работы внутренней логической схемы микросхемы.

Подключение модуля драйвера двигателя L298N к Arduino

Схема подключения модуля драйвера двигателя L298N к Arduino

Теперь, когда мы знаем, как работает модуль L298N, можно приступить к его подключению к Arduino!

Начнём с подключения питания к двигателям. В этом эксперименте мы используем TT-двигатели, которые обычно применяются в двухколёсных роботах. Эти двигатели обычно хорошо работают при напряжении от 3V до 6V. Поскольку модуль L298N вызывает падение напряжения около 2V, мы подключим внешний источник питания 7V к клемме VS. Таким образом, наши двигатели получат необходимые им 5V.

Далее нам нужно обеспечить питание 5V для внутренней логической схемы L298N. Вместо использования отдельного источника питания мы воспользуемся встроенным стабилизатором 5V на модуле. Для этого просто оставьте перемычку стабилизатора 5V на месте. Таким образом, модуль будет брать 5V от источника питания двигателя.

Теперь подключим управляющие выводы. Модуль L298N имеет четыре входных вывода — IN1, IN2, IN3 и IN4 — которые используются для управления направлением вращения двигателей. Мы подключим их к цифровым выводам 8, 7, 5 и 4 на Arduino.

Для управления скоростью вращения двигателей мы будем использовать PWM (широтно-импульсную модуляцию). Для этого нужно снять маленькие перемычки с ENA и ENB и вместо этого подключить их к выводам Arduino с поддержкой PWM — выводам 9 и 3.

Наконец, подключите двигатели к выходным клеммам модуля L298N. Один двигатель подключается к клемме A (OUT1 и OUT2). Другой двигатель подключается к клемме B (OUT3 и OUT4). Не беспокойтесь о том, какой провод двигателя к какому выходу подключить — если двигатель вращается не в ту сторону, просто поменяйте провода, так как нет «правильного» или «неправильного» способа подключения.

Вот краткая справочная таблица подключений:

L298N Motor DriverArduino
GNDGND
ENA9
IN18
IN27
IN35
IN44
ENB3

Изображение ниже показывает полную схему подключения.

Подключение модуля драйвера двигателя L298N к Arduino

Пример кода Arduino

Вот простой скетч Arduino, который показывает, как управлять направлением и скоростью двух двигателей постоянного тока с помощью драйвера двигателя L298N и Arduino. Для этого скетча не нужны специальные библиотеки — он использует только базовые встроенные функции Arduino IDE.

Этот пример — отличный способ получить практический опыт использования L298N для управления скоростью и направлением двигателей. Как только вы это освоите, вы сможете легко создавать более сложные системы управления двигателями, такие как те, что используются в простых роботах или машинках на дистанционном управлении.

// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

void setup() {
  // Set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

void loop() {
  directionControl();
  delay(1000);
  speedControl();
  delay(1000);
}

// This function lets you control spinning direction of motors
void directionControl() {
  // Set motors to maximum speed
  digitalWrite(enA, HIGH);
  digitalWrite(enB, HIGH);

  // Turn on motor A & B
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  delay(2000);

  // Now change motor directions
  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
  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++) {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  }

  // Decelerate from maximum speed to zero
  for (int i = 255; i >= 0; --i) {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  }

  // Now turn off motors
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

Когда вы разгоняете или замедляете двигатель постоянного тока, вы можете услышать гудящий звук, особенно при низких значениях PWM. Не беспокойтесь — это совершенно нормально. Это происходит потому, что двигателям постоянного тока необходим определённый минимальный уровень напряжения для начала вращения, и при низких значениях PWM напряжение недостаточно для плавной работы двигателя.

Объяснение кода

В начале скетча мы определяем, какие выводы Arduino будут использоваться для управления двигателем A и двигателем B. Для двигателя A у нас есть вывод включения (позволяющий управлять скоростью через PWM) и два вывода для управления направлением. Аналогично, для двигателя B есть вывод включения и два вывода управления направлением.

// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;

// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

В функции setup() мы настраиваем все шесть выводов управления двигателями как выходы, поскольку мы отправляем сигналы от Arduino к L298N. Мы также убеждаемся, что оба двигателя выключены, устанавливая все выводы управления направлением в LOW. Это гарантирует, что двигатели не начнут внезапно вращаться при включении Arduino.

void setup() {
  // Set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

В функции loop() мы вызываем две пользовательские функции с задержкой в одну секунду между ними. Первая функция — directionControl(), а вторая — speedControl().

void loop() {
  directionControl();
  delay(1000);
  speedControl();
  delay(1000);
}

Давайте разберём, что делает каждая из этих функций.

Функция directionControl() демонстрирует, как управлять направлением вращения обоих двигателей. Сначала мы устанавливаем максимально возможную скорость для обоих двигателей, подавая HIGH на оба вывода включения. Затем мы отправляем необходимые сигналы на выводы управления направлением, чтобы заставить оба двигателя A и B вращаться вперёд. После двух секунд вращения в этом направлении мы меняем сигналы на выводах направления, что заставляет оба двигателя изменить направление вращения ещё на две секунды. Наконец, мы останавливаем двигатели, устанавливая все выводы управления направлением в LOW.

void directionControl() {
  // Set motors to maximum speed
  digitalWrite(enA, HIGH);
  digitalWrite(enB, HIGH);

  // Turn on motor A & B
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  delay(2000);

  // Now change motor directions
  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.

void speedControl() {
  // Turn on motors
  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++) {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  }

  // Decelerate from maximum speed to zero
  for (int i = 255; i >= 0; --i) {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  }

  // Now turn off motors
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}