Курс Arduino с нуля · Движение

Урок 23. Мотор и транзистор: настольный вентилятор

Мотор просит слишком много тока, чтобы включать его напрямую. Ставим транзистор и диод, разбираемся зачем они нужны и собираем вентилятор с четырьмя скоростями.

Урок 23 из 31⏱ примерно 55 минутОбновлено: 27 июля 2026

Что понадобится

  • Плата Uno из набора
  • Кабель USB
  • Макетная плата
  • Электромотор
  • Транзистор IRFZ24
  • Диод Шоттки 1N5818
  • Резистор 470 Ом
  • Резистор 10 кОм
  • Потенциометр 10 кОм
  • Тактовая кнопка
  • 8 проводов «папа-папа»

Все детали есть в обучающем наборе, по которому идёт курс.

Сервопривод из прошлого урока умеет поворачиваться на угол. Обычный мотор так не умеет — зато он крутится быстро и без остановки. Из него получаются вентиляторы, колёса, мешалки и всё, что должно вертеться.

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

Мотор из набора

Это самый простой электромотор: цилиндрик с валом и двумя проводами. Внутри — магниты и катушки. Подали напряжение — вал закрутился, сняли — остановился.

Валкрутится очень быстроКорпусвнутри магниты и катушкидва проводаполярности нетПоменяете провода местами — мотор просто закрутится в другую сторону.Испортить его этим нельзя.
У мотора нет ни «плюса», ни «минуса»: поменяете провода местами — он закрутится в другую сторону, вот и всё.

Почему мотор нельзя подключить напрямую

Дело в токе. Светодиод берёт около 20 миллиампер — вывод платы такое отдаёт спокойно. Мотор просит в десять–двадцать раз больше, а в первый миг, пока вал стоит, — ещё больше.

Сколько тока кто проситСветодиод20 мАМотор200–400 мА, а в первый миг ещё большевывод платы стольконе отдаст — сгоритВывод платыслабый сигналТранзисторкран: сам маленький, а держит многоМоторбольшой ток от 5VТок к мотору идёт не через вывод платы, а прямо от питания.Вывод только приоткрывает кран — сам он такой ток не выдержит.
Вывод платы рассчитан на 20 миллиампер, предел — 40. Мотор просит сотни. Между ними нужен посредник.

Не подключайте мотор прямо к выводу платы даже «на секундочку». Вывод выгорает, и починить его нельзя — придётся пользоваться другим или менять плату.

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

Две новые детали

Транзистор IRFZ24IRFZ24Затворсигнал с платыСтокк моторуИстокна землюВыводы считаем слева направо, когда смотрим на надпись.Диод Шоттки 1N5818Пропускает ток только в одну сторону.светлая полоска — катодПолоска показывает, куда ток выходит.В нашей схеме она смотрит в сторону плюса.Обе детали ставятся в схему строго одной стороной — перепутать нельзя.
Транзистор IRFZ24 и диод Шоттки 1N5818 — обе детали есть в наборе.

У транзистора три вывода. Затвор — это «ручка крана», к нему идёт сигнал с платы. Сток — к мотору. Исток — на землю. Считать выводы нужно слева направо, когда смотришь на надпись, а металлическая пластина с отверстием — сзади.

Зачем нужен диод

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

Диод ставится параллельно мотору, «задом наперёд»: в обычной работе он закрыт и не мешает, а в момент выключения даёт выбросу безопасный путь по кругу, где он и гаснет. Полоска на корпусе диода при этом смотрит в сторону плюса.

Диод, поставленный наоборот, — короткое замыкание. Он замкнёт питание накоротко: провода и деталь ощутимо нагреются. Проверьте полоску до включения USB.

Собираем схему

+5 ВMмоторVD 1N5818ЗСИVT IRFZ24470 Омвывод 510 кОмТок мотора идёт от «+5 В» через мотор и транзистор на землю. Вывод 5 только приоткрывает транзистор,резистор 10 кОм держит затвор закрытым, пока плата загружается, а диод гасит выброс от катушки.
Мотор и транзистор включены последовательно между «плюсом» и землёй. Вывод 5 управляет затвором через резистор.

Два резистора в схеме делают разную работу. 470 Ом стоит между выводом платы и затвором — он ограничивает короткий бросок тока в момент переключения. 10 кОм соединяет затвор с землёй: пока плата включается и вывод ещё не стал «выходом», этот резистор держит транзистор закрытым, и мотор не дёргается сам по себе.

Отключите USB перед сборкой. Схема сегодня самая сложная в курсе — соберите её спокойно и сверьтесь дважды, особенно с тем, как повёрнуты транзистор и диод.

++abcdefghij11020456IRFZ24123451Транзистор: затвор в столбик 4, сток в 5, исток в 6 (ряд f). Ножки проходят над шинами, но не касаются их.2Резистор 470 Ом от затвора к столбику 1, оттуда провод на вывод 5. Резистор 10 кОм от затвора на шину «−».3Мотор: тёмный провод в столбик 5, красный — на шину «+». Диод: от столбика 5 на «+», полоской к плюсу.4Крутилка: столбики 12, 13, 14; крайние на шины, средняя на A0. Кнопка: столбик 17 → вывод 2, столбик 19 → «−».5Две перемычки справа: шины верхней и нижней половины сами по себе не соединены.Собирайте при отключённом USB и сверяйтесь со схемой дважды: транзистор, вставленный не той стороной, греется.
Крутилка и кнопка понадобятся на последних шагах — их можно поставить сразу, а можно добавить потом.

Шаг 1. Включить и выключить

Первая программа ничем не отличается от мигания светодиодом из третьего урока — и в этом вся прелесть: для платы мотор теперь такой же обычный «выход».

const int MOTOR = 5;  // затвор транзистора через резистор — на вывод 5

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

void loop() {
  digitalWrite(MOTOR, HIGH);  // открыли транзистор — мотор крутится
  delay(2000);

  digitalWrite(MOTOR, LOW);   // закрыли — мотор останавливается
  delay(2000);
}

Если мотор закрутился и остановился — схема собрана верно. Положите его на стол так, чтобы вал ни во что не упирался: он будет пытаться уползти.

Шаг 2. Четыре скорости

Транзистор умеет не только «открыто–закрыто». Знакомая команда analogWrite из восьмого урока быстро-быстро включает и выключает его, и мотор получает не полное питание, а его часть. Так и меняется скорость.

const int MOTOR = 5;

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

void loop() {
  analogWrite(MOTOR, 0);    // стоп
  delay(1500);

  analogWrite(MOTOR, 120);  // тихо
  delay(1500);

  analogWrite(MOTOR, 190);  // средне
  delay(1500);

  analogWrite(MOTOR, 255);  // на полную
  delay(1500);
}

Обратите внимание: на малых числах мотор может гудеть, но не крутиться. Это нормально — ему не хватает сил стронуться с места.

Шаг 3. Плавный разгон

const int MOTOR = 5;
const int START = 90;  // ниже этого мотор обычно только гудит

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

void loop() {
  // Разгон: от порога трогания до полной мощности.
  for (int power = START; power <= 255; power++) {
    analogWrite(MOTOR, power);
    delay(20);
  }

  delay(1000);

  // Торможение: обратно вниз.
  for (int power = 255; power >= START; power--) {
    analogWrite(MOTOR, power);
    delay(20);
  }

  analogWrite(MOTOR, 0);  // и полная остановка
  delay(1500);
}

Разгон начинается не с нуля, а с числа START — иначе первые секунды мотор просто пищит. Какое число подойдёт вашему мотору, выясним на следующем шаге.

Шаг 4. Находим порог трогания

У каждого мотора свой порог: число, ниже которого он только гудит. Найдём его опытом — программа медленно поднимает мощность и печатает текущее значение в монитор порта.

const int MOTOR = 5;

void setup() {
  pinMode(MOTOR, OUTPUT);
  Serial.begin(9600);
  Serial.println("следи за мотором и запомни число, на котором он тронулся");
}

void loop() {
  // Медленно поднимаем мощность и печатаем текущее значение.
  for (int power = 40; power <= 255; power = power + 5) {
    analogWrite(MOTOR, power);
    Serial.println(power);
    delay(600);
  }

  analogWrite(MOTOR, 0);
  Serial.println("--- пауза, начинаем заново ---");
  delay(3000);
}

Откройте монитор порта, следите за мотором и запомните число, на котором вал тронулся. Обычно это 70–110. Это ваше значение START.

Шаг 5. Скоростью управляет крутилка

const int MOTOR = 5;
const int POT = A0;
const int START = 90;  // порог трогания из четвёртого шага

void setup() {
  pinMode(MOTOR, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int value = analogRead(POT);

  // Крутилка в самом начале — мотор выключен полностью.
  int power = 0;
  if (value > 30) {
    // Остальной ход крутилки растягиваем от порога до максимума:
    // так мотор трогается сразу, а не гудит впустую.
    power = map(value, 30, 1023, START, 255);
  }

  analogWrite(MOTOR, power);

  Serial.print("крутилка: ");
  Serial.print(value);
  Serial.print("   мотор: ");
  Serial.println(power);

  delay(100);
}

Здесь есть маленькая хитрость. Если просто растянуть весь ход крутилки от 0 до 255, то первая треть будет «мёртвой» — мотор гудит, но стоит. Поэтому мы отводим самое начало под честное «выключено», а остальной ход растягиваем от порога до максимума. Теперь мотор трогается сразу, как только крутилку сдвинули.

Делаем вентилятор

Чтобы мотор стал вентилятором, на вал нужна крыльчатка. Готовой в наборе нет — сделайте её сами: вырежьте из плотной бумаги или тонкого картона кружок сантиметра три-четыре, надрежьте и слегка отогните лопасти, а в середине проколите отверстие точно по валу.

Только бумага или картон. Не ставьте на вал жёсткий пластик, металл или что-то тяжёлое: мотор раскручивает вал примерно до сотни оборотов в секунду, и такая крыльчатка становится опасной. Держите работающий мотор подальше от лица, глаз и длинных волос, а сам мотор придерживайте или закрепите — иначе он «уедет» со стола.

Про питание

Мотор питается от вывода 5V платы, а плата — от USB компьютера. Этого хватает для маленького мотора без нагрузки. Но если вентилятор упирается в препятствие или вал придержать рукой, ток резко растёт, напряжение проседает — и плата может перезагрузиться.

Признаки те же, что и у сервопривода: плата уходит в перезагрузку, монитор порта отваливается, мотор дёргается. Лечение тоже: отдельный источник питания на 5 вольт для мотора, обязательно соединив его землю с землёй платы.

Не работает? Разбираемся

  • Мотор не крутится вообще. Проверьте порядок выводов транзистора: затвор, сток, исток — слева направо со стороны надписи. Самая частая ошибка — транзистор, повёрнутый металлической пластиной к себе.
  • Мотор крутится всегда, команды не действуют. Скорее всего, сток и исток перепутаны местами, либо провод с вывода 5 попал не в тот столбик.
  • Мотор дёргается сам по себе при включении платы. Не стоит резистор 10 кОм между затвором и землёй, и затвор «висит в воздухе».
  • Транзистор или провода греются, светодиод питания тускнеет. Немедленно выньте USB: почти наверняка диод стоит наоборот. Полоска должна смотреть в сторону «плюса».
  • Мотор гудит, но не крутится. Мощность ниже порога трогания. Поднимите число в analogWrite или помогите валу пальцем — если после этого закрутился, дело именно в пороге.
  • Плата перезагружается, когда мотор трогается. Просадка питания. Снимите нагрузку с вала или подключите отдельный источник.

Задания для тренировки

  • РазминкаСделайте «прогрев»: при включении мотор разгоняется до полной скорости за пять секунд, а потом сам сбрасывает обороты до средних и держит их.
  • ПосложнееСоедините мотор с датчиком света из пятнадцатого урока: чем светлее и жарче в комнате, тем сильнее дует вентилятор. Порог трогания не забудьте.
  • Со звёздочкой ⭐Сделайте настоящий настольный вентилятор: кнопка по кругу переключает четыре режима — выключено, тихо, средне, сильно. Разбор ниже.
Показать разбор «вентилятор с кнопкой на четыре режима»

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

const int MOTOR = 5;
const int BUTTON = 2;

// Четыре режима вентилятора по кругу.
const int SPEEDS[] = {0, 110, 180, 255};
const int MODES = 4;

int mode = 0;             // текущий режим
bool wasPressed = false;  // была ли кнопка нажата в прошлый раз

void setup() {
  pinMode(MOTOR, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);
  analogWrite(MOTOR, SPEEDS[mode]);
  Serial.begin(9600);
}

void loop() {
  bool pressed = digitalRead(BUTTON) == LOW;

  // Ловим момент нажатия и переходим к следующему режиму.
  if (pressed && !wasPressed) {
    mode = mode + 1;
    if (mode >= MODES) {
      mode = 0;  // после последнего снова выключено
    }

    analogWrite(MOTOR, SPEEDS[mode]);

    Serial.print("режим ");
    Serial.print(mode);
    Serial.print(": ");
    Serial.println(SPEEDS[mode]);

    delay(50);  // пауза от дребезга контактов
  }

  wasPressed = pressed;
}

Нажатие ловится по моменту, а не по состоянию: иначе, пока палец на кнопке, режимы пролетали бы десятками в секунду.

Что мы узнали

  • Мотору нужны сотни миллиампер — вывод платы столько не отдаст. Между ними ставят транзистор.
  • Транзистор работает как кран: слабый сигнал на затворе управляет большим током через сток и исток.
  • Резистор 470 Ом бережёт вывод платы, резистор 10 кОм держит транзистор закрытым при включении.
  • Катушка мотора при выключении даёт выброс напряжения — его гасит диод, включённый параллельно мотору полоской к «плюсу».
  • Скорость меняется той же командой analogWrite, что и яркость светодиода.
  • У каждого мотора есть порог трогания: ниже него он только гудит.

В следующем уроке соберём из сервопривода, кнопки и датчика настоящий проект — шлагбаум, который открывается сам.

Частые вопросы

Можно ли подключить мотор прямо к выводу Arduino?

Нет. Вывод рассчитан примерно на 20 миллиампер, предел — 40, а мотор просит сотни. Вывод от такого тока выгорает без возможности ремонта. Мотор подключают через транзистор, который пропускает ток мимо вывода — прямо от питания.

Зачем нужен диод параллельно мотору?

Катушка мотора при выключении отдаёт короткий выброс напряжения, который пробивает транзистор. Диод, включённый параллельно мотору полоской к плюсу, даёт этому выбросу безопасный путь и гасит его.

Зачем два резистора в схеме с транзистором?

Резистор 470 Ом стоит между выводом платы и затвором и ограничивает бросок тока при переключении. Резистор 10 кОм соединяет затвор с землёй и держит транзистор закрытым, пока плата включается, — иначе мотор дёргается сам по себе.

Как менять скорость мотора на Arduino?

Той же командой analogWrite, что и яркость светодиода: число от 0 до 255 задаёт долю времени, когда транзистор открыт. На малых числах мотор гудит, но не крутится — у каждого мотора есть свой порог трогания, обычно 70–110.

Почему мотор гудит, но не крутится?

Мощности не хватает, чтобы стронуть вал с места. Поднимите число в analogWrite или найдите порог опытом: медленно увеличивайте значение и запомните, на каком мотор тронулся. От этого числа и стройте регулировку.

← Все уроки курса