Компоненты · 4 мин чтения

Управление DC-мотором через L298N: скорость и направление с Arduino

Как работает драйвер моторов L298N? Идея H-моста, пины ENA, IN1 и IN2, перемычка 5V и подключение питания, скорость через PWM, смена направления, код машинки-робота на двух моторах, ESP32 и Pico.

Моторы постоянного тока (DC-моторы) — самые распространённые моторы: они крутят вентиляторы, колёса роботов, водяные насосы и игрушечные машинки. Но подключать мотор прямо к пину Arduino нельзя: он потребляет гораздо больше тока, чем способен дать пин, а чтобы сменить направление вращения, нужно поменять полярность. Драйвер моторов L298N решает обе проблемы сразу: он независимо вращает два DC-мотора вперёд и назад и задаёт их скорость через PWM. Он есть почти в каждом проекте машинки-робота.

Двухканальный драйвер моторов L298N
Драйвер моторов L298N: под чёрным радиатором стоит микросхема L298N с двумя H-мостами; клеммы моторов по бокам, а пины питания и управления — спереди.

Как работает DC-мотор и зачем ему драйвер?

Подай напряжение на два вывода DC-мотора — и он закрутится; поменяй полярность — закрутится в другую сторону; уменьши напряжение — замедлится. Даже маленький игрушечный мотор во время работы потребляет сотни миллиампер, а при старте или остановке под нагрузкой — больше 1 ампера. А поскольку мотор — это катушка, при выключении он создаёт выбросы обратного напряжения. Пин Arduino может дать максимум 20–40 mA и не защищён от таких выбросов; прямое подключение мотора сжигает пин и может даже повредить плату.

Что такое H-мост?

Способ вращать мотор в обе стороны — H-мост: четыре электронных ключа, расположенные вокруг мотора в форме буквы «H». Когда замыкаются два ключа по диагонали, ток идёт через мотор в одну сторону; когда замыкается другая диагональная пара — в другую. В микросхеме L298N два таких H-моста, поэтому она может независимо управлять двумя моторами. Каждый мотор использует два пина направления (IN1 и IN2) и один пин скорости (ENA):

IN1IN2ENAЧто делает мотор
HIGHLOWHIGH или PWMВращается вперёд
LOWHIGHHIGH или PWMВращается назад
HIGHHIGHHIGHТормозит и быстро останавливается
ЛюбойЛюбойLOWВращается свободно и замедляется сам

Характеристики L298N

ПараметрЗначение
Напряжение питания моторов5–35 V (максимум 12 V с установленной перемычкой 5V)
Ток на канал2 A длительно, 3 A пиковый
Логическое напряжение5 V (входы распознают и сигнал 3,3 V)
Падение напряженияОколо 1,5–3 V (на мотор приходит на столько меньше)
Какие моторы тянет2 DC-мотора или 1 биполярный шаговый двигатель
ЗащитаЗащитные диоды на плате
DC-мотор с редуктором и колесо
Жёлтый DC-мотор с редуктором и колесо для машинок-роботов: редуктор снижает скорость и увеличивает крутящий момент; работает от 3–6 V.

Пины L298N и подключение питания

Пин или клеммаНазначение
OUT1, OUT2Два вывода мотора A
OUT3, OUT4Два вывода мотора B
12V (VS)Питание моторов: плюс батареи или адаптера
GNDОбщая земля: сюда идут минус батареи и GND Arduino
5VВыход 5 V с установленной перемычкой 5V, вход питания логики со снятой
ENA, ENBВходы скорости (PWM); с установленными перемычками мотор всегда работает на полной скорости
IN1, IN2, IN3, IN4Входы направления
Минус батареи, GND драйвера L298N и GND Arduino обязательно соединяются вместе; без общей земли управляющие сигналы ничего не значат. Если питание моторов выше 12 V, сними на плате перемычку 5V и подай на пин 5V отдельные 5 V. Никогда не питай моторы от пина 5V Arduino.

Вращаем мотор вперёд, назад и с разной скоростью

Сначала сними перемычку с ENA и подключи ENA к пину Arduino D9, IN1 — к D8, а IN2 — к D7. Мотор подключи к OUT1 и OUT2, а сборку из 2 × 18650 (7,4 V) или 4–6 батареек AA — к клеммам 12V и GND; GND также соедини с GND Arduino. Функция motor() ниже принимает значение от -255 до 255: положительное — вперёд, отрицательное — назад, ноль — тормоз. Идея управления скоростью объяснена в статье Что такое PWM?

C++ (Arduino IDE)
1const int ENA = 9;    // hız (PWM) / speed (PWM)
2const int IN1 = 8;
3const int IN2 = 7;
4
5void motor(int speed) {              // -255 … 255
6  if (speed == 0) {                  // fren / brake
7    digitalWrite(IN1, HIGH);
8    digitalWrite(IN2, HIGH);
9    analogWrite(ENA, 255);
10    return;
11  }
12  digitalWrite(IN1, speed > 0);      // ileri ya da geri / forward or backward
13  digitalWrite(IN2, speed < 0);
14  analogWrite(ENA, abs(speed));
15}
16
17void setup() {
18  pinMode(ENA, OUTPUT);
19  pinMode(IN1, OUTPUT);
20  pinMode(IN2, OUTPUT);
21}
22
23void loop() {
24  motor(200);   delay(2000);   // ileri / forward
25  motor(0);     delay(500);    // dur / stop
26  motor(-120);  delay(2000);   // yavaşça geri / slowly backward
27  motor(0);     delay(500);
28}
Большинство моторов при малых значениях PWM гудят, а не вращаются; чтобы тронуться, им обычно нужно значение около 80–120. Если ненадолго остановить мотор перед сменой направления и наращивать скорость постепенно, а не сразу, это снижает броски тока и бережёт шестерни.

Машинка-робот на двух моторах: вперёд, назад, влево и вправо

У машинок-роботов нет руля: они поворачивают, вращая два колеса с разной скоростью и в разные стороны. Если оба мотора крутятся вперёд, машинка едет прямо; если левый крутится назад, а правый вперёд, машинка разворачивается влево на месте. Функция drive() ниже принимает скорость каждого мотора отдельно, от -255 до 255:

C++ (Arduino IDE)
1// Sol motor / left motor: ENA=9, IN1=8, IN2=7 — Sağ motor / right motor: ENB=10, IN3=5, IN4=4
2const int ENA = 9, IN1 = 8, IN2 = 7;
3const int ENB = 10, IN3 = 5, IN4 = 4;
4
5void drive(int left, int right) {            // her biri -255 … 255 / each -255 … 255
6  digitalWrite(IN1, left >= 0);  digitalWrite(IN2, left < 0);
7  digitalWrite(IN3, right >= 0); digitalWrite(IN4, right < 0);
8  analogWrite(ENA, abs(left));
9  analogWrite(ENB, abs(right));
10}
11
12void setup() {
13  int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
14  for (int p : pins) pinMode(p, OUTPUT);
15}
16
17void loop() {
18  drive(200, 200);   delay(1500);   // ileri / forward
19  drive(-200, 200);  delay(600);    // sola dön / turn left
20  drive(200, -200);  delay(600);    // sağa dön / turn right
21  drive(-180, -180); delay(1000);   // geri / backward
22  drive(0, 0);       delay(1000);   // dur / stop
23}

Добавь спереди машинки датчик расстояния — и получится робот, который останавливается и поворачивает, увидев препятствие; про датчик читай в статье Датчик расстояния HC-SR04. Если на Uno используется библиотека Servo, будь внимательнее: она отключает PWM на пинах 9 и 10, поэтому перенеси ENA и ENB на пины 5 и 6.

L298N с ESP32 и Raspberry Pi Pico

Входы L298N считают HIGH всё, что выше примерно 2,3 V, поэтому напрямую работают с сигналами 3,3 V от ESP32 и Pico; питание логики платы при этом должно быть 5 V. На ESP32 можно использовать тот же код Arduino, взяв для ENA и ENB пины с поддержкой PWM (например, GPIO 25 и 26); пины 34–39 работать на выход не умеют. На Pico с MicroPython управление одним мотором выглядит так:

MicroPython
1from machine import Pin, PWM
2import time
3
4ena = PWM(Pin(15), freq=1000)
5in1 = Pin(14, Pin.OUT)
6in2 = Pin(13, Pin.OUT)
7
8def motor(speed):                   # -100 … 100
9    in1.value(speed > 0)
10    in2.value(speed < 0)
11    ena.duty_u16(int(abs(speed) * 655.35))
12
13while True:
14    motor(80);  time.sleep(2)       # ileri / forward
15    motor(0);   time.sleep(0.5)     # dur / stop
16    motor(-50); time.sleep(2)       # geri / backward

L298N, TB6612FNG или MOSFET?

ДрайверПлюсыМинусыЛучше всего для
L298NДешёвый, надёжный, 2 A на каналТеряет около 2 V, греется, большойХобби-роботов, моторов на 6–12 V
TB6612FNGМаленький, эффективный (MOSFET), совместим с 3,3 V1,2 A длительно, максимум 13,5 VНебольших роботов на батареях
L9110SОчень маленький и дешёвыйОколо 800 mA на каналМини-моторов
Одиночный MOSFET (например, IRLZ44N)Очень эффективный, большой токТолько одно направлениеВентиляторов, насосов, светодиодных лент

Если мотор нужно только включать и выключать, подойдёт и реле, но регулировать скорость оно не умеет; мы сравнили их в статье Что такое модуль реле? Подобрать подходящий транзистор или MOSFET поможет утилита Транзисторы.

Идеи проектов с L298N

  • Робот, объезжающий препятствия: машинка, которая видит препятствия через HC-SR04 и меняет направление.
  • Машинка с управлением по Bluetooth: робот, которым управляешь из приложения на телефоне через HC-05.
  • Машинка с джойстиком: преврати две оси джойстика в скорости двух моторов; подробности в статье Модуль джойстика.
  • Робот, следующий по линии: машинка, которая едет по чёрной линии на полу с помощью инфракрасных датчиков.
  • Автоматическая штора: моторизованная система, которая открывает штору утром, когда становится светло, и закрывает вечером.
  • Конвейерная лента: маленький конвейер, скорость которого задаётся потенциометром.

Частые ошибки и как их исправить

  • Светодиод на плате горит, а мотор не вращается: земли не объединены, перемычка ENA снята, но пин не подключён, или значение PWM слишком маленькое.
  • Arduino перезагружается, когда работает мотор: мотор и Arduino делят слабый источник питания; питай их отдельно и припаяй конденсатор 100 nF параллельно выводам мотора.
  • Мотор очень медленный и слабый: L298N «съедает» около 2 V; подними напряжение батареи (например, 2 × 18650) или возьми более эффективный драйвер.
  • Мотор вращается только в одну сторону: один из пинов IN не подключён, или код записывает одинаковые значения для обоих направлений.
  • L298N сильно греется: мотор потребляет слишком большой ток; убедись, что радиатор ничем не закрыт, и при необходимости возьми драйвер помощнее.
  • Батарейка-«крона» (PP3) на 9 V: она не может отдать большой ток и быстро садится; используй аккумуляторы 18650 или сборку из AA.

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

Частые вопросы

Сколькими моторами может управлять L298N?

В L298N два H-моста, поэтому он может независимо управлять двумя DC-моторами — вперёд и назад и с разной скоростью. Задействовав оба канала вместе, он также может управлять одним биполярным шаговым двигателем.

Зачем нужна перемычка 5V на L298N?

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

Какую батарею подключать к L298N?

Для небольших моторов на 6–9 V хорошо подходят 2 литиевых аккумулятора 18650 (7,4 V) или 6 батареек AA (9 V). L298N теряет около 2 V, поэтому выбирай питание немного выше номинального напряжения мотора. Батарейки-«кроны» (PP3) на 9 V не дают достаточного тока для моторов.

Зачем снимать перемычку ENA?

Когда перемычка на ENA установлена, мотор всегда работает на полной скорости. Чтобы регулировать скорость, сними перемычку и подключи пин ENA к одному из PWM-пинов Arduino; тогда скорость можно задавать от 0 до 255 через analogWrite.

Почему мотор не вращается на малой скорости?

Мотору нужно определённое минимальное напряжение, чтобы преодолеть трение и тронуться, а падение напряжения на L298N это усложняет. Обычно, когда значение PWM опускается ниже 80–120, мотор только гудит. Задай в коде минимальную скорость или используй источник с более высоким напряжением.

Работает ли L298N с ESP32 и Raspberry Pi Pico?

Да. Входные пины L298N распознают сигнал 3,3 V как HIGH, поэтому его можно подключать прямо к ESP32 и Pico. Логическую часть платы всё равно нужно питать от 5 V, а все земли должны быть общими.

Все проекты
Машинка на L298N с управлением по Bluetooth
#80Продвинутый
Premium

Машинка на L298N с управлением по Bluetooth

Преврати телефон в пульт и управляй своей машинкой-роботом. Arduino получает команды из приложения-пульта на телефоне через Bluetooth-модуль и вращает колёса через драйвер моторов; машинка едет вперёд

5.0(38)
65
Робот, объезжающий препятствия
#81Продвинутый
Premium

Робот, объезжающий препятствия

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

5.0(38)
49
Управление сервоприводом джойстиком
#60Средний
Premium

Управление сервоприводом джойстиком

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

4.7(42)
58
Сервопривод на ESP32 (управление потенциометром)
#118Средний
Premium

Сервопривод на ESP32 (управление потенциометром)

В этом проекте сервопривод SG90 управляется потенциометром. Угол сервопривода задаётся сопоставлением аналогового значения потенциометра с диапазоном 0–180 градусов. Библиотека ESP32Servo формирует сигналы сервопривода на подходящих выходных пинах GPIO у ESP32; этот проект использует GPIO 18. Это базовый способ управления для роборук, подвесов камер и механизмов автоматических дверей.

4.3(29)
42
Управление светодиодами джойстиком
#59Средний
Premium

Управление светодиодами джойстиком

Наклони рычажок джойстика до упора в любую сторону, и загорится светодиод этого направления: вправо, влево, вверх и вниз — четыре разных цвета. Отпусти рычажок, он вернётся в центр, и все светодиоды п

4.7(50)
67
Ультразвуковой датчик расстояния HC-SR04 на ESP32
#116Средний

Ультразвуковой датчик расстояния HC-SR04 на ESP32

Ультразвуковой датчик HC-SR04 вычисляет расстояние по времени, за которое испущенная им звуковая волна отражается от предмета и возвращается (Time of Flight). В этом проекте ESP32 подаёт импульс 10 микросекунд на пин TRIG датчика, а длительность эха читает с пина ECHO через pulseIn(). Вычисленное расстояние в сантиметрах выводится на I2C LCD 16x2. HC-SR04 работает от 5V, поэтому на пине ECHO нужен делитель напряжения.

4.9(28)
45
Парктроник на ESP32 (HC-SR04 + шкала из 5 светодиодов + зуммер + OLED)
#142Продвинутый
Premium

Парктроник на ESP32 (HC-SR04 + шкала из 5 светодиодов + зуммер + OLED)

ESP32-версия автомобильного парктроника! Ультразвуковой датчик HC-SR04 измеряет расстояние до предмета перед ним. По мере уменьшения расстояния шкала из 5 светодиодов заполняется (зелёный → жёлтый → красный), а интервал сигналов зуммера сокращается. Когда предмет совсем близко (меньше 10 см), звучит непрерывная тревога и горят все светодиоды. OLED SSD1306 показывает расстояние в см крупным шрифтом и сообщение состояния (STOP / CAUTION / CLOSE / STOP! / DANGER).

0.0(0)
14
Измерение расстояния HC-SR04 (вывод в порт)
#27Новичок

Измерение расстояния HC-SR04 (вывод в порт)

Датчик HC-SR04 работает совсем как летучая мышь, которая находит дорогу в темноте: он посылает звук, которого ты не слышишь, слушает эхо и измеряет, насколько далеко предмет перед ним. Arduino каждые

4.6(46)
71