Управление направлением и H-мост
Вперёд крутиться научились. А как назад? Ответ — в гениально простой схеме из четырёх переключателей под названием H-мост.
Чтобы мотор крутился в обе стороны, нужно уметь менять полярность на его выводах местами. Делает это H-мост — сердце любого драйвера моторов.
Сейчас разберём, как одно и то же колесо едет вперёд и назад, меняя лишь сигналы на двух пинах. Без этого нет ни машинки, ни робота, который умеет разворачиваться.
Идея H-моста
+V +V
| |
[S1] [S2] [S1]X X[S2]
| | | |
+--MOTOR-+ +--MOTOR---+
| | | |
[S3] [S4] X[S3] [S4]X
| | | |
GND GND GND GND
ВПЕРЁД: S1 и S4 замкнуты НАЗАД: S2 и S3 замкнуты
ток идёт слева-направо ток идёт справа-налево
Четыре «ключа» (транзистора) образуют букву H, мотор — перекладина. Замкнёшь одну диагональ (S1+S4) — ток течёт в одну сторону; другую (S2+S3) — в обратную. Микросхема L298N содержит готовый H-мост, тебе нужно лишь подать сигналы на два пина направления.
Код с L298N
const int IN1 = 7; // направление
const int IN2 = 8; // направление
const int ENA = 9; // скорость (ШИМ)
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENA, OUTPUT);
}
void forward(int speed) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, speed);
}
void backward(int speed) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, speed);
}
void stopMotor() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}
void loop() {
forward(200); delay(2000);
stopMotor(); delay(500);
backward(200); delay(2000);
stopMotor(); delay(500);
}
Как работает под капотом
IN1 и IN2 управляют диагоналями H-моста. IN1=HIGH, IN2=LOW — вперёд; наоборот — назад; оба LOW — стоп. Пин ENA с ШИМ задаёт скорость, открывая ключи «не до конца», а порциями. Критично важно: нельзя замыкать оба ключа одной стороны (например, S1 и S3 вместе) — это короткое замыкание питания через мост («сквозной ток»). Поэтому IN1 и IN2 никогда не ставят в HIGH одновременно.
# Та же логика на Python: сигналы IN1/IN2 -> поведение мотора
def motor_state(in1, in2):
if in1 and not in2:
return "ВПЕРЁД"
if in2 and not in1:
return "НАЗАД"
if not in1 and not in2:
return "СТОП (свободный ход)"
return "ОПАСНО: короткое замыкание моста!"
for in1, in2 in [(1,0),(0,1),(0,0),(1,1)]:
print(f"IN1={in1} IN2={in2} ->", motor_state(in1, in2))
Запусти — комбинация (1,1) подсвечивается как опасная. Этот случай драйвер обычно блокирует, но понимать его нужно.
Частые ошибки
- Ставят IN1 и IN2 в HIGH одновременно. Логически — короткое замыкание моста. Всегда ровно один HIGH.
- Меняют направление на полном ходу резко. Бросок тока. Лучше: стоп → пауза → реверс.
- Забыли подать питание на ENA или снять перемычку — мотор не крутится, хотя направление задано.
Best practices
- Вынеси forward / backward / stop в отдельные функции — код машинки станет читаемым.
- Перед сменой направления делай короткий стоп с паузой — бережёт мотор и драйвер.
- Для двух моторов (левый и правый) повтори схему дважды — и получишь поворотную платформу.
Машинка: два мотора и повороты
Как только ты умеешь крутить один мотор вперёд и назад, до колёсного робота остаётся один шаг: поставить два мотора — левый и правый — и управлять ими независимо. Драйвер L298N как раз рассчитан на два мотора: у него два набора входов (IN1/IN2 и IN3/IN4) и два ENA/ENB для скорости. Дальше всё сводится к простой логике поворотов, и её удобно прогнать в голове или на бумаге, прежде чем заливать в железо.
Логика движения такая: оба вперёд — едем прямо; оба назад — задний ход; левый вперёд, правый назад — разворот на месте вправо; разные скорости на колёсах — плавный поворот по дуге. Это называется дифференциальное управление, и так ездят почти все простые роботы и даже гусеничная техника. Добавь к этому ультразвуковой датчик спереди — и машинка сможет сама объезжать препятствия. Все кирпичики у тебя уже есть; остаётся собрать их в одну программу.
Итоги
H-мост — четыре ключа буквой H; замыкая разные диагонали, он гонит ток мотора туда или обратно. IN1/IN2 задают направление (никогда оба HIGH!), ENA — скорость. Ты управляешь моторами по-взрослому. Пора собрать всё в финальном разделе — своём устройстве со связью с компьютером.