Моторы постоянного тока и драйвер

Кажется логичным: подключил мотор к пину — и он крутится. На деле так ты убьёшь Arduino за секунды. Разберёмся почему и как правильно.

Мотор постоянного тока (DC) крутится непрерывно и тянет большой ток — в десятки раз больше, чем может дать пин. Между Arduino и мотором всегда стоит посредник: драйвер.

Сейчас разберём, как заставить колесо крутиться и менять скорость через ШИМ. Это сердце любого робота на колёсах.

Почему нельзя напрямую

  ПЛОХО:  пин 9 ----[ МОТОР ]---- GND      <- ток мотора >> пин выдержит!

  Пин Arduino даёт максимум ~20-40 мА.
  Мотор хочет 200-1000 мА. Результат: сгоревший пин.

Пин — это слабый «командир», а не «силач». Он может скомандовать, но не протолкнуть большой ток. Силу даёт драйвер.

Правильно: драйвер как посредник

  Внешнее питание (+) ----------------+
                                      |
                                  [ МОТОР ]
                                      |
  пин 9 (команда) -> [ ДРАЙВЕР ] ->---+
                          |
  GND общий --------------+----------- GND Arduino

  Arduino даёт слабый сигнал -> драйвер открывает путь
  большому току от внешнего питания к мотору.

Драйвер — это транзистор (для одного направления) или микросхема вроде L298N / DRV8833 (для управления скоростью и направлением). Слабый сигнал с пина управляет мощным током, как кран управляет потоком воды.

Код: скорость через ШИМ

const int MOTOR = 9;   // на вход драйвера (ШИМ-пин)

void setup() {
  pinMode(MOTOR, OUTPUT);
}

void loop() {
  analogWrite(MOTOR, 0);    delay(1000);  // стоп
  analogWrite(MOTOR, 128);  delay(2000);  // полскорости
  analogWrite(MOTOR, 255);  delay(2000);  // полный газ
}

Как работает под капотом

Транзистор в драйвере — это электронный кран: слабый ток на «управляющую» ножку открывает путь большому току через «силовые». ШИМ с пина (0–255) быстро открывает-закрывает этот кран — и мотор получает то больше, то меньше энергии, меняя скорость (тот же приём, что с яркостью светодиода!). Ещё в схеме обязателен защитный диод: когда мотор выключается, его обмотка выбрасывает всплеск напряжения, и диод гасит этот удар, спасая транзистор.

# Та же логика на Python: ШИМ-значение -> процент скорости мотора
def motor_speed(pwm):
    pwm = max(0, min(255, pwm))
    percent = round(pwm / 255 * 100)
    if percent == 0:
        return "0% (стоп)"
    return f"{percent}% скорости"

for pwm in (0, 64, 128, 200, 255):
    print("analogWrite", pwm, "->", motor_speed(pwm))

Частые ошибки

  • Мотор прямо на пин. Главная и фатальная ошибка — сгорает пин или вся плата.
  • Нет общей земли. Драйвер и Arduino должны делить GND, иначе сигнал «не доходит».
  • Забыли защитный диод в самодельной схеме на транзисторе — всплеск напряжения пробивает транзистор.

Best practices

  • Используй готовый модуль-драйвер (L298N, L9110, DRV8833) — в нём уже есть защита и управление направлением.
  • Питай мотор от отдельного источника, а земли соединяй.
  • Регулируй скорость тем же analogWrite, что и яркость — принцип ШИМ универсален.

Транзистор как усилитель команды

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

Из этого вытекает правило общей земли, на котором спотыкаются почти все новички. Чтобы транзистор (и любой драйвер) понимал команду с пина, у Arduino и у силового питания должна быть единая точка отсчёта — общий GND. Если земли не соединены, сигнал «не с чем сравнить», и схема либо не работает, либо ведёт себя хаотично. Запомни как мантру: где есть отдельное питание для мотора — там обязательно соединяй его минус с минусом Arduino.

Итоги

DC-мотор тянет ток, неподъёмный для пина, поэтому между ними стоит драйвер: слабый сигнал управляет большим током. ШИМ задаёт скорость, защитный диод гасит всплески. Осталось понять, как менять направление вращения — вперёд и назад.

Проверьте себя
1. Почему DC-мотор нельзя подключать напрямую к пину Arduino?
AОн не поместится
BМотор тянет ток в десятки раз больше, чем выдаёт пин
CПин слишком быстрый
DМотору нужен аналоговый пин
2. Зачем в схеме мотора нужен защитный диод?
AДля красоты
BГасит всплеск напряжения от обмотки при выключении
CПовышает скорость
DИзмеряет ток