Компоненты · 15 мин чтения

MOSFET и Arduino: IRLZ44N для светодиодной ленты 12 V, моторов и насосов

Как подключить MOSFET к Arduino: IRLZ44N с логическим уровнем против IRF520, резистор затвора и стягивающий резистор, обратный диод, код ШИМ для светодиодной ленты 12 V, моторов и насосов.

Схема Arduino MOSFET — самый эффективный способ коммутировать нагрузки, которые потребляют несколько ампер (светодиодную ленту 12 V, DC-мотор, водяной насос или соленоидный замок), с пинов Arduino, способных выдать всего около 20 mA. MOSFET — это электронный ключ, управляемый напряжением: подай 5 V на затвор, и участок между стоком и истоком превращается почти в провод с нулевым сопротивлением, а при 0 V он полностью закрыт. Правильно подобранный MOSFET с логическим уровнем управления лишь слегка нагревается, пропуская 3 A без радиатора.

В этом руководстве разберём, как работает MOSFET, почему не каждый MOSFET подходит для Arduino (разница между IRLZ44N и IRF520), зачем нужны резистор затвора, стягивающий резистор и обратный диод и как настраивать скорость и яркость через ШИМ (PWM). Дальше тебя ждут готовые скетчи для светодиодной ленты 12 V, DC-мотора, насоса и соленоида, примеры для ESP32 и Raspberry Pi Pico, расчёт нагрева и радиатора, а также таблица сравнения MOSFET, транзистора и реле.

Что такое MOSFET и как он работает?

MOSFET (Metal Oxide Semiconductor Field Effect Transistor, МОП-транзистор) — полевой транзистор с тремя выводами: затвор (gate), сток (drain) и исток (source). Затвор отделён от остальной структуры тонким слоем оксида, поэтому постоянный ток в него не течёт и он ведёт себя как маленький конденсатор. Когда напряжение между затвором и истоком (VGS) превышает определённый порог, между стоком и истоком образуется проводящий канал, и через него течёт ток нагрузки. Классический биполярный транзистор (BJT) управляется током базы, а MOSFET — напряжением: пин Arduino отдаёт ток только в течение тех нескольких микросекунд, за которые затвор заряжается и разряжается.

В проектах на Arduino почти всегда используют N-канальный MOSFET, установленный со стороны минуса нагрузки (GND); это называется ключом в нижнем плече (low-side switching). Плюсовой вывод нагрузки идёт прямо на плюс внешнего источника питания, минусовой — на сток MOSFET, а исток подключается к GND. Так напряжение затвор–исток просто равно напряжению на пине Arduino. Вот какие значения нужно проверить в даташите:

ПараметрЧто означаетЗначение для IRLZ44N
VDSМаксимальное напряжение, которое выдерживает участок сток–исток; должно быть минимум в 1,5–2 раза выше напряжения питания55 V
IDДлительный ток стока; верен только при температуре корпуса 25 °C, на практике используется намного меньше47 A (VGS = 10 V)
VGS(th)Напряжение на затворе, при котором канал только начинает проводить (течёт всего 250 µA); это не напряжение полного открытия1,0–2,0 V
RDS(on)Сопротивление сток–исток в полностью открытом состоянии; от него зависит нагрев, и очень важно, при каком VGS его измеряли22 mΩ (10 V), 25 mΩ (5 V), 35 mΩ (4 V)
VGS (макс.)Максимальное напряжение, которое можно подать на затвор; при превышении слой оксида пробивается±16 V
QgЗаряд, нужный для полного открытия затвора; чем он больше, тем медленнее переключение48 nC
Встроенный диодДиод внутри структуры, направленный от истока к стоку; индуктивные нагрузки он не защищаетЕсть (в любом силовом MOSFET)

MOSFET с логическим уровнем управления: IRLZ44N, IRF520 и другие

Самая частая ошибка — посмотреть на VGS(th) и решить: «порог 4 V, Arduino выдаёт 5 V, значит, заработает». Порог — это точка, в которой канал пропускает всего 250 µA; чтобы MOSFET проводил несколько ампер с малым сопротивлением, напряжение на затворе должно быть заметно выше порога. Правильный вопрос звучит так: при каком VGS даташит гарантирует RDS(on)? Если значение указано для 4,5 V или 5 V, MOSFET полностью открывается от 5-вольтовой Arduino, и его называют MOSFET с логическим уровнем управления (logic level). Если оно указано только для 10 V, это стандартный MOSFET, и пин Arduino откроет его лишь наполовину. В обозначениях International Rectifier (сейчас Infineon) детали, начинающиеся на IRL (IRLZ44N, IRLB8721, IRL540N), имеют логический уровень, а IRFZ44N, IRF520 и IRF540N — стандартные.

Модель (корпус)VDSДлительный IDRDS(on) (условие измерения)VGS(th)Arduino Uno (5 V)ESP32 / Pico (3,3 V)
IRLZ44N (TO-220)55 V47 A25 mΩ (VGS = 5 V)1,0–2,0 VОтлично; до 3 A без радиатораОбычно до 2–3 A, без гарантии
IRLB8721 (TO-220)30 V62 A16 mΩ (VGS = 4,5 V)1,35–2,35 VОтличноОбычно до 2–3 A, без гарантии
AO3400A (SOT-23, SMD)30 V5,7 A48 mΩ (VGS = 2,5 V)0,65–1,45 VХорошо; небольшие нагрузки (≈2 A)Отлично; гарантирован даже при 2,5 V
IRFZ44N (TO-220)55 V49 A17,5 mΩ (только при VGS = 10 V)2,0–4,0 VНе подходит, открывается наполовинуНе используй
IRF520 и модуль на нём (TO-220)100 V9,2 A0,27 Ω (только при VGS = 10 V)2,0–4,0 VТолько до ≈1 AНе используй
IRF540N (TO-220)100 V33 A44 mΩ (только при VGS = 10 V)2,0–4,0 VНе подходит, открывается наполовинуНе используй

Вывод из таблицы простой: для 5-вольтовых плат, таких как Uno, Nano и Mega, выбирай MOSFET, у которого RDS(on) указан при 4,5 V или 5 V. С 3,3-вольтовыми платами вроде ESP32 и Pico сложнее: даташиты популярных MOSFET в корпусе TO-220, таких как IRLZ44N и IRLB8721, не гарантируют никаких значений при 3,3 V; к этому вернёмся в разделе про ESP32. Не выбирай и по корпусу: IRLZ44N и IRFZ44N выпускаются в одинаковом корпусе с почти одинаковой маркировкой, но одна-единственная буква (L) для Arduino меняет всё. Порядок выводов можно проверить в утилите распиновки транзисторов; у MOSFET в корпусе TO-220, если повернуть их маркировкой к себе, слева направо идут затвор, сток, исток, а металлический фланец соединён со стоком.

Подключение MOSFET к Arduino: резистор затвора, стягивающий резистор и общая земля

Базовая схема состоит из пяти частей: MOSFET, резистора затвора, стягивающего резистора, обратного диода для индуктивных нагрузок и внешнего источника питания. В таблице ниже показано подключение для трёх плат; нагрузка в примере — светодиодная лента или мотор на 12 V. Весь код в этой статье использует эти пины.

ПодключениеArduino UnoESP32Raspberry Pi Pico
Управляющий пин → резистор затвора → затворD9 (PWM), 220 ΩGPIO 25, 100 ΩGP15, 100 Ω
Стягивающий резистор между затвором и GND10 kΩ10 kΩ10 kΩ
Исток (source)GNDGNDGND
Сток (drain)Минусовой (−) вывод нагрузкиМинусовой (−) вывод нагрузкиМинусовой (−) вывод нагрузки
Плюсовой (+) вывод нагрузкиПлюс блока питания 12 VПлюс блока питания 12 VПлюс блока питания 12 V
Минус (−) блока питания 12 VGND Arduino (общая земля)GND ESP32 (общая земля)GND Pico (общая земля)
Рекомендуемый MOSFETIRLZ44NIRLZ44N (до 2–3 A) или AO3400AIRLZ44N (до 2–3 A) или AO3400A

Резистор затвора (100–220 Ω) ограничивает кратковременный ток, который берётся с пина, пока заряжается ёмкость затвора. Входная ёмкость IRLZ44N — около 1700 pF; без резистора пин при каждом переключении на мгновение видит почти короткое замыкание, а в цепи затвора возникает звон (ringing). С 220 Ω пиковый ток не превышает 5 / 220 ≈ 23 mA, а затвор всё равно заряжается за несколько микросекунд. Стягивающий резистор (pull-down, 10 kΩ) не даёт затвору «висеть в воздухе», пока пин работает как вход, а так бывает, когда Arduino запускается, перезагружается или принимает новый скетч. «Висящий» затвор может нахватать помех и зарядиться наполовину; тогда MOSFET остаётся приоткрытым, мотор начинает самопроизвольно крутиться, а транзистор быстро перегревается. Ставь стягивающий резистор со стороны MOSFET относительно резистора затвора, прямо между затвором и истоком: так MOSFET останется закрытым, даже если управляющий провод отвалится. Два резистора образуют небольшой делитель напряжения, но его влияние ничтожно: на затвор приходит 5 × 10 000 / 10 220 ≈ 4,89 V.

Не забудь про общую землю: если минус блока питания 12 V не соединён с GND Arduino, у напряжения затвора нет определённой точки отсчёта относительно истока, и MOSFET не откроется. Никогда не питай нагрузку от пина 5V Arduino: мотору или светодиодной ленте нужен собственный источник питания (подробнее в статье GND и общая земля). Если перепутать сток и исток, встроенный диод MOSFET начнёт проводить, и нагрузка будет работать постоянно, в каком бы состоянии ни был пин.

Обратный диод: зачем он нужен моторам, насосам и соленоидам

Обратный диод типа 1N4007
Выпрямительный диод типа 1N4007: его подключают в обратном направлении параллельно индуктивной нагрузке; полоска на корпусе обозначает катод, который идёт на плюс (+) питания.

Индуктивные нагрузки — моторы, насосы, соленоиды, катушки реле и вентиляторы — сопротивляются резкому прекращению тока. В момент, когда MOSFET закрывается, магнитная энергия, накопленная в катушке, выходит в виде выброса напряжения на стоке, который намного превышает напряжение питания (V = L × di/dt). Такой выброс может превысить допустимое VDS и пробить MOSFET или создать помехи, из-за которых Arduino перезагрузится. Решение — диод, подключённый в обратном направлении параллельно нагрузке: катод (конец с полоской) — к плюсу питания, анод — к стоку. В обычном режиме диод смещён в обратном направлении и ток не проводит; когда MOSFET закрывается, ток катушки замыкается через диод и плавно затухает. Встроенный диод MOSFET эту работу не выполнит, потому что он стоит между истоком и стоком, а не параллельно нагрузке. Подробнее — в статье Что такое диод?.

Нагрузка и режим управленияРекомендуемый диодПочему?
Соленоид, катушка реле (только вкл/выкл)1N4007 (1 A, 1000 V)Медленный диод, но для редких переключений его достаточно
Небольшой насос или мотор с ШИМ (до 1 A)Диод Шоттки 1N5819 (1 A, 40 V)Быстрый; проводит в каждом периоде ШИМ
Мотор побольше с ШИМ (1–3 A)Диод Шоттки 1N5822 или SS34 (3 A, 40 V)Пока ШИМ в паузе, через диод идёт весь ток мотора
Светодиодная лента 12 V, резистивный нагревательНе нуженКатушки нет, значит, нет и выброса напряжения

Пошагово: регулировка яркости светодиодной ленты 12 V с Arduino

  1. Подготовь детали: Arduino Uno, IRLZ44N, резисторы 220 Ω и 10 kΩ, потенциометр 10 kΩ, светодиодная лента 12 V и блок питания 12 V, способный отдать ток ленты.
  2. Рассчитай ток ленты: лента 5050 с 60 светодиодами на метр потребляет около 14,4 W на метр, то есть 1,2 A при 12 V. Двум метрам нужно 2,4 A; блок питания выбирай с запасом 20% (минимум 3 A).
  3. Установи MOSFET: исток IRLZ44N подключи к шине GND, затвор — к D9 через 220 Ω, а между затвором и GND поставь 10 kΩ.
  4. Подключи нагрузку: провод +12V ленты идёт на плюс блока питания, минусовой провод — на сток MOSFET. Контакты макетной платы выдерживают около 1 A; при большем токе используй винтовые клеммы или припаяй провода нагрузки.
  5. Подключи потенциометр: крайние выводы — к 5V и GND, средний — к A0.
  6. Объедини земли и проверь: соедини минус блока питания с GND Arduino, загрузи код, а потом включи блок питания в розетку.
C++ (Arduino IDE)
1// IRLZ44N ile 12 V LED şerit parlaklık kontrolü / 12 V LED strip dimming with an IRLZ44N
2const int STRIP_PIN = 9;    // PWM pini, 220 Ω ile gate'e / PWM pin, to the gate via 220 Ω
3const int POT_PIN = A0;     // potansiyometre orta ucu / potentiometer wiper
4
5void setup() {
6  pinMode(STRIP_PIN, OUTPUT);
7  digitalWrite(STRIP_PIN, LOW);             // açılışta kapalı / off at startup
8  Serial.begin(9600);
9}
10
11void loop() {
12  int pot = analogRead(POT_PIN);            // 0–1023
13  float x = pot / 1023.0;                   // 0.0–1.0
14  int duty = (int)(x * x * 255.0 + 0.5);    // basit gama düzeltmesi / simple gamma correction
15  analogWrite(STRIP_PIN, duty);             // D9'da 490 Hz PWM / 490 Hz PWM on D9
16  Serial.print("Parlaklik / Brightness: %");
17  Serial.println(duty * 100 / 255);
18  delay(50);
19}

analogWrite() формирует на пине 9 сигнал ШИМ, который включается и выключается примерно 490 раз в секунду; 0 означает «полностью выключено», 255 — «полностью включено». ШИМ-пины Uno — 3, 5, 6, 9, 10 и 11; на пинах 5 и 6 частота около 980 Hz. Глаз воспринимает яркость нелинейно, поэтому возведение значения потенциометра в квадрат (простая гамма-коррекция) даёт гораздо более плавную регулировку на малой яркости. Подробно о ШИМ — в статье Что такое PWM?. Проверим и нагрев: при 2,4 A IRLZ44N рассеивает P = I² × RDS(on) = 2,4² × 0,025 ≈ 0,14 W, так что на ощупь он едва тёплый. Для сравнения, светодиодная лента при этом потребляет 28,8 W; потери в MOSFET — меньше одного процента от общей мощности.

Регулировка скорости DC-мотора и насоса через ШИМ

Погружной мини-насос на 6 V
Погружной мини-насос на 6 V: внутри у него небольшой DC-мотор, поэтому при управлении через MOSFET параллельно его выводам обязательно ставится обратный диод.

Мотор или насос управляется той же схемой, что и светодиодная лента; разница лишь в том, что параллельно нагрузке добавляется обратный диод. У моторов есть ещё и пусковой ток: неподвижный мотор в первый момент может потреблять в 3–8 раз больше рабочего тока. Поэтому подбирай MOSFET и источник питания по току при заторможенном валу и используй плавный старт вместо резкого скачка от 0 до 255. Погружные мини-насосы потребляют около 0,1–0,3 A при 3–6 V, а мембранные насосы на 12 V обычно 0,5–1 A; IRLZ44N справляется с обоими с большим запасом. Только питай мини-насос от источника с его собственным напряжением (5–6 V), а не от блока питания 12 V; схема с MOSFET остаётся той же. О выборе насоса и поливе читай в статье Мини-насос для воды.

C++ (Arduino IDE)
1// IRLZ44N ile motor/pompa hız kontrolü ve yumuşak kalkış / Motor or pump speed control with soft start (IRLZ44N)
2const int MOTOR_PIN = 9;     // 220 Ω ile gate'e / to the gate via 220 Ω
3const int POT_PIN = A0;      // hız ayarı / speed setting
4const int MIN_DUTY = 60;     // bunun altında motor yalnızca vızıldar / below this the motor only hums
5
6int current = 0;             // şu anki PWM değeri / current PWM value
7
8void setup() {
9  pinMode(MOTOR_PIN, OUTPUT);
10  digitalWrite(MOTOR_PIN, LOW);
11  // TCCR1B = (TCCR1B & 0b11111000) | 0x02;   // isteğe bağlı: D9/D10 PWM ≈3,9 kHz / optional: D9/D10 PWM ≈3.9 kHz
12}
13
14void loop() {
15  int target = map(analogRead(POT_PIN), 0, 1023, 0, 255);
16  if (target < MIN_DUTY) target = 0;         // çok düşük hızda tamamen durdur / stop completely at very low speed
17
18  if (current < target) current++;           // yavaşça hızlan / speed up gently
19  else if (current > target) current--;      // yavaşça yavaşla / slow down gently
20
21  analogWrite(MOTOR_PIN, current);
22  delay(8);                                  // 0→255 yaklaşık 2 s / 0→255 takes about 2 s
23}

Код каждые 8 мс делает один шаг к целевой скорости, считанной с потенциометра, поэтому мотор разгоняется от 0 до полной скорости примерно за 2 секунды, и пусковой ток не «проваливает» источник питания. MIN_DUTY — наименьшее значение ШИМ, при котором мотор начинает вращаться; подбери его опытным путём для своего мотора. ШИМ на 490 Hz вызывает слышимый писк мотора. Закомментированная строка TCCR1B поднимает частоту на D9 и D10 примерно до 3,9 kHz; библиотека Servo тоже использует Timer1, поэтому вместе их не применяй. Поднять частоту ещё выше заманчиво, но пину Arduino нужно несколько микросекунд, чтобы при каждом переключении зарядить затвор крупного MOSFET, поэтому потери на переключение растут с частотой: около 20 kHz даже мотор на 2 A может дать больше 1 W потерь в MOSFET. На таких частотах применяют драйвер затвора, например TC4427.

Соленоидные замки и кратковременные нагрузки

Соленоидные дверные замки на 12 V потребляют 0,5–1 A, и большинство из них не рассчитано на постоянное включение: если долго держать их под напряжением, катушка нагревается. Поэтому код должен держать замок открытым всего несколько секунд. Соленоид не управляется ШИМ, а просто включается и выключается, поэтому в качестве обратного диода достаточно 1N4007. В примере ниже нажатие кнопки на D2 открывает замок на 3 секунды, после чего он закрывается, даже если кнопку всё ещё держат. Чтобы открывать замок RFID-считывателем карт или матричной клавиатурой, достаточно поменять условие if; о типах замков и их поведении при отключении электричества читай в статье Соленоидный замок.

C++ (Arduino IDE)
1// Butonla 3 saniyelik solenoid kilit açma / Open a solenoid lock for 3 seconds with a button
2const int LOCK_PIN = 9;                 // 220 Ω ile IRLZ44N gate'ine / to the IRLZ44N gate via 220 Ω
3const int BUTTON_PIN = 2;               // buton D2 ile GND arasında / button between D2 and GND
4const unsigned long OPEN_MS = 3000;     // kilidin açık kalma süresi / how long the lock stays open
5
6void setup() {
7  pinMode(LOCK_PIN, OUTPUT);
8  digitalWrite(LOCK_PIN, LOW);          // kilit kapalı / locked
9  pinMode(BUTTON_PIN, INPUT_PULLUP);    // basılınca LOW / LOW when pressed
10}
11
12void loop() {
13  if (digitalRead(BUTTON_PIN) == LOW) {
14    digitalWrite(LOCK_PIN, HIGH);       // solenoid çeker, kilit açılır / solenoid pulls in, lock opens
15    delay(OPEN_MS);
16    digitalWrite(LOCK_PIN, LOW);        // bobini soğumaya bırak / let the coil cool down
17    while (digitalRead(BUTTON_PIN) == LOW) {}   // buton bırakılana kadar bekle / wait until released
18    delay(50);                          // buton zıplamasını süz / debounce
19  }
20}

Почему модулю IRF520 не хватает 5 V

MOSFET-модуль IRF520, очень распространённый в стартовых наборах, — это маленькая плата с винтовыми клеммами, которую продают с характеристиками вроде «24 V, 5 A». Кроме MOSFET, на ней есть несколько резисторов и сигнальный светодиод; обратного диода в большинстве версий нет. Проблема именно в MOSFET: IRF520 — стандартный MOSFET с порогом 2–4 V, и его RDS(on) 0,27 Ω гарантирован только при VGS = 10 V. По типовым графикам из даташита при напряжении на затворе 5 V IRF520 начинает ограничивать ток примерно на 2 A; у экземпляра с высоким порогом этот предел опускается ниже 1 A. В этот момент MOSFET ведёт себя не как ключ, а как переменный резистор.

Пример: допустим, мотор на 12 V, потребляющий 2 A, управляется модулем IRF520. Если на MOSFET падает 1,5 V, он рассеивает P = 1,5 × 2 = 3 W. При тепловом сопротивлении корпуса TO-220 без радиатора 62 °C/W это примерно на 186 °C выше температуры окружающей среды: MOSFET быстро перегреется и выйдет из строя, а в лучшем случае мотор будет вращаться медленно. 5 A на этикетке модуля справедливы только при 10 V на затворе. Вот выводы модуля и их подключение:

Вывод модуляКуда подключатьПримечание
SIGШИМ-пин Arduino (например, D9)Сигнал затвора; с 3,3-вольтовыми платами MOSFET почти не открывается
VCC5V ArduinoВ большинстве версий ни к чему не подключён; ток нагрузки здесь не течёт
GND (штыревой разъём)GND ArduinoНужен для общей земли
VIN и GND (винтовая клемма)+ и − внешнего источника питанияПитание нагрузки; модуль продаётся с рабочим напряжением до 24 V
V+ и V− (винтовая клемма)+ и − нагрузкиДля моторов и насосов добавь диод между V+ и V− (катодом к V+)
  • Замени MOSFET: выпаяй IRF520 из модуля и впаяй на его место IRLZ44N с тем же порядком выводов (G-D-S); плата работает точно так же, но теперь полностью открывается от 5 V.
  • Возьми модуль с логическим уровнем: готовые модули на MOSFET AOD4184A (D4184) обеспечивают RDS(on) не более 9,5 mΩ при 4,5 V и спокойно работают с 5-вольтовой Arduino.
  • Управляй затвором более высоким напряжением: драйвер затвора вроде TC4427 с питанием от 12 V превращает сигнал Arduino 5 V или 3,3 V в 12 V на затворе, и IRF520 выходит на свои реальные возможности. Не выходи за пределы напряжения затвора: ±20 V для IRF520, ±16 V для IRLZ44N.
  • Для малых нагрузок используй как есть: при токе ниже 1 A (короткая светодиодная лента, мини-насос) модуль IRF520 работает от 5 V с приемлемым нагревом; если MOSFET так горячий, что его не удержать пальцами, уменьши нагрузку.

MOSFET с ESP32 и Raspberry Pi Pico (3,3 V)

Пины ESP32 и Pico выдают 3,3 V, поэтому правильный выбор MOSFET здесь ещё важнее. Даташит IRLZ44N указывает RDS(on) вплоть до 4 V; по типовым графикам и около 3 V он спокойно пропускает несколько ампер, но для экземпляра с высоким порогом это не гарантировано. Практическое правило: на 3,3-вольтовых платах используй IRLZ44N или IRLB8721 до 2–3 A, при работающей нагрузке измерь мультиметром напряжение сток–исток и рассчитай рассеиваемую мощность по формуле P = VDS × I; для TO-220 без радиатора держись ниже 1 W. Для больших токов используй драйвер, поднимающий напряжение затвора до 5–12 V, а для небольших нагрузок — AO3400A, у которого RDS(on) гарантирован при 2,5 V. На ESP32 выбирай для MOSFET пины вроде GPIO 25, 26, 27, 32 или 33: GPIO 0, 2, 5, 12 и 15 — пины конфигурации при старте (strapping), а GPIO 1, 3, 5, 14 и 15 при включении могут ненадолго переходить в HIGH или выдавать ШИМ. На этих пинах нагрузка может неожиданно включиться при старте, а стягивающий резистор — помешать запуску платы.

Код для ESP32 ниже через MOSFET с плавным стартом включает насос, когда датчик влажности почвы сообщает, что земля сухая, поливает 5 секунд и затем плавно останавливает его. Для ШИМ используются функции ledcAttach() и ledcWrite() из ядра ESP32 Arduino 3.x; в старых версиях 2.x вместо них были ledcSetup() и ledcAttachPin(), а в ledcWrite() передавался номер канала, а не пин. Строки #if в коде выбирают нужные вызовы для установленного ядра, поэтому код компилируется на обеих версиях. Затвор управляется напряжением 3,3 V через 100 Ω, поэтому частота оставлена на 1 kHz, и потери на переключение остаются ничтожными. Измерь значения датчика для сухой и влажной почвы в своём грунте, как в статье Датчик влажности почвы, и настрой по ним порог DRY_LEVEL.

C++ (Arduino IDE)
1// ESP32 + MOSFET ile otomatik sulama pompası / Automatic watering pump with ESP32 + MOSFET
2const int PUMP_PIN = 25;                 // 100 Ω ile gate'e, gate–GND 10 kΩ / to the gate via 100 Ω, 10 kΩ gate–GND
3const int SOIL_PIN = 34;                 // toprak nem sensörü, ADC1 / soil moisture sensor, ADC1
4const int DRY_LEVEL = 2800;              // üstü kuru sayılır, kalibre et / above this counts as dry, calibrate
5const unsigned long WATER_MS = 5000;     // sulama süresi / watering time
6
7void pumpWrite(int duty) {               // 0–255 PWM, iki çekirdek sürümünde / on both core versions
8#if ESP_ARDUINO_VERSION_MAJOR >= 3
9  ledcWrite(PUMP_PIN, duty);             // 3.x: pin numarasıyla / 3.x: by pin number
10#else
11  ledcWrite(0, duty);                    // 2.x: kanal 0 ile / 2.x: by channel 0
12#endif
13}
14
15void pumpRamp(int from, int to) {        // yumuşak hız değişimi / smooth speed change
16  int step = (to > from) ? 5 : -5;
17  for (int d = from; d != to; d += step) {
18    pumpWrite(d);
19    delay(20);
20  }
21  pumpWrite(to);
22}
23
24void setup() {
25  Serial.begin(115200);
26#if ESP_ARDUINO_VERSION_MAJOR >= 3
27  ledcAttach(PUMP_PIN, 1000, 8);         // 1 kHz, 8 bit (0–255); çekirdek 3.x / core 3.x
28#else
29  ledcSetup(0, 1000, 8);                 // çekirdek 2.x: kanal 0 / core 2.x: channel 0
30  ledcAttachPin(PUMP_PIN, 0);
31#endif
32  pumpWrite(0);                          // pompa kapalı / pump off
33}
34
35void loop() {
36  int soil = analogRead(SOIL_PIN);       // 0–4095
37  Serial.printf("Toprak / Soil: %d\n", soil);
38  if (soil > DRY_LEVEL) {
39    pumpRamp(0, 255);                    // yaklaşık 1 s'de tam hıza / full speed in about 1 s
40    delay(WATER_MS);
41    pumpRamp(255, 0);                    // yumuşakça dur / stop gently
42    delay(60000);                        // suyun toprağa yayılmasını bekle / let the water soak in
43  }
44  delay(1000);
45}

На Raspberry Pi Pico для генерации ШИМ в MicroPython достаточно класса machine.PWM; duty_u16() принимает значение от 0 до 65535. Код ниже создаёт плавный эффект «дыхания» для светодиодной ленты 12 V, подключённой через MOSFET к GP15. Как и в примере для Arduino, значение возводится в квадрат для простой гамма-коррекции, поэтому переход от темноты к яркому свету выглядит естественно. Пины Pico тоже выдают 3,3 V, так что правила выбора MOSFET, приведённые для ESP32, действуют и здесь.

MicroPython
1# Pico + MOSFET ile 12 V LED şerit nefes efekti / 12 V LED strip breathing effect with Pico + MOSFET
2from machine import Pin, PWM
3import time
4
5strip = PWM(Pin(15))          # 100 Ω ile gate'e, gate–GND 10 kΩ / to the gate via 100 Ω, 10 kΩ gate–GND
6strip.freq(1000)              # 1 kHz: titreme görünmez / 1 kHz: no visible flicker
7
8def set_level(x):             # x: 0.0–1.0
9    strip.duty_u16(int(x * x * 65535))   # basit gama düzeltmesi / simple gamma correction
10
11while True:
12    for i in range(101):                 # yavaşça aydınlan / fade in
13        set_level(i / 100)
14        time.sleep_ms(20)
15    for i in range(100, -1, -1):         # yavaşça sön / fade out
16        set_level(i / 100)
17        time.sleep_ms(20)
18    time.sleep_ms(500)

Нагрев, расчёт мощности и выбор радиатора

Нагрев полностью открытого MOSFET описывается одной формулой: P = I² × RDS(on). Помни о двух вещах. Во-первых, RDS(on) растёт с температурой: у IRLZ44N при 100 °C оно примерно в 1,5 раза больше, чем при 25 °C, поэтому реалистичнее считать с 38 mΩ, а не с 25 mΩ. Во-вторых, корпус может отдать в воздух лишь ограниченное количество тепла: тепловое сопротивление TO-220 без радиатора (RθJA) составляет 62 °C/W, то есть каждый ватт поднимает температуру кристалла на 62 °C выше окружающей. В таблице ниже показано, как греется IRLZ44N при 5 V на затворе без радиатора:

Ток нагрузкиРассеиваемая мощность (при 38 mΩ)Рост температуры (без радиатора)Рекомендация
1 A0,04 W≈ 2 °CРадиатор не нужен
3 A0,34 W≈ 21 °CРадиатор не нужен, тёплый на ощупь
5 A0,95 W≈ 59 °CНа пределе; поставь небольшой радиатор
8 A2,4 W≈ 150 °CРадиатор обязателен
10 A3,8 W≈ 236 °CНужны ребристый радиатор и термопаста

Радиатор рассчитывается по той же логике: Tj = Tокр + P × (RθJC + RθCS + RθSA). Если при 10 A рассеивается 3,8 W и нужно удержать температуру кристалла на уровне 100 °C в комнате с 30 °C, общее тепловое сопротивление не должно превышать (100 − 30) / 3,8 ≈ 18 °C/W. Тепловое сопротивление переход–корпус у IRLZ44N — 1,4 °C/W, контакт с термопастой — около 0,5 °C/W, поэтому на радиатор остаётся не больше 16 °C/W; это соответствует небольшому, но ребристому радиатору для TO-220. Металлический фланец MOSFET соединён со стоком; если ставишь несколько MOSFET на один радиатор, используй изолирующие прокладки из слюды или силикона и пластиковые втулки для винтов. Второй источник нагрева при ШИМ — потери на переключение; на 490 Hz они ничтожны, но растут с повышением частоты.

Проще всего понять, открыт ли MOSFET полностью, измерив напряжение между стоком и истоком при работающей нагрузке. IRLZ44N при 3 A должен показывать около 0,1 V; если видишь 1 V и больше, MOSFET открыт лишь наполовину, а напряжения на затворе не хватает (стандартный MOSFET, 3,3-вольтовая плата или оборванное подключение затвора). Рассеиваемую мощность можно рассчитать по формуле P = VDS × I и проверить цифры в калькуляторе закона Ома.

MOSFET, транзистор или реле

ХарактеристикаMOSFET с логическим уровнем (IRLZ44N)Биполярный транзистор (2N2222A / TIP120)Реле (модуль 5 V)
Как управляется?Напряжением; постоянного тока затвора нетТоком; ток базы течёт постоянно (2–10 mA)Током катушки (≈70 mA); её включает транзистор на модуле
Потери во включённом состоянииI² × RDS(on): ≈ 0,2–0,3 W при 3 AVCE(sat) × I: у TIP120 до 2 V при 3 A, ≈ 6 WПочти ноль на контактах
Допустимый токДесятки ампер (с радиатором)2N2222A 0,6 A, TIP120 5 AОбычно 10 A (по контактам)
ШИМ: скорость и яркостьДа, в диапазоне kHzДаНет, только вкл/выкл
Переменное / сетевое напряжениеНет, только постоянный токНет, только постоянный токДа, с гальванической развязкой
Шум и ресурсБесшумно, без износаБесшумно, без износаЩёлкает; ресурс контактов около 100 000 переключений
Лучше всего подходит дляСветодиодные ленты, моторы, насосы, соленоиды (1–10 A, постоянный ток)Малые нагрузки (до 1 A), катушки реле, зуммерыЛампы, розетки, приборы на переменном токе

Коротко: если нужно управлять нагрузкой постоянного тока быстро, бесшумно и с ШИМ, бери MOSFET; если коммутируешь лампу или розетку от сети 220 V, используй модуль реле. Для небольших нагрузок в несколько сотен миллиампер справится и дешёвый биполярный транзистор; расчёт базового резистора есть в статье Что такое транзистор?. Если один и тот же мотор должен вращаться в обе стороны, одного MOSFET мало: нужен H-мост из четырёх ключей, поэтому используй драйвер моторов L298N или модуль H-моста на MOSFET.

Идеи проектов с MOSFET

  • Автоматическая подсветка шкафа или лестницы: когда PIR-датчик замечает движение, плавно зажигай светодиодную ленту 12 V через ШИМ и выключай её через некоторое время.
  • Лампа «Закат»: с помощью фоторезистора (LDR) постепенно повышай яркость ленты по мере того, как в комнате темнеет.
  • Умный вентилятор: увеличивай скорость компьютерного вентилятора на 12 V по мере роста температуры, измеренной DHT11.
  • Автополив растений: поливай горшки автоматически с помощью датчика влажности почвы и насоса, управляемого через MOSFET; для каждого насоса используй отдельный MOSFET.
  • Дверной замок по карте: открывай соленоидный замок 12 V на 3 секунды, когда RFID RC522 считывает нужную карту.
  • Умная теплица: собери умную теплицу, в которой вентилятор, насос и нагреватель управляются отдельными MOSFET.

Частые ошибки и как их исправить

СимптомВероятная причинаРешение
Нагрузка вообще не работаетНет общего GND или неверный порядок G-D-SСоедини минус блока питания с GND Arduino и проверь порядок выводов
Нагрузка работает постоянно и не выключаетсяПерепутаны сток и исток (проводит встроенный диод) или MOSFET пробитИсправь подключение; если сток–исток прозванивается как короткое замыкание в обе стороны, замени MOSFET
MOSFET сильно греется, а нагрузка работает слабоСтандартный MOSFET (IRF520, IRFZ44N) открыт лишь наполовину при 5 V или 3,3 VИспользуй MOSFET с логическим уровнем, например IRLZ44N, или драйвер затвора
Мотор самопроизвольно крутится при включении или во время загрузки кодаЗатвор «висит в воздухе», нет стягивающего резистораПоставь 10 kΩ между затвором и GND
Arduino перезагружается, когда мотор останавливаетсяНет обратного диода, или мотор и Arduino питаются от одного слабого источникаПоставь диод Шоттки в обратном направлении параллельно мотору и питай мотор от отдельного источника
Мотор громко пищит при ШИМЧастота ШИМ 490 Hz попадает в слышимый диапазонПодними её до 3,9 kHz; выше 20 kHz используй драйвер затвора
Нагрузка работает слабо, если N-канальный MOSFET стоит на стороне плюсаИсток поднимается вместе с нагрузкой, и VGS уменьшаетсяОставь N-канальный MOSFET на стороне GND; для ключа в верхнем плече используй P-канальный MOSFET с NPN-драйвером
Когда собираешь схему впервые, начни с маленькой нагрузки: прежде чем подключать ленту 12 V, попробуй светодиод с резистором 1 kΩ, а вместо насоса — небольшой мотор. Если Arduino постоянно перезагружается, причина обычно в просадке напряжения и помехах; пошаговую диагностику найдёшь в статье Arduino постоянно перезагружается. Если нужно получить 5 V для Arduino от блока питания 12 V, можно использовать понижающий преобразователь LM2596.

MOSFET — самый аккуратный способ подключить Arduino к мощным нагрузкам реального мира: с правильно подобранной деталью с логическим уровнем, резистором затвора, стягивающим резистором и диодом для индуктивных нагрузок можно бесшумно и эффективно управлять любой нагрузкой постоянного тока, от светодиодной ленты до насоса. В приложении BlueGrays есть такие проекты, как плавное зажигание светодиода через ШИМ, регулировка яркости потенциометром, умная станция полива и умное освещение, с пошаговыми схемами подключения и кодом, так что схему с MOSFET из этой статьи можно сразу превратить в настоящий проект.

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

Какой MOSFET использовать с Arduino?

Для 5-вольтовых Arduino Uno, Nano или Mega выбирай N-канальный MOSFET с логическим уровнем управления, у которого RDS(on) гарантирован при 4,5 V или 5 V. Самый распространённый — IRLZ44N: он выдерживает 55 V и имеет сопротивление всего 25 mΩ при 5 V на затворе. IRLB8721 тоже хороший вариант, а стандартным MOSFET вроде IRFZ44N, IRF520 и IRF540N для полного открытия нужно 10 V.

Работает ли модуль IRF520 с Arduino?

Работает, но с ограничениями. IRF520 — стандартный MOSFET, и при 5 V на затворе он обычно начинает ограничивать ток примерно на 2 A, поэтому при нагрузках больше 1 A быстро нагревается. Для малых нагрузок его хватает; для больших замени MOSFET на модуле на IRLZ44N или возьми модуль с логическим уровнем.

Какой резистор затвора нужен для MOSFET?

С Arduino хорошо работает резистор затвора 100–220 Ω; 220 Ω ограничивает кратковременный ток с пина примерно до 23 mA при 5 V. Также поставь стягивающий резистор 10 kΩ между затвором и GND: он не даёт MOSFET самопроизвольно открыться при включении и во время загрузки кода.

Можно ли коммутировать сетевое переменное напряжение с помощью MOSFET?

В проектах на Arduino используй MOSFET только для нагрузок постоянного тока. Сетевое переменное напряжение нельзя безопасно коммутировать одним N-канальным MOSFET, а такая схема не имеет гальванической развязки, что делает её опасной. Для сетевой лампы или розетки используй модуль реле, твердотельное реле (SSR) или схему на симисторе с управлением через оптопару.

Как управлять MOSFET с ESP32?

Пины ESP32 выдают 3,3 V, поэтому выбирай MOSFET, который хорошо открывается при низком напряжении на затворе. IRLZ44N обычно нормально работает при 3,3 V до 2–3 A; для малых нагрузок надёжнее AO3400A, гарантированный при 2,5 V, а для больших токов — драйвер, поднимающий напряжение затвора до 12 V. Для ШИМ используй ledcAttach() и ledcWrite() и выбирай пины, которые при включении остаются «тихими», например GPIO 25, 26, 27, 32 или 33.

Почему греется MOSFET?

Нагрев полностью открытого MOSFET равен P = I² × RDS(on); IRLZ44N при 3 A рассеивает всего 0,2–0,3 W. Если MOSFET сильно греется, обычно напряжения на затворе не хватает и он открыт лишь наполовину; самые частые причины — стандартный MOSFET, управление от 3,3-вольтовой платы и слишком высокая частота ШИМ. Если на TO-220 без радиатора рассеивается больше 1 W, поставь радиатор.

Все проекты
Ночник на LDR
#12Новичок

Ночник на LDR

Маленький ночник, который сам включается, когда темнеет, и гаснет, когда наступает утро. Датчик освещённости измеряет, насколько светло в комнате, и Arduino включает светодиод, когда достаточно темно,

4.8(102)
205
Плавное затухание светодиода с PWM на ESP32
#110Новичок

Плавное затухание светодиода с PWM на ESP32

Плавное изменение яркости светодиода от 0 до максимума и от максимума до 0. PWM управляется через analogWrite(), как в Arduino, — тот же синтаксис без проблем работает в ESP32 Arduino Core 3.0+. Достаточно определения пина, pinMode и analogWrite.

4.8(36)
54
Регулировка яркости светодиода потенциометром на ESP32 (аналог → PWM)
#115Средний
Premium

Регулировка яркости светодиода потенциометром на ESP32 (аналог → PWM)

В этом проекте яркость светодиода плавно регулируется потенциометром. Пин АЦП ESP32 читает напряжение 0–3,3V с потенциометра, затем это значение превращается в сигнал PWM (широтно-импульсная модуляция) и подаётся на светодиод. В результате при повороте потенциометра светодиод постепенно становится ярче или тусклее. В Arduino Core 3.0+ можно сразу использовать analogWrite(); на ESP32-S2/S3 разрешение АЦП фиксировано — 12 бит.

4.5(19)
32
Плавное затухание светодиода с PWM на Pico (эффект дыхания)
#160Новичок

Плавное затухание светодиода с PWM на Pico (эффект дыхания)

Светодиод больше не просто мигает — он дышит! С помощью PWM (широтно-импульсной модуляции) Raspberry Pi Pico яркость светодиода медленно растёт и медленно падает, как огонёк спящего MacBook. Изучи класс machine.PWM, duty_u16() (16-битная яркость 0–65535), частоту PWM (freq(1000) — 1000 циклов вкл/выкл в секунду, мерцания не видно), циклы range() с шагом (вверх и вниз) и почти аналоговый выход с цифрового пина.

0.0(0)
4
Умная станция полива
#83Продвинутый
Premium

Умная станция полива

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

5.0(42)
57
Умное освещение на ESP32 (PIR + LDR + реле + OLED)
#141Продвинутый
Premium

Умное освещение на ESP32 (PIR + LDR + реле + OLED)

Сделай умное освещение для коридора, ванной или кладовки на ESP32! С PIR-датчиком движения, датчиком освещённости LDR и модулем реле собирается классический сценарий «свет включается при движении в темноте»: если вокруг уже светло, движение свет НЕ включает, и днём энергия экономится. Свет горит 30 секунд; если движение продолжается, таймер сбрасывается, и свет горит дольше. OLED SSD1306 крупно показывает состояние (ON / DAYTIME / WAITING) и обратный отсчёт.

4.3(6)
11
Умное освещение лестницы и коридора
#82Средний
Premium

Умное освещение лестницы и коридора

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

5.0(35)
51