Первый раз, когда я подключил шаговик напрямую к пинам Arduino без всякой платы, закончился за четыре секунды: мотор дёрнулся, плата перезагрузилась, и один из пинов с тех пор врал на единицу в digitalRead. Хорошо, что обошлось без дырки в чипе — катушке нужно девяносто миллиампер, а пин выдерживает сорок, и разницу он не прощает. Плата ULN2003, которая продаётся в комплекте с каждым 28BYJ-48 за копейки, — не аксессуар, а единственный правильный способ связать мотор с платой.
При этом сама плата вызывает у новичков два вопроса, и оба я когда-то задавал в пустоту. Первый: зачем на ней четыре светодиода — для красоты? Второй: почему сигнальные провода идут не по порядку — IN1 на D8, IN2 на D10, IN3 на D9, IN4 на D11 — и можно ли это исправить? Здесь ответим на оба, распишем всю распиновку по проводам и сделаем первый поворот в симуляторе. К концу урока у вас будет полный чек-лист подключения: семь проводов, две земли и один рецепт, который не надо придумывать заново.
Физику шагов мы уже прошли в уроке про фазы, а мотор разобрали по шестерням в уроке про 28BYJ-48. Теперь между мотором и Arduino появится законный посредник.
Зачем между платой и мотором посредник
Две причины, обе фатальные. Первая — ток: катушка 28BYJ-48 ест около 90 мА, в полношаговом режиме работают сразу две, и это 180-200 мА. Пин Arduino отдаёт максимум 40 мА, и то не каждый — превышение греет выходной транзистор внутри микроконтроллера, и это та самая история с пином, который начал врать. Вторая причина — выбросы: обмотка — индуктивность, и когда вы её выключаете, поле схлопывается и выбрасывает на выводе выброс напряжения в десятки вольт, который убивает пин за один раз, не спрашивая.
ULN2003 — массив из семи транзисторных пар Дарлингтона. Каждая пара усиливает ток в сумме около тысячи раз: пину достаточно отдать несколько миллиампер на вход канала, чтобы канал открылся и повёл через себя амперы мотора. Канал включается не подачей плюса, а замыканием на землю — мотор своей катушкой подключён между плюсом питания и каналом, канал открывается — катушка получает минус и включается. Защитные диоды уже внутри микросхемы: они гасят выбросы обмоток, замыкая их на питание, и вывод COM на плате существует именно для этого — его соединяют с плюсом мотора.
Одна деталь, которую я долго не замечал: открытый канал Дарлингтона падает на себе около вольта. При пяти вольтах питания катушка видит четыре — мотор чуть слабее тянет, чем мог бы, и для 28BYJ-48 это некритично, а вот знать стоит: если когда-нибудь пересадите мотор на 12-вольтовую версию, потеря вольта на канале уже не спасёт от перегрузки, и питание придётся снижать.
Каналов у микросхемы семь, мотору нужно четыре — остальное остаётся на реле, зуммер или линейку светодиодов, и это удобно: одна микросхема тянет всю мелкую силовую нагрузку проекта. Но помните про рассеивание: пол-ампера на канал — паспорт одного канала при хорошем теплоотводе, а не обещание семи каналов по пол-ампера одновременно. Корпус без радиатора греется ощутимо уже на двух-трёх заряженных каналах, поэтому паспортные токи в даташите я для себя делю пополам и не жалею.
Что происходит без защиты, я проверил на своей шкуре, подключив мотор напрямую. Выброс от обмотки при выключении достигает десятков вольт: при питании от пяти вольт я ловил пики под шестьдесят. Микроконтроллер от таких пиков не умирает сразу — сначала деградируют выходные каскады отдельных пинов, потом начинаются самопроизвольные перезагрузки, и искать причину вы будете неделю. ULN2003 стоит копейки, а экономит плату за тысячи.
Теперь сама плата. На ней три смысловые зоны: микросхема ULN2003, белое пятипиновое гнездо для шлейфа мотора и ряд из четырёх входов IN1-IN4 с питанием и землёй. Светодиоды — по одному на канал, горят в такт включённым обмоткам: это не декорация, а главный диагностический инструмент, живой индикатор последовательности фаз. Перемычка питания на некоторых версиях платы разрывает плюс мотора — ей удобно отключать мотор, не выдёргивая шлейф.
Про качество платы пару слов. Дорожки на ней рассчитаны на ампер с запасом, а вот гнездо шлейфа — слабое место: пластиковый фиксатор разбалтывается от частых переподключений. Мой рецепт: воткнули шлейф до упора — и больше не трогайте, мотор живёт на плате, а все эксперименты ведутся на сигнальных проводах IN1-IN4. Перемычку, если она есть на вашей версии, оставьте на месте — она замыкает плюс мотора на шину питания платы.
Схема подключения целиком умещается в одну таблицу, и она стоит того, чтобы собрать её глазами, как мы учились в уроке про чтение схем: соберите один раз — и всё дальнейшее в разделе встанет на уже знакомую схему:
| Вывод платы ULN2003 | Куда подключить | Роль |
|---|---|---|
| IN1 | D8 | фаза A — включает первую обмотку |
| IN2 | D10 | фаза B — вторая обмотка |
| IN3 | D9 | фаза C — третья обмотка |
| IN4 | D11 | фаза D — четвёртая обмотка |
| Плюс питания (12V/5V, COM) | 5 В от отдельного источника | общий плюс всех катушек |
| GND | GND Arduino и минус источника | общая земля — обязательна |
| Белое гнездо | шлейф 28BYJ-48 | красный провод — плюс, остальные — фазы |
Порядок IN1 на D8, IN2 на D10, IN3 на D9, IN4 на D11 выглядит как опечатка, а на деле — договорённость. Библиотека Stepper внутри переключает фазы в своей последовательности, и порядок пинов в конструкторе Stepper(2048, 8, 10, 9, 11) подогнан под неё так, чтобы круг замыкался правильно. Скажете плате другие пины — мотор не сломается, просто круг фаз перепутается, и мы получим тот самый вибростенд из первого урока про фазы. Рецепт 8-10-9-11 — стандарт, на котором не спотыкается ни один скетч из интернета, и я советую держать его и в своих проектах: меньше перестановок — меньше шансов склеить чужой код со своей схемой.
Светодиоды на плате — ваш осциллограф. При правильном скетче они мигают строго по кругу: IN1, IN2, IN3, IN4, снова IN1. Две горят постоянно при стоящем моторе — обмотки держат позицию, это ток удержания, о котором мы говорили в уроке про 28BYJ-48. Мигают хаотично — битый порядок фаз. Не горят вообще — смотрите питание и землю: чаще всего мотор просто не подключён к минусу общего провода. Мой тест при сборке: запускаю скетч ниже, слегка придерживаю вал пальцем — светодиоды продолжают бег, а вал проворачивается рывками. Значит, момент есть, порядок живой, и связку можно прятать в корпус.
#include <Stepper.h> const int STEPS_PER_REV = 2048; // порядок пинов: IN1 -> D8, IN2 -> D10, IN3 -> D9, IN4 -> D11Stepper stepper(STEPS_PER_REV, 8, 10, 9, 11); int pos = 0; void report(String tag) { Serial.print(tag); Serial.print(" pos="); Serial.println(pos);} void setup() { stepper.setSpeed(5); Serial.begin(9600); Serial.println("Pervyi povorot gotov");} void loop() { stepper.step(512); // четверть оборота по часовой pos += 512; report("fwd"); delay(1000); stepper.step(-512); // четверть оборота обратно pos -= 512; report("bwd"); delay(1000);}Первый запуск и что дальше
- Пин отдаёт 40 мА, катушке нужно 90 — посредник не опция, а защита микроконтроллера
- ULN2003 — семь каналов Дарлингтона: усиление около тысячи раз, защитные диоды внутри, COM идёт на плюс питания
- Открытый канал съедает около 1 В: при 5 В катушка видит четыре
- Рецепт подключения: IN1-D8, IN2-D10, IN3-D9, IN4-D11 — под внутреннюю последовательность библиотеки Stepper
- Светодиоды платы — диагностический инструмент: круг = порядок жив, две горят = удержание, хаос = битые фазы
- Светодиоды бегут, а вал стоит — ищите разрыв в силовой части: гнездо шлейфа или общая земля
- 1. Что случится, если подключить катушку 28BYJ-48 прямо к пину Arduino?
- 2. Открытый канал Дарлингтона падает на себе около 1 В. Сколько увидит катушка при питании 5 В?
- 3. Куда подключается IN2 в стандартном рецепте?
- 4. Светодиоды на ULN2003 мигают ровно по кругу IN1-IN2-IN3-IN4, вал стоит. Где искать?
- 5. Сколько времени займёт step(2048) при setSpeed(5)?
Связка собрана полностью: мотор, драйвер, четыре огонька и первый поворот с честным логом позиции. Светодиоды к этому моменту вы читаете бегло — это половина умения работать с шаговиками. Дальше по разделу — скорость и точность: вымеряем предел своего экземпляра, переводим углы в шаги и делаем движение туда-обратно, которое не замораживает плату. Второй урок раздела ждёт вас со всеми числами.
Частые вопросы по теме урока
- Что случится, если подключить катушку 28BYJ-48 прямо к пину Arduino?
- Пин способен отдать до 40 мА. Катушке нужно около 90, в полношаговом режиме двум катушкам — до 200. Без драйвера пин деградирует. Пин перегрузится: ему нужно 40 мА максимум, а катушке — 90
- Открытый канал Дарлингтона падает на себе около 1 В. Сколько увидит катушка при питании 5 В?
- Пять вольт минус падение на канале — порядка четырёх. Для 28BYJ-48 некритично, но момент немного ниже идеала, а потерянный вольт греет саму микросхему. Около 4 В
- Куда подключается IN2 в стандартном рецепте?
- Порядок 8, 10, 9, 11 подгоняет пины под внутреннюю последовательность фаз библиотеки Stepper. IN2 идёт на D10. D10
- Светодиоды на ULN2003 мигают ровно по кругу IN1-IN2-IN3-IN4, вал стоит. Где искать?
- Правильный круг светодиодов означает, что управляющая часть жива. Мотор молчит — разрыв между драйвером и катушками или общий минус не соединён. В силовой части: шлейф в гнезде не до конца или нет общей земли
- Сколько времени займёт step(2048) при setSpeed(5)?
- 5 RPM — оборот за 60 секунд. step() возвращается после последнего шага: минута без кнопок, без Serial, без датчиков. Около минуты, и всё это время loop() заблокирован