Управление DC-мотором через L298N: скорость и направление с Arduino
Как работает драйвер моторов L298N? Идея H-моста, пины ENA, IN1 и IN2, перемычка 5V и подключение питания, скорость через PWM, смена направления, код машинки-робота на двух моторах, ESP32 и Pico.
Моторы постоянного тока (DC-моторы) — самые распространённые моторы: они крутят вентиляторы, колёса роботов, водяные насосы и игрушечные машинки. Но подключать мотор прямо к пину Arduino нельзя: он потребляет гораздо больше тока, чем способен дать пин, а чтобы сменить направление вращения, нужно поменять полярность. Драйвер моторов L298N решает обе проблемы сразу: он независимо вращает два DC-мотора вперёд и назад и задаёт их скорость через PWM. Он есть почти в каждом проекте машинки-робота.

Как работает DC-мотор и зачем ему драйвер?
Подай напряжение на два вывода DC-мотора — и он закрутится; поменяй полярность — закрутится в другую сторону; уменьши напряжение — замедлится. Даже маленький игрушечный мотор во время работы потребляет сотни миллиампер, а при старте или остановке под нагрузкой — больше 1 ампера. А поскольку мотор — это катушка, при выключении он создаёт выбросы обратного напряжения. Пин Arduino может дать максимум 20–40 mA и не защищён от таких выбросов; прямое подключение мотора сжигает пин и может даже повредить плату.
Что такое H-мост?
Способ вращать мотор в обе стороны — H-мост: четыре электронных ключа, расположенные вокруг мотора в форме буквы «H». Когда замыкаются два ключа по диагонали, ток идёт через мотор в одну сторону; когда замыкается другая диагональная пара — в другую. В микросхеме L298N два таких H-моста, поэтому она может независимо управлять двумя моторами. Каждый мотор использует два пина направления (IN1 и IN2) и один пин скорости (ENA):
| IN1 | IN2 | ENA | Что делает мотор |
|---|---|---|---|
| HIGH | LOW | HIGH или PWM | Вращается вперёд |
| LOW | HIGH | HIGH или PWM | Вращается назад |
| HIGH | HIGH | HIGH | Тормозит и быстро останавливается |
| Любой | Любой | LOW | Вращается свободно и замедляется сам |
Характеристики L298N
| Параметр | Значение |
|---|---|
| Напряжение питания моторов | 5–35 V (максимум 12 V с установленной перемычкой 5V) |
| Ток на канал | 2 A длительно, 3 A пиковый |
| Логическое напряжение | 5 V (входы распознают и сигнал 3,3 V) |
| Падение напряжения | Около 1,5–3 V (на мотор приходит на столько меньше) |
| Какие моторы тянет | 2 DC-мотора или 1 биполярный шаговый двигатель |
| Защита | Защитные диоды на плате |

Пины L298N и подключение питания
| Пин или клемма | Назначение |
|---|---|
| OUT1, OUT2 | Два вывода мотора A |
| OUT3, OUT4 | Два вывода мотора B |
| 12V (VS) | Питание моторов: плюс батареи или адаптера |
| GND | Общая земля: сюда идут минус батареи и GND Arduino |
| 5V | Выход 5 V с установленной перемычкой 5V, вход питания логики со снятой |
| ENA, ENB | Входы скорости (PWM); с установленными перемычками мотор всегда работает на полной скорости |
| IN1, IN2, IN3, IN4 | Входы направления |
Вращаем мотор вперёд, назад и с разной скоростью
Сначала сними перемычку с 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?
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}Машинка-робот на двух моторах: вперёд, назад, влево и вправо
У машинок-роботов нет руля: они поворачивают, вращая два колеса с разной скоростью и в разные стороны. Если оба мотора крутятся вперёд, машинка едет прямо; если левый крутится назад, а правый вперёд, машинка разворачивается влево на месте. Функция drive() ниже принимает скорость каждого мотора отдельно, от -255 до 255:
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 управление одним мотором выглядит так:
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 / backwardL298N, TB6612FNG или MOSFET?
| Драйвер | Плюсы | Минусы | Лучше всего для |
|---|---|---|---|
| L298N | Дешёвый, надёжный, 2 A на канал | Теряет около 2 V, греется, большой | Хобби-роботов, моторов на 6–12 V |
| TB6612FNG | Маленький, эффективный (MOSFET), совместим с 3,3 V | 1,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
Преврати телефон в пульт и управляй своей машинкой-роботом. Arduino получает команды из приложения-пульта на телефоне через Bluetooth-модуль и вращает колёса через драйвер моторов; машинка едет вперёд

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

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

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

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

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

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

Измерение расстояния HC-SR04 (вывод в порт)
Датчик HC-SR04 работает совсем как летучая мышь, которая находит дорогу в темноте: он посылает звук, которого ты не слышишь, слушает эхо и измеряет, насколько далеко предмет перед ним. Arduino каждые
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

