Курс Arduino с нуля · Движение
Урок 23. Мотор и транзистор: настольный вентилятор
Мотор просит слишком много тока, чтобы включать его напрямую. Ставим транзистор и диод, разбираемся зачем они нужны и собираем вентилятор с четырьмя скоростями.
Что понадобится
- Плата Uno из набора
- Кабель USB
- Макетная плата
- Электромотор
- Транзистор IRFZ24
- Диод Шоттки 1N5818
- Резистор 470 Ом
- Резистор 10 кОм
- Потенциометр 10 кОм
- Тактовая кнопка
- 8 проводов «папа-папа»
Все детали есть в обучающем наборе, по которому идёт курс.
Сервопривод из прошлого урока умеет поворачиваться на угол. Обычный мотор так не умеет — зато он крутится быстро и без остановки. Из него получаются вентиляторы, колёса, мешалки и всё, что должно вертеться.
Но просто воткнуть мотор в вывод платы нельзя — плату можно испортить. Сегодня разберёмся почему и познакомимся с двумя новыми деталями: транзистором и диодом.
Мотор из набора
Это самый простой электромотор: цилиндрик с валом и двумя проводами. Внутри — магниты и катушки. Подали напряжение — вал закрутился, сняли — остановился.
Почему мотор нельзя подключить напрямую
Дело в токе. Светодиод берёт около 20 миллиампер — вывод платы такое отдаёт спокойно. Мотор просит в десять–двадцать раз больше, а в первый миг, пока вал стоит, — ещё больше.
Не подключайте мотор прямо к выводу платы даже «на секундочку». Вывод выгорает, и починить его нельзя — придётся пользоваться другим или менять плату.
Решение — транзистор. Это электронный кран: слабый сигнал с вывода платы приоткрывает его, а мощный ток идёт через него напрямую от питания к мотору. Сам вывод при этом почти ничего не отдаёт.
Две новые детали
У транзистора три вывода. Затвор — это «ручка крана», к нему идёт сигнал с платы. Сток — к мотору. Исток — на землю. Считать выводы нужно слева направо, когда смотришь на надпись, а металлическая пластина с отверстием — сзади.
Зачем нужен диод
Внутри мотора — катушка провода. У катушки есть вредная привычка: когда ток резко прерывают, она пытается его продолжить и выдаёт короткий выброс напряжения — в разы больше, чем было. Такой удар легко пробивает транзистор.
Диод ставится параллельно мотору, «задом наперёд»: в обычной работе он закрыт и не мешает, а в момент выключения даёт выбросу безопасный путь по кругу, где он и гаснет. Полоска на корпусе диода при этом смотрит в сторону плюса.
Диод, поставленный наоборот, — короткое замыкание. Он замкнёт питание накоротко: провода и деталь ощутимо нагреются. Проверьте полоску до включения USB.
Собираем схему
Два резистора в схеме делают разную работу. 470 Ом стоит между выводом платы и затвором — он ограничивает короткий бросок тока в момент переключения. 10 кОм соединяет затвор с землёй: пока плата включается и вывод ещё не стал «выходом», этот резистор держит транзистор закрытым, и мотор не дёргается сам по себе.
Отключите 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 или найдите порог опытом: медленно увеличивайте значение и запомните, на каком мотор тронулся. От этого числа и стройте регулировку.
