Мастерство управления двигателями через L298N: схема, PWM, H-мост и код для Arduino
Принципы управления DC-двигателем
Скорость — ШИМ (PWM): быстрое включение/выключение питания, среднее напряжение зависит от скважности. Arduino выдаёт ШИМ на транзистор/МОПТ, который коммутирует мощную нагрузку.



Направление — H-мост: 4 ключа, изменение полярности на двигателе. Комбинация двух ключей задаёт направление тока.

L298N — двойной H-мост с входом EN для ШИМ. Два канала, 5–35 В, до 2 А на канал. На плате: клеммники моторов, питание (VCC, GND, 5V), джампер 5V стабилизатора (если моторы ≤12 В — 5V выход для Arduino, иначе джампер снять, подать 5В отдельно). Напряжение на моторах на ~2 В ниже входного.



- EN A/B — включение/ШИМ скорости (джампер = макс. скорость, PWM = регуляция, GND = выкл).
- IN1/IN2 — направление мотора A (LOW/HIGH = вперёд, HIGH/LOW = назад, одинаково = стоп).
- IN3/IN4 — аналогично для мотора B.
Пример 1: потенциометр скорости + кнопка реверса

/* DC Motor Control - PWM | H-Bridge | L298N - Example 01 */
#define enA 9
#define in1 6
#define in2 7
#define button 4
int rotDirection = 0;
bool pressed = false;
void setup() {
pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(button, INPUT);
digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // начальное направление
}
void loop() {
int potValue = analogRead(A0);
int pwmOutput = map(potValue, 0, 1023, 0, 255);
analogWrite(enA, pwmOutput);
// Антидребезг кнопки
if (digitalRead(button)) { pressed = !pressed; }
while (digitalRead(button)); delay(20);
if (pressed && rotDirection==0) { digitalWrite(in1,HIGH); digitalWrite(in2,LOW); rotDirection=1; delay(20); }
if (!pressed && rotDirection==1) { digitalWrite(in1,LOW); digitalWrite(in2,HIGH); rotDirection=0; delay(20); }
}
Пример 2: Arduino Robot Car (джойстик + два мотора)


Джойстик: два потенциометра на A0 (X), A1 (Y). Центр ~512. Мёртвая зона 470–550.
Логика управления
- Y < 470 — назад: IN1=HIGH, IN2=LOW; IN3=HIGH, IN4=LOW. Скорость = map(Y, 470→0, 0→255).
- Y > 550 — вперёд: IN1=LOW, IN2=HIGH; IN3=LOW, IN4=HIGH. Скорость = map(Y, 550→1023, 0→255).
- X < 470 — влево: левее медленнее, правее быстрее.
xMapped = map(X,470→0,0→255); motorA -= xMapped; motorB += xMapped(ограничение 0–255). - X > 550 — вправо: симметрично.
- Мёртвая зона X и Y — моторы стоп.
- Минимальный PWM 70 (защита от гудения).
Полный код робота
/* Arduino Robot Car Control using L298N */
#define enA 9; #define in1 4; #define in2 5;
#define enB 10; #define in3 6; #define in4 7;
int motorSpeedA=0, motorSpeedB=0;
void setup() {
pinMode(enA,OUTPUT); pinMode(enB,OUTPUT);
pinMode(in1,OUTPUT); pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT); pinMode(in4,OUTPUT);
}
void loop() {
int xAxis = analogRead(A0);
int yAxis = analogRead(A1);
// Y-axis: forward/backward
if (yAxis < 470) {
digitalWrite(in1,HIGH); digitalWrite(in2,LOW);
digitalWrite(in3,HIGH); digitalWrite(in4,LOW);
motorSpeedA = map(yAxis,470,0,0,255);
motorSpeedB = map(yAxis,470,0,0,255);
} else if (yAxis > 550) {
digitalWrite(in1,LOW); digitalWrite(in2,HIGH);
digitalWrite(in3,LOW); digitalWrite(in4,HIGH);
motorSpeedA = map(yAxis,550,1023,0,255);
motorSpeedB = map(yAxis,550,1023,0,255);
} else { motorSpeedA=0; motorSpeedB=0; }
// X-axis: left/right
if (xAxis < 470) {
int xMapped = map(xAxis,470,0,0,255);
motorSpeedA -= xMapped; motorSpeedB += xMapped;
if (motorSpeedA<0) motorSpeedA=0; if (motorSpeedB>255) motorSpeedB=255;
}
if (xAxis > 550) {
int xMapped = map(xAxis,550,1023,0,255);
motorSpeedA += xMapped; motorSpeedB -= xMapped;
if (motorSpeedA>255) motorSpeedA=255; if (motorSpeedB<0) motorSpeedB=0;
}
// Anti-buzzing
if (motorSpeedA<70) motorSpeedA=0;
if (motorSpeedB<70) motorSpeedB=0;
analogWrite(enA, motorSpeedA);
analogWrite(enB, motorSpeedB);
}
Перспективы
В следующем уроке этот робот получим беспроводное управление (Bluetooth, NRF24L01, HC-12). Все схемы, коды и файлы проектов открыты.
Производственный процесс
- Создание универсального ИК-пульта на Arduino: пошаговое руководство
- Автономный линий-следующий робот на Arduino UNO
- Подключение Arduino Mega к GPS-модулю NEO‑6M: пошаговое руководство
- Учебный стенд Arduino Mega 2560: сенсоры, моторы, дисплеи и собственная PCB
- Использование термистора: пошаговое руководство для Arduino
- DIY манипулятор, управляемый жестами руки: пошаговая сборка на Arduino
- Высокопроизводительная библиотека Arduino для управления двигателями постоянного тока
- Мини CNC 2D плоттер из старых DVD-приводов на L293D Motor Shield
- Мозг-компьютерные интерфейсы: восстановление связи мысли и действия
- Моторы прямого привода: преимущества, типы и принципы работы