ULN2003 и шаговый двигатель 28BYJ-48: подключение к Arduino
28BYJ-48 из стартовых наборов стоит копейки и умеет точное позиционирование, но напрямую к пину его не подключить: обмоткам нужно до 200 мА, а пин отдаёт 20. Драйвер ULN2003 на синей плате с четырьмя красными светодиодами решает это за копейки. И именно здесь теряют вечер: мотор дрожит и стоит на месте, потому что два средних провода перепутаны местами, или питание от USB проседает на первой же фазе.
Ниже распиновка платы IN1–IN4, откуда берётся число 2048 шагов на оборот и почему честная арифметика даёт 2038, скетч полушаговой последовательности без библиотеки, сравнение с библиотекой Stepper и честный разбор нагрева. Про просадки USB и выбор блока питания в отдельном гайде по питанию Arduino, лимиты пинов в распиновке Uno.
Отдельные разделы ниже отвечают на вопросы, которые возникают после первой сборки: почему вал стоит при горящих светодиодах, почему мотор не крутится быстрее, что с него взять кроме удовольствия и какой привод стоит взять, если ULN2003 уже не хватает.
Зачем мотору драйвер: ключи Дарлингтона в ULN2003
Обмотки 28BYJ-48 имеют сопротивление около 50 Ом: при 5 В каждая тянет около 100 мА, а в полном шаге активны сразу две, до 200 мА. ULN2003 это матрица из семи транзисторов Дарлингтона: паспорт даёт 500 мА на канал, но это при хорошем теплоотводе и не по всем каналам сразу. У корпуса SOP-16 предел рассеивания около 1 Вт, поэтому реальный комфорт для мотора 100–200 мА суммарно. Входы идут через резисторы 2,7 кОм, так что 5 В и 3,3 В логика работают одинаково. Выбросы обмоток гасят семь диодов на кристалле, их общий вывод выведен на пин COM (9), на плате он уже соединён с плюсом питания. Нагрев платы до 40–60 °C при работе это норма; откуда берётся и что с ним делать, в уроке про нагрев и ток покоя шаговика.
| Контакт платы | Куда | Зачем |
|---|---|---|
| VCC | +5 В питания мотора | Питание обмоток, до ~200 мА |
| GND | GND Arduino и БП | Общая земля, без неё фазы не идут |
| IN1–IN4 | D8, D9, D10, D11 | Скетч задаёт фазы по кругу |
| Белый разъём | Шлейф 28BYJ-48, 5 проводов | Красный провод общий, в центре |
| Светодиоды 1–4 | На плате | Горят на активных фазах, виден порядок |
Схема: четыре провода и общий GND
Схема на четыре провода: IN1 на D8, IN2 на D9, IN3 на D10, IN4 на D11. Питание обмоток идёт на VCC платы: на столе для короткого теста хватит 5 В от Uno, для постоянной работы нужен отдельный БП, ниже объясню почему. Общий GND обязателен. Шлейф мотора в разъёме живёт одной ориентацией: красный провод, это общий вывод обеих обмоток, окажется в центре разъёма, перепутать сложно, но проверьте до первого запуска, ведь перевёрнутый шлейф оставит обмотки на питании.
2048 шагов на оборот: честная арифметика
На моторе написано 5.625°/64: это угол полушага ротора и передаточное число редуктора. Ротор делает 32 полных шага на оборот (64 полушага), дальше червячная передача с фактическим числом 1:63.684, в описаниях его округляют до 1:64. Честная арифметика на выходном валу: 32 × 63.684 ≈ 2038 полных шагов и 4076 полушагов на оборот. Знаменитые «2048 шагов» это то же число с округлением редуктора до 1:64, расхождение около 0,5 процента, то есть до десятка шагов за оборот. Для шторки или кормушки неважно, для поворотного столика, где обороты складываются в сотни, калибруйте по метке и считайте в своих шагах.
Скетч: полушаговая последовательность без библиотеки
// IN1->D8, IN2->D9, IN3->D10, IN4->D11const int PINS[4] = {8, 9, 10, 11}; // 8 фаз полушага, биты = IN1..IN4 (младший бит — IN1)const byte FAZY[8] = {1, 3, 2, 6, 4, 12, 8, 9}; void shag(long n) { byte faza = FAZY[n % 8]; for (int i = 0; i < 4; i++) { digitalWrite(PINS[i], bitRead(faza, i)); }} void setup() { Serial.begin(9600); for (int i = 0; i < 4; i++) { pinMode(PINS[i], OUTPUT); }} void loop() { Serial.println("vpered 1 oborot"); for (long s = 0; s < 4076; s++) { // 4076 полушагов = 360 градусов shag(s); delay(2); } delay(1000); Serial.println("nazad 1 oborot"); for (long s = 4075; s >= 0; s--) { shag(s); delay(2); } // отпускаем обмотки: минус 100-200 мА, вал крутится рукой for (int i = 0; i < 4; i++) { digitalWrite(PINS[i], LOW); } delay(2000);}Задержка 2 мс на полушаг даёт около 7 оборотов в минуту, далеко от потолка, зато с запасом по моменту. Потолок 28BYJ-48 при 5 В это 10–15 об/мин: выше вал срывается, мотор звенит и крутится рывками. Библиотека Stepper делает то же самое полными шагами: в конструкторе пишите Stepper stepper(2048, 8, 10, 9, 11). Порядок пинов IN1, IN3, IN2, IN4 не опечатка, библиотека шагает парами фаз и без перестановки вал стоит. Плавный разгон и неблокирующее вращение это уже AccelStepper, у нас есть урок про его установку и run().
| Критерий | Библиотека Stepper | Свой массив фаз |
|---|---|---|
| Режим | Полные шаги, две обмотки: момент выше | Полушаги: плавнее ход и тише |
| Порядок пинов | IN1, IN3, IN2, IN4, иначе не крутит | Любой, задаёте сами в массиве |
| Скорость | setSpeed(), step() блокирует loop() | Задержкой между полушагами, тоже блокирует |
| Ток покоя | Обмотки держатся после остановки | Обнулить пины, и мотор отпущен |
| Куда расти | AccelStepper: разгон, run() | Тот же AccelStepper или драйвер A4988 |
- После остановки обмотки остаются под током: 100–200 мА греют мотор и чип впустую, за час работы это ощутимый нагрев
- Отпустить: все четыре пина в LOW, вал крутится рукой, позиция не держится
- Оставить под током: для шторок и позиционных механизмов, где вал не должен проворачиваться
- Автоматизировать выключение через millis: урок про отключение катушек
Тупик: светодиоды горят, а вал стоит
Это симптом номер один, и мы проходили его много раз. Четыре красных светодиода на плате ULN2003 по очереди загораются, то есть драйвер получает команды и транзисторы открываются, а вал не двигается.
Причин две. Первая и самая частая: перепутаны два средних провода шлейфа, и фазы идут не по кругу, а зигзагом, из-за чего ротор застревает между двумя положениями. Помогает переставить IN2 и IN3, после чего мотор сразу идёт ровно. Вторая причина серьёзнее: обмотки не получают тока. Тогда светодиоды горят, потому что это индикаторы на входах, а не на обмотках, и мотор молчит. Проверяется мультиметром прямо на шлейфе: при активной фазе должно быть около 5 В между общим проводом и соответствующей обмоткой. Третий случай, который мы тоже видели, это перевёрнутый шлейф: красный общий провод ушёл не в центр разъёма, и обе обмотки оказались под напряжением постоянно.
Личный опыт: чем этот мотор хорош и где его предел
Мы использовали 28BYJ-48 для кормушки с дозировкой и для поворотного лотка, и в обеих задачах он оказался удобнее, чем сервопривод. Главное преимущество это удержание позиции: вал стоит точно там, куда его поставили, без постоянного питания обмоток и без лязга серво. Плюс к этому мотор крутится очень тихо, а для кормушки это важнее скорости.
Предел тоже обнаружился быстро. Задержку между шагами пришлось увеличить до 2 миллисекунд, потому что на более быстром ходу мотор начинал гудеть и пропускать шаги, а сила на валу всё равно оставалась небольшой. А из-за того что удержание даётся электрически, при остановке обмотки надо обесточивать, иначе мотор греется и заметно шумит. Мы добавили в скетч отключение катушек через пару секунд после последнего шага, и мотор перестал греться совсем.
Авторская позиция: какой привод взять
Мы советуем брать 28BYJ-48 с ULN2003 новичку, который хочет попробовать шаговый двигатель. Стоит это копейки, прошивка пишется за полчаса и не требует ничего, кроме четырёх свободных пинов и блока питания. Для учебных задач вроде кормушки, поворотного столика или механических часов его возможностей хватает.
Но если нужна настоящая сила или скорость, переходите на NEMA 17 с драйвером A4988 или DRV8825. Там шаг микрошагом до 1/16, момент кратно больше, а управление идёт двумя сигналами step и dir вместо четырёх. Чего делать не стоит: ставить L298N ради экономии, она греется сильнее и проигрывает по всем параметрам. И второе правило: не берите биполярный шаговик, если в проекте нет места для отдельного блока питания на 12 В и радиатора на драйвер, это уже другой класс проекта.