Машинка на радиоуправлении умерла давным-давно, а моторчики в ней остались целые — с такого донора у меня началась эта история. Я подключил маленький коллекторный моторчик прямо к пину 9: один провод на пин, второй на GND, скетч написал как для светодиода из первого урока — digitalWrite(HIGH), подожди, digitalWrite(LOW). Моторчик дёрнулся, плата мигнула и перезагрузилась. На третьей попытке пин 9 перестал выдавать высокие уровни совсем: перенёс скетч на соседний пин — работает, вернулся на девятый — тишина. Пин я в тот день похоронил, и это была лучшая плата за урок из всех, что я оплатил.
Цифры, которые я узнал потом, объясняют каждый шаг того вечера. Пин Arduino Uno держит максимум 40 мА, и то это предел по даташиту, а не рабочая зона; комфорт для пина — 20 мА. Мой моторчик без нагрузки брал около 120 мА, а когда я придержал вал пальцем через тряпку — под 600. Разрыв в тридцать раз: пину скармливают нагрузку, для которой он не предназначен физически, а не программно. Никакая прошивка это не чинит, потому что ломается кремний, а не код.
Выход — посредник. Слабый сигнал с пина открывает сильный ключ, и ток мотора идёт мимо платы, от блока питания к мотору. В этом уроке ставим биполярный транзистор, добавляем диод, который спасает схему от выброса обмотки, крутим скорость через analogWrite и разбираем, почему реверс одним транзистором не собирается никогда — для смены направления нужен H-мост. Всё повторяется в симуляторе: моторчик на пине 9, скорость из Serial.
Пин — не розетка: посредник обязателен
Начнём с арифметики рычага. Берём NPN-транзистор 2N2222: коллектор — к минусу мотора, эмиттер — на GND, база — через резистор к пину 9. Между базой и эмиттером сидит диодный переход с падением около 0,7 В, поэтому резистор 1 кОм забирает с пина (5 − 0,7) / 1000 ≈ 4,3 мА. Коэффициент усиления 2N2222 — около 100: четыре миллиампера на базе открывают канал на 400-430 мА в коллекторе. Моё правило: для моторчиков до 300 мА под нагрузкой — 2N2222 и базовый резистор 1 кОм; номинал сверяю по цветным кольцам, как в уроке про резисторы, потому что перепутать 100 Ом и 1 кОм в макетке — минутное дело.
Если мотор жирнее — рычаг берут длиннее. TIP120 — составной транзистор (дарлингтон): усиление около 1000, но в заплачку за него коллектор-эмиттер съедает 1-2 В, и мотору от пяти вольт достанется 3,5-4 — оборотов меньше, тепла больше. IRLZ44N — полевой транзистор: затвор тока не пьёт вовсе, падение — сотые доли вольта, ток — десятки ампер; затвору желателен резистор 100 Ом в цепи пина и подтяжка 10 кОм на землю, чтобы ключ не висел в воздухе при загрузке. А вот от реле как регулятора скорости я отказался навсегда: щёлкать максимум пару раз в секунду — скорость так не собрать, об этом честно написано в уроке про реле.
Вторая деталь, без которой схема живёт до первого выключения, — диод поперёк мотора. Обмотка — индуктивность: ток в ней не обрывается мгновенно, и когда транзистор закрывается, обмотка выстреливает выбросом напряжения, поднимая потенциал на коллекторе до десятков вольт. Диод 1N4007 (1 А, 1000 В) ставим параллельно мотору катодом к плюсу питания, анодом к коллектору: в рабочем режиме он заперт, а выброс закорачивает обратно в обмотку. Практика с alexgyver, которую я проверил на своей макетке: диод вешать прямо на клеммы мотора, чтобы импульс не гулял по проводам и не наводил помехи на всё вокруг.
const int MOTOR = 9;int zel = 0;int tek = 0;unsigned long lastShag = 0; void setup() { pinMode(MOTOR, OUTPUT); Serial.begin(9600); Serial.println("Skorost 0-255, naprimer 180");} void loop() { if (Serial.available() > 0) { zel = Serial.parseInt(); while (Serial.available() > 0) Serial.read(); if (zel < 0) zel = 0; if (zel > 255) zel = 255; Serial.print("Celayu "); Serial.println(zel); } if (millis() - lastShag >= 15) { lastShag = millis(); if (tek < zel) tek = tek + 5; else if (tek > zel) tek = tek - 5; if (tek < 0) tek = 0; if (tek > 255) tek = 255; analogWrite(MOTOR, tek); }}Смотрите на скетч, а не в него. Скорость приходит из Serial как число — разбор числа это ровно то, что мы делали в уроке про parseInt; лишний хвост буфера я дочищиваю чтением, иначе после Enter скетч честно разберёт пустоту и сбросит цель в ноль. Прижим диапазона к 0-255 я держу не потому, что analogWrite не переживёт 300, — привычка класть границы в свой код раньше, чем их положит железо.
Главное в скетче — ступени. Целевая скорость не попадает на пин разом: каждые 15 мс ШИМ ползёт на 5 единиц, и путь от нуля до 255 занимает примерно 765 мс. Зачем: резкий прыжок 0 → 255 — бросок тока, который просаживает питание; на лабораторном блоке это невидимо, на батарейке «крона» мотор может уронить плату в перезагрузку в момент старта. Плавный разгон ещё и бережёт редуктор: ударный пуск — главный убийца пластиковых шестерёнок. Пауза в 15 мс не блокирует loop — тот же приём, что в уроке про millis, только не на светодиоде, а на моторе.
Аналоговое слово тут условное: analogWrite выдаёт ШИМ — меандр со скважностью, среднее напряжение которой и крутит мотор. На пинах 9 и 10 частота ШИМ — около 980 Гц, на остальных — около 490: дешёвые моторчики на 490 Гц иногда тонко визжат, и перенос нагрузки на 9-10 пин лечит писк без всяких конденсаторов. Как работает сам ШИМ и почему глаз видит яркость, а крыльчатка — обороты, разобрано в уроке про analogWrite; а ручку-регулятор вместо Serial вы получите, соединив этот скетч с потенциометром и map.
| Ключ | Предел по току | Плата за удобство | Когда беру |
|---|---|---|---|
| 2N2222 (NPN) | около 600-800 мА | падение 0,2-0,4 В, нужен базовый резистор | моторчики до 300 мА, машинки-игрушки |
| TIP120 (дарлингтон) | 3-5 А с радиатором | минус 1-2 В: от 5 В мотору достанется 3,5-4 | мощные моторы, когда жалко пин, а не обороты |
| IRLZ44N (MOSFET) | десятки ампер с радиатором | затвору нужна подтяжка 10 кОм на землю | когда важен каждый вольт и большие токи |
| L293D / TB6612 (H-мост) | 0,6 А / 1,2 А на канал | два канала и реверс, у TB6612 падение мизер | всегда, когда нужен задний ход |
Реверс: H-мост из четырёх ключей
Транзистор — выключатель в одном проводе: он умеет пропускать ток или не пропускать, и на этом его полномочия кончаются. Чтобы мотор закрутился назад, надо поменять плюс и минус местами — а одиночный ключ полярность не трогает в принципе. Решение старое, как гаражные мосты: четыре ключа вокруг мотора буквой H. Открыли диагональ «верхний левый + нижний правый» — ток идёт слева направо, мотор крутится вперёд; открыли вторую диагональ — ток развёрнут, мотор крутится назад; открыли два нижних — мотор тормозится накоротко. Руками это собирать больно, поэтому берут готовые микросхемы: L293D до 600 мА на канал, L298N до 2 А, но теряет 2-3 В, и мой фаворит для мелких роботов — TB6612FNG: 1,2 А на канал и падение в сотые доли вольта.
Управление у моста трёхпроводное: ENA — ШИМ скорости, IN1 и IN2 — направление. Комбинация HIGH/LOW — вперёд, LOW/HIGH — назад, LOW/LOW — свободное качение, HIGH/HIGH у большинства мостов — тормоз. В code-блоке ниже — скетч-прогулка: три секунды вперёд на 200, стоп, назад на 120. Направление и скорость разложены по функциям — тот приём раскладки по полочкам, которым мы занимались в уроке про свои функции: двигательная логика в машинке растёт быстро, и функции скоро себя окупят.
И честная граница применимости: если реверс не нужен вовсе, а надо лишь изредка включать и выключать мощное — реле дешевле и проще моста, мы его уже собирали. Но ШИМ реле не умеет: между щелчками должен пролезть десяток миллисекунд, и плавный разгон на нём не собирается никогда. Транзистор — про скорость, реле — про выключатель, мост — про направление.
const int IN1 = 5;const int IN2 = 6;const int ENA = 9; void motorVpered(int skorost) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); analogWrite(ENA, skorost);} void motorNazad(int skorost) { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); analogWrite(ENA, skorost);} void motorStop() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); analogWrite(ENA, 0);} void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENA, OUTPUT);} void loop() { motorVpered(200); delay(3000); motorStop(); delay(1000); motorNazad(120); delay(3000); motorStop(); delay(1000);}В симуляторе ниже — тот же первый скетч, только макетка умеет то, что умеет движок: моторчик подключён к пину 9 и слушает ШИМ. Честные оговорки две. Первая: симулятор рисует мотор прямо на пине, транзистор и диод он не рисует — раскладку для настоящей платы смотрите в подписи над code-блоком, а скетч одинаков в обеих средах. Вторая: модель мотора однонаправленная — реверс меняет полярность питания обмотки, а не скважность ШИМ, поэтому задний ход из code-блока с H-мостом в симуляторе не показать; на плате оба скетча работают как написаны.
- 1. Сколько тока комфортно берёт с пина ваш скетч и что случится при превышении?
- 2. Зачем диод ставят параллельно мотору, катодом к плюсу питания?
- 3. Базовый резистор 1 кОм, питание 5 В, на переходе базы падает 0,7 В. Сколько берёт пин?
- 4. Почему одним транзистором не собрать задний ход?
- 5. Мотор при заклинивании берёт 700 мА. Что ставите между пином и мотором?
- Погоняйте крайности: 0, 1, 30, 180, 255. Уже на единицах крыльчатка не сдвинется — трение сильнее толчка, это честная физика, а не поломка симулятора; на настоящем моторе добавьте шум вала.
- Введите 300 и минус 5: скетч прижмёт значения к 255 и 0. Потом уберите оба if-а — в симуляторе разницы не увидите, движок режет сам; на плате analogWrite промолчит и покрутит 255. Clamp в своём коде — привычка, не паранойя.
- Сломайте разгон: замените ступени одной строкой analogWrite(MOTOR, zel) сразу после разбора Serial. В симе поменяется только темп печати PWM, на плате это бросок тока с просадкой питания — тот самый, от которого батарейка роняет плату в перезагрузку.
- Соберите реверс из второго code-блока на TB6612 или L298N: ENA на пин 9, IN1/IN2 на 5 и 6. Проверьте обе диагонали и обе остановки: LOW/LOW — свободное качение, HIGH/HIGH — тормоз.
- Пин отдаёт максимум 40 мА по даташиту; мотор без нагрузки берёт от 100 мА, заклинивший — под 600. Прямое подключение убивает пин — это вопрос физики, а не кода.
- NPN-транзистор — рычаг: 4,3 мА с пина через 1 кОм на базу командуют сотнями миллиампер в коллекторе (2N2222, усиление около 100).
- Диод 1N4007 поперёк мотора, катодом к плюсу, гасит выброс обмотки при закрытии ключа; воткнутый наоборот — короткое замыкание питания.
- Скорость — это ШИМ: analogWrite 0-255, разгон ступенями по 5 единиц убирает бросок тока и удар по редуктору.
- Реверс одним транзистором не делается: нужен H-мост (L293D, L298N, TB6612), где две диагонали ключей меняют полярность, а ШИМ на ENA — скорость.
Частые вопросы по теме урока
- Сколько тока комфортно берёт с пина ваш скетч и что случится при превышении?
- Даташит называет 40 мА абсолютным пределом на пин, рабочая зона — около 20 мА. Мотор без нагрузки берёт от 100 мА, заклинивший — в разы больше, поэтому между ними ставят транзистор. До 20-40 мА; дальше пин деградирует и может умереть
- Зачем диод ставят параллельно мотору, катодом к плюсу питания?
- Обмотка — индуктивность: при закрытии ключа она выстреливает выбросом в десятки вольт. Диод закорачивает этот импульс обратно в обмотку, пока ключ и пин целы. Он гасит выброс обмотки в момент закрытия транзистора
- Базовый резистор 1 кОм, питание 5 В, на переходе базы падает 0,7 В. Сколько берёт пин?
- (5 − 0,7) / 1000 ≈ 4,3 мА. При усилении 2N2222 около 100 это открывает примерно 430 мА коллекторного тока — рычаг в сто раз. Около 4,3 мА
- Почему одним транзистором не собрать задний ход?
- Реверс — это перестановка плюса и минуса на обмотке. Одиночный ключ сидит в одном проводе, поэтому направление собирают на H-мосте: L293D, L298N, TB6612. Он умеет только замыкать и размыкать один провод — полярность не меняет
- Мотор при заклинивании берёт 700 мА. Что ставите между пином и мотором?
- 2N2222 с 4,3 мА базы открывает около 430 мА — не хватает. Дарлингтон TIP120 или полевой IRLZ44N держат такой ток, а реле без диода прибьёт и себя, и плату. TIP120 или MOSFET IRLZ44N