Шаговый двигатель 28BYJ-48 с драйвером ULN2003: обзор и подключение

Если нужно повернуть вал строго на заданный угол — шторка, задвижка, дозатор корма — берите шаговый мотор. Самый доступный вариант из наборов Arduino — 28BYJ-48: редукторный мотор с платкой драйвера ULN2003 в комплекте. Пара стоит втрое дешевле сервопривода, а точность выше: 4096 полушагов на оборот, то есть 0,088° на полушаг.
Обратная сторона — скорость: внутри редуктор 1:64, реально выжать 7–15 об/мин. Зато позиционирование точное. Разбираем паспорт, подключение и почему без ULN2003 мотор включать нельзя.
Что внутри и что говорит паспорт
28BYJ-48 — униполярный четырёхфазный шаговый мотор: четыре обмотки с общей точкой (красный провод), примерно 82 мА на фазу при 5 В. Диаметр корпуса 28 мм, наружу выходят пять проводов. Редуктор 1:64: ротор шагает по 5,625°, вал — в 64 раза меньше, по 0,088°. Запись «stride angle 5.625°/64» в паспорте — угол ротора и передаточное число, а не угол вала.
| Параметр | Значение (datasheet 28BYJ-48, 5 В) |
|---|---|
| Номинальное напряжение | 5 В DC |
| Число фаз | 4 |
| Передаточное отношение | 1/64 |
| Угол шага | 5,625°/64 (0,088° на валу) |
| Сопротивление обмотки | 50 Ом ±7 % (25 °C) |
| Частота (номинал) | 100 Гц |
| Частота втягивания, без нагрузки | > 600 Гц |
| Частота выпадения, без нагрузки | > 1000 Гц |
| Момент втягивания | > 34,3 мН·м (120 Гц) |
| Момент самопозиции (удержание) | > 34,3 мН·м |
| Момент трения | 600–1200 gf·см |
| Pull in torque | 300 gf·см |
| Нагрев | < 40 K (120 Гц) |
| Шум | < 35 дБ (120 Гц, без нагрузки, 10 см) |
| Сопротивление изоляции | > 10 МОм (500 В) |
| Класс изоляции | A |
Ток фазы считается прямо из паспорта: 5 В на обмотку 50 Ом даёт потолок 100 мА, за вычетом падения на ключе ULN2003 — около 82 мА на канал. Включённая обмотка рассеивает 0,41 Вт, поэтому тёплый корпус — норма, а обжигающий — признак того, что мотор забыли обесточить.
ULN2003: почему без него нельзя
Пин микроконтроллера выдаёт 20–40 мА — обмотке мало, порт выгорит. ULN2003A — семь Дарлингтон-ключей с открытым коллектором: единица на входе — выход подтягивается к GND и замыкает обмотку. Красный провод сидит на +5 В, фазы закорачиваются на землю по очереди. Выбросы самоиндукции гасят встроенные защитные диоды, внешние элементы не нужны.
| Параметр | Значение (datasheet TI ULN2003A) |
|---|---|
| Каналов | 7 Дарлингтонов |
| Ток канала | до 500 мА (600 мА пик) |
| Выходное напряжение | 50 В |
| VCE(sat) при 100 мА | 0,9–1,1 В |
| Вход | TTL/CMOS 5 В и 3,3 В |
| Защитные диоды | на каждом выходе |
Запас по току шестикратный: 82 мА фактических против 500 мА лимита. Четыре фазы занимают четыре канала из семи, остальные свободны.
Подключение к Arduino и ESP32
Разъём мотора вставляется в гнездо платы ULN2003 (ключ не даст перепутать), от платы к контроллеру идут шесть проводов: четыре входа, земля и плюс питания.
Arduino UNO / ESP32 Плата ULN2003 ------------------- ------------- D8 / GPIO25 ---------> IN1 D9 / GPIO26 ---------> IN2 D10 / GPIO27 ---------> IN3 D11 / GPIO14 ---------> IN4 GND ---------> GND (минус) 5 В ---------> «+» (5–12 В)
Плюс на плате — общий провод мотора (красный), минус — земля. Питание — от 5 В Arduino или отдельного блока: от 3,3-вольтовой шины ESP32 мотор не поедет, катушкам нужны честные 5 В по 82 мА на фазу. Земли контроллера и драйвера соединяются всегда.
Код: полный шаг, полушаг и сколько это оборотов
Классическая таблица полушага — восемь состояний четырёх фаз. Пауза между шагами задаёт скорость: 2 мс — около 7 об/мин, 1 мс — предельные 15.
// Пины в порядке фаз A, B, C, D
// Arduino UNO: 8, 9, 10, 11
// ESP32: 25, 26, 27, 14
const uint8_t PINS[4] = {8, 9, 10, 11};
// Таблица полушага: состояния пинов A, B, C, D
const uint8_t HALFSTEP[8] = {
0b1000, // A
0b1100, // A + B
0b0100, // B
0b0110, // B + C
0b0010, // C
0b0011, // C + D
0b0001, // D
0b1001 // D + A
};
const unsigned int STEPS_PER_REV = 4096; // 5,625°/64
void halfStep(int dir, unsigned int steps, int pauseMs) {
static int phase = 0;
for (unsigned int i = 0; i < steps; i++) {
phase = (phase + dir + 8) % 8;
for (int p = 0; p < 4; p++)
digitalWrite(PINS[p], (HALFSTEP[phase] >> (3 - p)) & 1);
delay(pauseMs); // 2 мс ~ 7 об/мин
}
}
void motorOff() { // снять ток с обмоток
for (int p = 0; p < 4; p++) digitalWrite(PINS[p], LOW);
}
void setup() {
for (int p = 0; p < 4; p++) pinMode(PINS[p], OUTPUT);
}
void loop() {
halfStep(+1, STEPS_PER_REV, 2); // оборот вправо
delay(500);
halfStep(-1, STEPS_PER_REV / 4, 2); // четверть обратно
motorOff();
delay(3000);
}
Для ESP32 поменяйте пины на {25, 26, 27, 14}: логика та же, 3,3 В на входах ULN2003A достаточно. Крутится не туда — смените знак dir или порядок пинов.
Сколько выдержит: скорость и момент
Паспортные частоты означают: без потери шагов мотор стартует до 600 полушагов в секунду (около 9 об/мин), срыв наступает после 1000 Гц (15 об/мин). Надёжный режим — 2–3 мс на полушаг. Момент втягивания и удержание — больше 34,3 мН·м при 120 Гц: застопоренный вал держит нагрузку сам. Тугой хруст при вращении рукой — момент трения 600–1200 gf·см. Если мотор гудит под нагрузкой — снизьте скорость: выше 120 Гц момент падает.
Частые ошибки
- Питание мотора от 3,3 В ESP32. Не поедет: катушке нужны 5 В и 82 мА.
- Провода фаз перепутаны. Мотор дёргается и гудит на месте. Красный — общий, остальные четыре идут строго по порядку разъёма.
- Забыли общий GND. При внешнем питании мотора земля контроллера и земля драйвера обязаны соединяться — иначе входы «висят в воздухе» и шаги случайные.
- Обмотки под током после остановки. 0,41 Вт на катушку греет корпус и чип. Снимайте сигналы после движения, как в motorOff().
- Слишком короткая пауза. Меньше 1 мс на полушаг — мотор пропускает шаги и трещит на месте: 1000 Гц — паспортный предел выпадения.
- Просадка питания. Мотор и ESP32 от одного USB — плата перезагружается при старте. Двигателю — отдельный БП, земли общие.
Итог: 28BYJ-48 с ULN2003 — самый дешёвый способ точного позиционирования. Когда нужен угол по сигналу без счёта шагов — ближе сервопривод; просто включать и выключать нагрузку — проще реле из обзора реле на 1, 2 и 4 канала. А в умной розетке на ESP32 то же реле уже переключается из браузера.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.