ELECTRONICS

Моторы, реле и свет: как Arduino управляет нагрузкой

Первое, что хочется сделать с Arduino после мигания светодиодом, — покрутить мотор. И первое, что при этом сгорает, — вывод платы. Не потому, что мотор большой, а потому, что вывод рассчитан на сигнал, а не на силу. Эта страница о том, как между сигналом и силой поставить посредника.

Почему нельзя напрямую

Вывод Arduino отдаёт 20 мА в норме и 40 мА в пределе. Этого хватает светодиоду и сигнальному входу модуля — и всё. Маленький моторчик из игрушки просит 200 мА, в момент старта — вдвое больше. Лампочка на 12 В — от 100 мА. Лента из тридцати светодиодов — полтора ампера.

Сравните: 40 против 200. Вывод перегреется за секунды. Иногда сгорает только он и остальные выводы продолжают работать, иногда умирает весь микроконтроллер.

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

Три посредника

Выбор зависит от двух вещей: постоянный ток или сеть, и нужна ли регулировка скорости.

Транзистор

Когда: Маленький мотор, светодиодная лента, вентилятор, лампа на 12 В. Всё постоянного тока до пары ампер.

Ограничения: Только постоянный ток. Умеет ШИМ — значит, скорость и яркость регулируются.

Транзистор BC547

Реле

Когда: Сетевое напряжение 220 В, мощная нагрузка, гальваническая развязка. Лампа в люстре, обогреватель, насос.

Ограничения: Щёлкает механически: медленно, изнашивается, ШИМ невозможен. Катушка сама ест 70 мА.

Модуль реле KY-019

Драйвер моторов

Когда: Мотор, который должен крутиться в обе стороны: колёса робота, шаговый двигатель, привод шторы.

Ограничения: Два выхода и мостовая схема внутри. Держит 1–2 А на канал, больше — греется.

Сервопривод: когда драйвер уже внутри

Транзистор: самый дешёвый ключ

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

Вывод платы при этом отдаёт миллиампер — только на управление. Поэтому нагрузка может быть в сто раз мощнее, чем позволяет вывод. Скетч ниже плавно разгоняет мотор — это analogWrite на выводе с ШИМ, и он работает, потому что транзистор успевает открываться и закрываться тысячи раз в секунду.

// Мотор через транзисторный ключ на выводе 9: разгон и остановка
const int MOTOR = 9;   // вывод с ШИМ → резистор → база транзистора

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

void loop() {
  for (int speed = 0; speed <= 255; speed += 5) {   // плавный разгон
    analogWrite(MOTOR, speed);
    delay(30);
  }
  delay(1000);
  analogWrite(MOTOR, 0);                            // стоп
  delay(1000);
}

Для тока до 100 мА подойдёт любой маломощный биполярный транзистор вроде BC547. От полуампера берут полевой — IRLZ44N или похожий с буквой L в названии: она означает, что он полностью открывается от 5 В платы. Схема и распиновка — на странице транзистора.

Реле: когда в розетке 220

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

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

// Реле на выводе 7: включить на пять секунд, выключить на пять
const int RELAY = 7;

void setup() {
  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, LOW);   // сразу задать состояние, чтобы реле не щёлкнуло при старте
}

void loop() {
  digitalWrite(RELAY, HIGH);  // у модулей с инверсной логикой здесь будет LOW
  delay(5000);
  digitalWrite(RELAY, LOW);
  delay(5000);
}

Одна тонкость: часть модулей включается нулём, а не единицей. Если реле щёлкнуло при старте и молчит, когда должно сработать, — поменяйте HIGH и LOW местами. Подробности и схема — на странице модуля реле.

Свет: светодиоды и ленты

Один светодиод — на вывод через резистор, без посредников: 20 мА ему как раз. Три-четыре светодиода на одном выводе — уже перебор, каждому нужен свой вывод или один транзистор на всех. Лента — только через транзистор, и полевой: обычная пятиметровая лента на 12 В ест до пяти ампер.

Адресная лента — другая история: у неё внутри каждого светодиода своя микросхема, и плате нужен один сигнальный провод, а ток идёт от отдельного блока питания. Как подключить WS2812B.

На чём попадаются

Мотор питается от 5V платы

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

Забыт диод

Работает день, два, потом транзистор пробит. Всплеск от катушки при каждом выключении бьёт по нему. Диод 1N4007 параллельно мотору или катушке, полосой к плюсу, — копейка, которая продлевает жизнь всей схеме.

ШИМ на реле

analogWrite на выводе с реле заставит его дребезжать сотни раз в секунду. Контакты обгорят за минуты. Реле умеет только включено и выключено.

Полевой транзистор не открывается до конца

Транзистор греется, мотор крутится вяло. Взят обычный полевик, которому для полного открытия нужно 10 В на затворе, а плата даёт 5. Нужен логический уровень — с буквой L в названии — или биполярный.

Что дальше

Оба скетча собраны под Arduino UNO перед публикацией