Моторы постоянного тока и драйвер
Кажется логичным: подключил мотор к пину — и он крутится. На деле так ты убьёшь 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-мотор тянет ток, неподъёмный для пина, поэтому между ними стоит драйвер: слабый сигнал управляет большим током. ШИМ задаёт скорость, защитный диод гасит всплески. Осталось понять, как менять направление вращения — вперёд и назад.