Моторы, реле и свет: как Arduino управляет нагрузкой
Первое, что хочется сделать с Arduino после мигания светодиодом, — покрутить мотор. И первое, что при этом сгорает, — вывод платы. Не потому, что мотор большой, а потому, что вывод рассчитан на сигнал, а не на силу. Эта страница о том, как между сигналом и силой поставить посредника.
Почему нельзя напрямую
Вывод Arduino отдаёт 20 мА в норме и 40 мА в пределе. Этого хватает светодиоду и сигнальному входу модуля — и всё. Маленький моторчик из игрушки просит 200 мА, в момент старта — вдвое больше. Лампочка на 12 В — от 100 мА. Лента из тридцати светодиодов — полтора ампера.
Сравните: 40 против 200. Вывод перегреется за секунды. Иногда сгорает только он и остальные выводы продолжают работать, иногда умирает весь микроконтроллер.
Есть и вторая причина. Мотор — катушка, и при выключении она отдаёт обратно всплеск напряжения в десятки вольт. Для микроконтроллера это как удар током. Посредник берёт этот удар на себя — если рядом с ним стоит защитный диод.
Три посредника
Выбор зависит от двух вещей: постоянный ток или сеть, и нужна ли регулировка скорости.
Транзистор
Когда: Маленький мотор, светодиодная лента, вентилятор, лампа на 12 В. Всё постоянного тока до пары ампер.
Ограничения: Только постоянный ток. Умеет ШИМ — значит, скорость и яркость регулируются.
Реле
Когда: Сетевое напряжение 220 В, мощная нагрузка, гальваническая развязка. Лампа в люстре, обогреватель, насос.
Ограничения: Щёлкает механически: медленно, изнашивается, ШИМ невозможен. Катушка сама ест 70 мА.
Драйвер моторов
Когда: Мотор, который должен крутиться в обе стороны: колёса робота, шаговый двигатель, привод шторы.
Ограничения: Два выхода и мостовая схема внутри. Держит 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 в названии — или биполярный.
Что дальше
- Питание: откуда взять ток для мотора
- Транзистор BC547: схема ключа и распиновка
- Модуль реле: схема и скетч
Оба скетча собраны под Arduino UNO перед публикацией