Руководства · 14 мин чтения

DC-мотор, сервопривод и шаговый двигатель: в чём разница и что выбрать

Чем отличаются DC-мотор, сервопривод и шаговый двигатель: скорость, момент и точность, драйверы L298N, ULN2003 и A4988, потребление тока, BLDC и ESC и что где применять.

Разница между DC-мотором, сервоприводом и шаговым двигателем умещается в одно предложение: DC-мотор вращается непрерывно и быстро, пока на него подаётся питание, сервопривод поворачивается на заданный угол и удерживает его, а шаговый двигатель вращается маленькими шагами, которые можно сосчитать. Значит, чтобы крутить колесо, выбирают DC-мотор; чтобы открыть крышку на 90 градусов, сервопривод; чтобы передвинуть деталь с точностью до десятой доли миллиметра, шаговый двигатель. Везде, где в проекте на Arduino, ESP32 или Raspberry Pi Pico что-то должно двигаться, встретится один из этих трёх моторов.

В этом руководстве сравним, что находится внутри каждого мотора, реальные цифры скорости, момента и точности позиционирования популярных моделей (TT-мотор, SG90, MG996R, 28BYJ-48, NEMA 17), какой драйвер нужен каждому (L298N, сигнал PWM, ULN2003, A4988), сколько тока они потребляют и где какой используется. В конце есть код для Arduino, ESP32 и Pico, который управляет всеми тремя сразу, короткое знакомство с бесколлекторными моторами (BLDC) и ESC, а также самые частые ошибки.

DC-мотор (TT)
DC-мотор (TT)
Сервопривод SG90
Сервопривод SG90
Сервопривод MG996R
Сервопривод MG996R
28BYJ-48 и ULN2003
28BYJ-48 и ULN2003

Коротко: три мотора в одной таблице

ХарактеристикаDC-моторСервоприводШаговый двигатель
ДвижениеВращается непрерывноПоворачивается на заданный угол и удерживает его (обычно 0–180°)Вращается по шагам, без ограничения по оборотам
Чем управляешьСкорость и направлениеУгол (положение)Число шагов и частота шагов
Обратная связьНет (добавляется энкодером)Есть: встроенный потенциометрНет (разомкнутый контур)
СкоростьОчень высокая (тысячи об/мин без редуктора)Средняя (SG90: 0,1 с/60°)От низкой до средней, с ростом скорости момент падает
Крутящий моментЗависит от редуктораВысокий для своего размера (благодаря редуктору)Высокий на малой скорости, держит и в остановке
Точность позиционированияНетОколо 1°1,8° (с микрошагом намного точнее)
В остановкеВал вращается свободноАктивно удерживает положениеЗафиксирован, пока на обмотки подаётся ток
ДрайверH-мост (L298N, L9110S) или MOSFETНе нужен, сигнал прямо с пинаULN2003 или A4988, DRV8825
Провода23 (GND, +, сигнал)4 или 5 (иногда 6)
Типичное применениеКолёса, вентиляторы, насосыРоботы-манипуляторы, дверные защёлки, радар3D-принтеры, ЧПУ, слайдеры для камеры

Самая важная строка в таблице: обратная связь. Сервопривод знает, где находится, благодаря встроенному потенциометру, и если его сдвинуть, он возвращается в своё положение. Шаговый двигатель не знает, где находится; ты просто считаешь, сколько шагов сделано, и это число верно, пока мотор не перегружен и не пропускает шаги. DC-мотор вообще не знает, на сколько повернулся; если нужно положение, на его вал придётся поставить энкодер. Выбор мотора во многом зависит от того, нужна ли проекту эта информация.

Как работает DC-мотор?

Почти все DC-моторы в любительских проектах относятся к коллекторным (щёточным) DC-моторам. Внутри находятся неподвижные магниты и вращающаяся обмотка (ротор); угольные щётки и медный коллектор переключают направление тока по мере вращения ротора, поэтому он не останавливается. У мотора два провода: подай напряжение, и он вращается, поменяй провода местами, и он вращается в другую сторону. Напряжение задаёт скорость, а потребляемый ток определяет момент. Пока мотор вращается, в обмотках возникает встречное напряжение, противо-ЭДС, которое ограничивает ток; если вал заблокирован, противо-ЭДС исчезает и ток подскакивает до тока при заторможенном валу (stall current).

TT DC-мотор с редуктором и колесо
Классический мотор для машинок-роботов: TT-мотор с пластиковым редуктором 1:48. При 6 V без нагрузки он даёт около 200–250 об/мин, потребляет 150 mA на холостом ходу и до 1,5 A при заторможенном валу.

Маленький DC-мотор без редуктора вращается со скоростью в тысячи об/мин, но момент у него очень мал, поэтому в роботах всегда ставят моторы с редуктором. Редуктор 1:48 в TT-моторе снижает примерно 12 000 об/мин на валу мотора до 250 об/мин на колесе и при этом увеличивает момент примерно в 48 раз (за вычетом потерь в шестернях). Скорость меняют с помощью PWM, а направление через H-мост; подробности в статье Управление DC-мотором через L298N. Слабое место DC-мотора: положение. Одно и то же значение PWM даёт разную скорость в зависимости от напряжения батареи и нагрузки, поэтому команда «ехать вперёд 2 секунды» каждый раз даёт другое расстояние. Если нужно точное расстояние, на колесо ставят энкодер.

Как работает сервопривод?

Сервопривод на самом деле целая система в маленьком корпусе: DC-мотор, редуктор, который снижает скорость и повышает момент, потенциометр на выходном валу и плата управления. Arduino передаёт сервоприводу не сам угол, а импульс с частотой 50 Hz (раз в 20 мс); ширина импульса описывает нужное положение. Плата управления сравнивает это целевое значение с реальным положением, считанным с потенциометра, и вращает мотор в нужную сторону, пока разница не станет нулевой. Это называется управлением с замкнутым контуром, и именно поэтому сервопривод сопротивляется, если повернуть его рукой.

Микросервопривод SG90
Микросервопривод SG90: около 9 граммов, момент 1,8 кг·см и скорость 0,1 с/60° при 4,8 V. Коричневый провод GND, красный +5 V, оранжевый сигнальный.
УстройствоЧто означает ширина импульсаПример
Обычный сервопривод (180°)Угол: около 1 мс одно крайнее положение, 1,5 мс середина, 2 мс другое крайнее положениеSG90, MG90S, MG996R
Сервопривод постоянного вращения (360°)Скорость и направление: 1,5 мс стоп, короче в одну сторону, длиннее в другуюFS90R
ESC и бесколлекторный моторГаз: 1 мс стоп, 2 мс полный газESC для дронов и RC-моделей

Стандартный диапазон RC: 1–2 мс, но большинству дешёвых сервоприводов вроде SG90 для полных 180° нужно примерно 0,5–2,4 мс, а библиотека Servo в Arduino по умолчанию использует 544–2400 µs. Мёртвая зона SG90, то есть самое маленькое изменение, на которое он реагирует, около 10 µs, что соответствует примерно 1°; поэтому практическая точность сервопривода около одного градуса. Сервопривод постоянного вращения (FS90R) это сервопривод с отключённой обратной связью: управляешь не углом, а скоростью и направлением, и информация о положении теряется. Если нужно больше силы, стандартный выбор: MG996R с металлическими шестернями; основы описаны в статье Что такое сервопривод?

Как работает шаговый двигатель?

У шагового двигателя нет щёток. Обмотки в корпусе включаются в определённом порядке, и магнитный ротор каждый раз делает один шаг к следующей обмотке. У самых распространённых гибридных шаговых двигателей 200 шагов на оборот, то есть 1,8° на шаг. Сколько импульсов отправишь, столько шагов он и сделает; чем чаще импульсы, тем быстрее вращение. Пока на обмотки подаётся ток, мотор зафиксирован на месте; это называется моментом удержания. Ключевое отличие: шаговый двигатель работает с разомкнутым контуром. Если нагрузка превышает его момент, он пропускает шаги, и Arduino этого никогда не заметит. Поэтому 3D-принтеры при включении доводят каждую ось до концевого выключателя (homing, поиск нуля).

Шаговый двигатель 28BYJ-48 и плата драйвера ULN2003
28BYJ-48 и плата ULN2003: самый дешёвый шаговый двигатель для начала, работает от 5 V и благодаря встроенному редуктору делает около 2048 шагов на оборот. 4 светодиода на плате показывают, какая обмотка под током.

Встречаются два типа шаговых двигателей. У униполярных моторов (28BYJ-48, 5 проводов) есть общий провод для обмоток, и ими управляет простая транзисторная сборка вроде ULN2003. Биполярным моторам (NEMA 17, 4 провода) нужно менять направление тока в обмотках, и это делают драйверы с ограничением тока, такие как A4988, DRV8825 или TMC2209. Эти драйверы умеют и микрошаг: A4988 делит каждый полный шаг на 16 частей, число шагов на оборот вырастает до 3200, а движение становится намного тише и плавнее. Подробности в статьях 28BYJ-48 и ULN2003 и драйвер шагового двигателя A4988.

Скорость, момент и точность позиционирования: цифры

МодельПитаниеСкоростьМоментТочностьТок
TT DC-мотор (1:48)3–6 V≈ 200–250 об/мин (6 V, без нагрузки)0,8 кг·см (6 V, заторможенный вал)Нет (нужен энкодер)150 mA на холостом ходу, 1,5 A при заторможенном валу
Сервопривод SG904,8–6 V0,1 с / 60°1,8 кг·см≈ 1°В покое очень мало, в движении может превышать 0,5 A
Сервопривод MG996R4,8–7,2 V0,17 с / 60° (4,8 V)9,4–11 кг·см≈ 1°0,5–0,9 A в работе, 2,5 A при заторможенном валу
Шаговый 28BYJ-485 V≈ 10–15 об/мин≈ 0,3 кг·см≈ 0,18° (2048 шагов/оборот)150–200 mA, даже в остановке
Шаговый NEMA 17 (17HS4401)12–24 V (с A4988)Несколько сотен об/мин≈ 4 кг·см (0,4 Н·м) удержания1,8°; 0,1125° при микрошаге 1/16До 1,7 A на фазу, задаётся через Vref

Момент обычно указывают в кг·см: мотор на 1 кг·см удержит груз 1 кг на расстоянии 1 см от вала, но на 2 см только 0,5 кг (1 кг·см ≈ 0,098 Н·м). Например, MG996R при 6 V развивает 11 кг·см; на конце рычага длиной 15 см он теоретически удержит 11 / 15 ≈ 0,73 кг. Но это пиковый момент, который мотор развивает, когда вал уже заторможен, а к нагрузке добавляется ещё и вес самого рычага. Хорошее правило для долгой жизни мотора: оставаться ниже половины этого значения, так что на практике на конце такого рычага можно нести несколько сотен граммов.

По скорости расклад обратный. DC-мотор с большим отрывом самый быстрый. Сервопривод SG90 проходит 180° примерно за 0,3 секунды и быстрее не может. У шагового двигателя момент падает с ростом скорости, потому что ток в обмотке не успевает полностью нарасти на каждом шаге; 28BYJ-48 начинает пропускать шаги выше примерно 15 об/мин. Если питать NEMA 17 на A4988 от 24 V вместо 12 V, на высокой скорости момент будет больше, потому что драйвер всё равно ограничивает ток. А вот по точности выигрывает шаговый двигатель: NEMA 17 даёт 1,8° в полношаговом режиме и, на бумаге, 0,1125° при микрошаге 1/16. Небольшое замечание: передаточное число редуктора 28BYJ-48 не ровно 1:64, а примерно 1:63,68, поэтому реальный оборот около 2038 шагов, а не 2048; в проектах с постоянным вращением, например в часах, эта разница накапливается.

Какой драйвер нужен каждому мотору?

Пин Arduino выдаёт максимум 40 mA, а безопасный предел около 20 mA; даже маленький TT-мотор на холостом ходу потребляет примерно в 7 раз больше, а при заторможенном валу больше чем в 70 раз. Вдобавок обмотка мотора в момент отключения тока выдаёт высокий выброс обратного напряжения, который может сжечь незащищённый пин. Поэтому между мотором и платой всегда стоит драйвер: плата подаёт только слабые управляющие сигналы, а ток мотора идёт напрямую от источника питания через драйвер. Внутри драйверов есть транзисторы и диоды, которые гасят обратное напряжение. Для вентилятора или насоса, который вращается только в одну сторону, достаточно одного MOSFET.

МоторДрайверСо стороны ArduinoПримечание
DC-мотор, одно направлениеMOSFET (например, IRLZ44N) и диод1 пин PWMВентиляторы, насосы, вибромоторы
DC-мотор, оба направленияL298N, L9110S, TB6612FNG2 пина направления и 1 пин PWMH-мост меняет направление, PWM задаёт скорость
СервоприводНе нужен (встроен)1 пин, сигнал 50 HzДля множества сервоприводов: плата PCA9685 (16 каналов, I2C)
Униполярный шаговый (28BYJ-48)ULN20034 пинаВключает обмотки по очереди, 500 mA на канал
Биполярный шаговый (NEMA 17)A4988, DRV8825, TMC22092 пина (STEP, DIR)Ограничение тока задаётся через Vref, умеет микрошаг
Бесколлекторный мотор (BLDC)ESC1 пин, сигнал как у сервоприводаДопустимый ток должен подходить мотору (например, 30 A)
Модуль драйвера шагового двигателя A4988
Драйвер шагового двигателя A4988: питание мотора 8–35 V, около 1 A на фазу без радиатора и микрошаг до 1/16. Маленький подстроечный резистор сверху задаёт ограничение тока (Vref).
На Arduino Uno библиотека Servo использует Timer1, поэтому, как только подключён первый сервопривод, analogWrite (PWM) перестаёт работать на пинах 9 и 10, независимо от того, на каком пине сам сервопривод. Если пин ENA или ENB модуля L298N подключён к 9 или 10, скорость мотора будет меняться не так, как ожидается. Если вместе с сервоприводом нужно регулировать скорость DC-мотора, используй для PWM пины 3, 5, 6 или 11.

Потребление: сколько тока берёт каждый мотор?

По току три мотора ведут себя очень по-разному, и источник питания нужно выбирать с учётом этого. DC-мотор потребляет тем больше тока, чем выше нагрузка; при старте и когда колесо заклинивает, ток приближается к току при заторможенном валу. Рассчитывай источник на этот пик, а не на ток холостого хода. Сервопривод в ожидании потребляет очень мало, но при каждом движении даёт короткие резкие броски тока: даже один SG90 может кратковременно превысить 0,5 A, а MG996R под нагрузкой доходит до 2,5 A. Эти броски просаживают напряжение и перезагружают Arduino или вызывают на ESP32 ошибку brownout (просадка питания). У шагового двигателя, наоборот, ток течёт через обмотки, даже когда он совсем не двигается: 28BYJ-48 в остановке потребляет 150–200 mA и нагревается. В проектах на батарейках, если момент удержания не нужен, отключение обмоток (на A4988 пин EN в HIGH) заметно продлевает работу от батареи.

  • Отдельное питание: не питай моторы от пина 5V на Arduino. USB-порт выдаёт около 500 mA, и часть из них уже расходует сама плата; кроме одного маленького сервопривода, каждому мотору нужен свой источник.
  • Соедини земли: минус источника питания моторов обязательно соединяется с GND платы, иначе у управляющего сигнала нет опорного уровня (см. общая земля).
  • Добавь конденсаторы: поставь электролитический на 470–1000 µF на линию питания сервопривода, не меньше 47 µF на вход VMOT драйвера A4988 и керамический конденсатор на 100 nF прямо на выводы коллекторного DC-мотора. Первый уменьшает просадки напряжения, последний снижает помехи от щёток.
  • Рассчитывай источник на пиковый ток: например, роботу-манипулятору с 4 сервоприводами нужен источник на 5–6 V, способный выдать не меньше 3 A, а машинке с двумя TT-моторами нужна батарея, которая выдерживает 2 × 1,5 A. Сколько продержится батарея, можно рассчитать калькулятором времени работы от батареи.
  • Понижай напряжение правильно: если от сборки на 7,4 V нужно получить 5–6 V для сервоприводов, используй импульсный понижающий преобразователь вроде LM2596; линейные стабилизаторы вроде 7805 сильно греются при токах порядка ампера.

Три мотора на одном Arduino: пошагово

Лучший способ увидеть разницу: запустить все три рядом. В схеме ниже TT-мотором управляет L298N, SG90 подключён прямо к пину, а 28BYJ-48 работает через плату ULN2003. Таблица пинов подходит ко всем трём примерам кода: Arduino Uno, ESP32 и Raspberry Pi Pico.

ПодключениеArduino UnoESP32Raspberry Pi Pico
L298N ENA (скорость, PWM)D5GPIO 25GP15
L298N IN1D7GPIO 26GP14
L298N IN2D8GPIO 27GP13
Сигнал сервопривода (оранжевый)D9GPIO 18GP16
ULN2003 IN1D10GPIO 19GP2
ULN2003 IN2D11GPIO 21GP3
ULN2003 IN3D12GPIO 22GP4
ULN2003 IN4D13GPIO 23GP5
GND (всех источников)GNDGNDGND
  1. Сними перемычку ENA на L298N; подключи ENA, IN1 и IN2 к пинам из таблицы, а DC-мотор к клеммам OUT1 и OUT2. Питание мотора (например, два последовательных аккумулятора 18650, 7,4 V) подай на клемму 12V.
  2. Подключи коричневый провод сервопривода к GND, красный к отдельному источнику на 5–6 V, а оранжевый сигнальный к D9.
  3. Вставь белый разъём 28BYJ-48 в плату ULN2003, подключи IN1–IN4 к D10–D13 и подай на клемму + платы питание 5 V.
  4. Соедини между собой минусы всех источников и GND Arduino.
  5. Загрузи код через Arduino IDE; библиотеки Servo и Stepper входят в состав IDE, устанавливать их отдельно не нужно.
  6. Включи питание моторов и посмотри, как три мотора ведут себя по очереди.
C++ (Arduino IDE)
1#include <Servo.h>
2#include <Stepper.h>
3
4// DC motor (L298N): ENA=5, IN1=7, IN2=8
5const int ENA = 5;                 // PWM; Servo kütüphanesi 9 ve 10'un PWM'ini kapatır / Servo library disables PWM on 9 and 10
6const int IN1 = 7;
7const int IN2 = 8;
8
9const int SERVO_PIN = 9;           // servo sinyali / servo signal
10Servo servo;
11
12const int STEPS_PER_REV = 2048;    // 28BYJ-48 tam tur / full revolution
13Stepper stepper(STEPS_PER_REV, 10, 12, 11, 13);   // sıra: IN1, IN3, IN2, IN4 / order: IN1, IN3, IN2, IN4
14
15void releaseStepper() {            // bobinleri bırak, boşta akım çekmesin / release coils, no idle current
16  for (int pin = 10; pin <= 13; pin++) {
17    digitalWrite(pin, LOW);
18  }
19}
20
21void setup() {
22  pinMode(ENA, OUTPUT);
23  pinMode(IN1, OUTPUT);
24  pinMode(IN2, OUTPUT);
25  servo.attach(SERVO_PIN);
26  stepper.setSpeed(10);            // devir/dakika, 28BYJ-48 için en fazla ~15 / RPM, max ~15 for 28BYJ-48
27}
28
29void loop() {
30  // 1) DC motor: hız ve yön, konum yok / speed and direction, no position
31  digitalWrite(IN1, HIGH);
32  digitalWrite(IN2, LOW);
33  analogWrite(ENA, 180);           // yaklaşık %70 güç / about 70% power
34  delay(2000);
35  analogWrite(ENA, 0);             // motoru serbest bırak / let the motor coast
36  delay(500);
37
38  // 2) Servo: açı ver, gidip orada kalsın / give an angle, it goes there and holds
39  servo.write(0);
40  delay(600);
41  servo.write(180);
42  delay(600);
43  servo.write(90);
44  delay(600);
45
46  // 3) Step motor: tam çeyrek tur ileri ve geri / exactly a quarter turn forward and back
47  stepper.step(STEPS_PER_REV / 4);   // 512 adım = 90° / 512 steps = 90°
48  delay(500);
49  stepper.step(-STEPS_PER_REV / 4);
50  releaseStepper();
51  delay(1000);
52}
СтрокаМоторЧто делает
digitalWrite(IN1/IN2) (направление)DC-моторЗадаёт направление: HIGH-LOW вперёд, LOW-HIGH назад
analogWrite(ENA, 180) (скорость)DC-моторЗадаёт скорость: 180 / 255 ≈ 70% мощности; где остановится вал, неизвестно
servo.write(90) (угол)СервоприводПоворачивает сервопривод на 90° и удерживает там, пока идёт сигнал
stepper.setSpeed(10) (скорость)ШаговыйЗадаёт время между шагами для 10 оборотов в минуту
stepper.step(512) (шаги)ШаговыйДелает ровно 512 шагов (90°); блокирует код до завершения
releaseStepper() (отключение обмоток)ШаговыйОтключает все четыре обмотки; вал вращается свободно, ток не потребляется

После запуска кода разница очевидна: DC-мотор вращается две секунды, но его вал каждый раз останавливается в другой точке. Сервопривод резко встаёт на 0°, 180° и 90° и сопротивляется, если попробовать повернуть его рукой. Шаговый двигатель медленно проходит ровно четверть оборота и возвращается в ту же точку; после вызова releaseStepper() его вал легко крутится рукой. Функция step() библиотеки Stepper блокирует код, пока движение не закончится; чтобы управлять несколькими моторами одновременно и с плавным разгоном, переходи на библиотеку AccelStepper.

DC-мотор, сервопривод и шаговый двигатель с ESP32

Пины ESP32 выдают 3,3 V; входы L298N и ULN2003 воспринимают этот уровень как HIGH, и сервоприводы тоже работают с сигналом 3,3 V. Моторам всё так же нужно своё питание. Разница в сервоприводе: стандартная библиотека Servo для Arduino не поддерживает ESP32. Можно установить библиотеку ESP32Servo или, как ниже, сформировать сигнал 50 Hz самостоятельно с помощью аппаратного модуля PWM в ESP32, LEDC. Так как используются две разные частоты, 1 kHz для DC-мотора и 50 Hz для сервопривода, каналы назначаются на разные таймеры (каналы 0 и 2) через ledcAttachChannel; в некоторых версиях ядра соседние каналы делят один таймер. Код рассчитан на ядро ESP32 Arduino 3.x; в версиях 2.x вместо этого используются ledcSetup и ledcAttachPin. Библиотека Stepper работает на ESP32 без изменений; если эта плата пока в новинку, загляни в статью Что такое ESP32?

C++ (Arduino IDE)
1#include <Stepper.h>
2
3// ESP32 Arduino çekirdeği 3.x / ESP32 Arduino core 3.x
4const int ENA = 25;                // L298N hız (PWM) / L298N speed (PWM)
5const int IN1 = 26;
6const int IN2 = 27;
7const int SERVO_PIN = 18;          // servo sinyali / servo signal
8
9const int STEPS_PER_REV = 2048;
10Stepper stepper(STEPS_PER_REV, 19, 22, 21, 23);   // sıra: IN1, IN3, IN2, IN4 / order: IN1, IN3, IN2, IN4
11
12void motor(int speed) {            // -255 … 255
13  digitalWrite(IN1, speed > 0);
14  digitalWrite(IN2, speed < 0);
15  ledcWrite(ENA, abs(speed));
16}
17
18void servoWrite(int angle) {       // 0 … 180
19  int us = map(angle, 0, 180, 500, 2400);              // açı → darbe (µs) / angle → pulse (µs)
20  ledcWrite(SERVO_PIN, (uint32_t)us * 65535 / 20000);  // 20 ms içindeki pay / share of the 20 ms period
21}
22
23void setup() {
24  pinMode(IN1, OUTPUT);
25  pinMode(IN2, OUTPUT);
26  ledcAttachChannel(ENA, 1000, 8, 0);        // kanal 0: 1 kHz, 8 bit (0–255) / channel 0: 1 kHz, 8-bit
27  ledcAttachChannel(SERVO_PIN, 50, 16, 2);   // kanal 2, ayrı zamanlayıcı: 50 Hz, 16 bit / channel 2, separate timer: 50 Hz, 16-bit
28  stepper.setSpeed(10);                      // devir/dakika / RPM
29}
30
31void loop() {
32  motor(200);         delay(2000);   // DC: ileri / forward
33  motor(0);           delay(500);    // DC: dur / stop
34  servoWrite(0);      delay(600);    // servo: 0°
35  servoWrite(180);    delay(600);    // servo: 180°
36  servoWrite(90);     delay(600);    // servo: 90°
37  stepper.step(512);  delay(500);    // step: çeyrek tur / quarter turn
38  stepper.step(-512); delay(1000);
39}

Код на MicroPython для Raspberry Pi Pico

На Pico любой пин GP умеет выдавать PWM. В MicroPython скорость DC-мотора задаётся от 0 до 65535 через duty_u16(), а ширина импульса сервопривода в наносекундах через duty_ns(). Шаговый двигатель вращают, по очереди записывая на четыре пина последовательность полушагов; в режиме полушага один оборот 28BYJ-48 составляет 4096 шагов. Если Pico пока в новинку, начни со статьи Что такое Raspberry Pi Pico?

MicroPython
1from machine import Pin, PWM
2import time
3
4# DC motor (L298N): ENA=GP15, IN1=GP14, IN2=GP13
5ena = PWM(Pin(15))
6ena.freq(1000)
7in1 = Pin(14, Pin.OUT)
8in2 = Pin(13, Pin.OUT)
9
10# Servo: GP16, 50 Hz
11servo = PWM(Pin(16))
12servo.freq(50)
13
14# Step motor (ULN2003): IN1–IN4 = GP2–GP5
15coils = [Pin(n, Pin.OUT) for n in (2, 3, 4, 5)]
16SEQ = [(1,0,0,0), (1,1,0,0), (0,1,0,0), (0,1,1,0),
17       (0,0,1,0), (0,0,1,1), (0,0,0,1), (1,0,0,1)]   # yarım adım dizisi / half-step sequence
18
19def motor(speed):                    # -100 … 100
20    in1.value(speed > 0)
21    in2.value(speed < 0)
22    ena.duty_u16(int(abs(speed) * 655.35))
23
24def servo_angle(angle):              # 0 … 180
25    us = 500 + angle * 1900 // 180   # 500–2400 µs
26    servo.duty_ns(us * 1000)
27
28phase = 0                            # dizideki konum, çağrılar arasında korunur / position in the sequence, kept between calls
29
30def step(steps, delay_ms=2):         # yarım adımda 4096 adım = 1 tur / 4096 half-steps = 1 turn
31    global phase
32    d = 1 if steps > 0 else -1
33    for _ in range(abs(steps)):
34        phase = (phase + d) % 8
35        for pin, v in zip(coils, SEQ[phase]):
36            pin.value(v)
37        time.sleep_ms(delay_ms)
38    for pin in coils:
39        pin.value(0)                 # bobinleri bırak / release coils
40
41while True:
42    motor(70)                        # DC: %70 ileri / 70% forward
43    time.sleep(2)
44    motor(0)                         # DC: dur / stop
45    time.sleep(0.5)
46    for a in (0, 180, 90):           # servo: üç açı / three angles
47        servo_angle(a)
48        time.sleep(0.6)
49    step(1024)                       # step: çeyrek tur / quarter turn
50    time.sleep(0.5)
51    step(-1024)
52    time.sleep(1)

Какой мотор для какого проекта?

ПроектПодходящий моторПочему?
Машинка-робот, робот, следующий по линииDC-мотор с редуктором (TT, N20)Вращается непрерывно, дешёвый, регулировки скорости через PWM достаточно
Парковочный шлагбаум, дверная защёлка, замокСервопривод (SG90; для тяжёлых крышек MG996R)Переходит между двумя положениями и остаётся там
Автоматическая раздвижная дверь, гаражные воротаDC-мотор с редуктором и концевые выключателиБольшой ход и высокое усилие; крайние точки определяются выключателями
3D-принтер, ЧПУ, лазерный гравёрШаговый NEMA 17 и A4988 или TMC2209Повторяемое позиционирование точнее десятой доли миллиметра
Робот-манипуляторСервопривод (MG996R в основании, SG90 в захвате)Каждый сустав должен останавливаться под определённым углом
Слайдер для камеры, поворотный стол, умные шторыШаговый двигательМедленное, плавное и повторяемое движение
Радар, камера на кронштейне pan-tilt, солнечный трекерСервоприводДостаточно поворота на 0–180°, а код очень простой
Вентилятор, водяной насосDC-мотор и MOSFETХватает одного направления; только скорость или вкл/выкл
Дрон, RC-самолёт, электроскейтБесколлекторный мотор (BLDC) и ESCОчень высокая скорость, КПД и мощность

В некоторых проектах подойдёт любой из моторов, и выбор зависит от деталей. В машинке-роботе для колёс хватит DC-моторов, но если машинка должна проехать ровно 50 см, придётся либо добавить энкодеры, либо вращать колёса шаговыми двигателями. В роботе-манипуляторе сервоприводы самый простой путь; в тяжёлых и точных манипуляторах в суставах стоят шаговые двигатели с редукторами. В 3D-принтере легко посчитать, сколько шагов нужно оси на миллиметр: с мотором на 200 шагов, микрошагом 1/16 и шкивом GT2 на 20 зубьев (шаг зуба 2 мм) получается 200 × 16 / (20 × 2) = 80 шагов/мм; с ходовым винтом T8 с ходом 8 мм выходит 200 × 16 / 8 = 400 шагов/мм. Для проектов с поворотом на 0–180°, таких как радар или солнечный трекер, сервопривод и самое дешёвое, и самое простое решение.

Коротко о бесколлекторных моторах (BLDC) и ESC

Бесколлекторный DC-мотор (BLDC) устроен наоборот: магниты находятся на вращающейся части, а обмотки в неподвижном корпусе. Без щёток и коллектора нет трения, искрения и износа; мотор эффективнее, тише и служит гораздо дольше. Плата за это: направление тока теперь должна переключать электронная схема, а не щётки. Поэтому у BLDC-моторов 3 провода, и если подключить их прямо к батарее, они не вращаются. У моторов для моделей скорость задаётся параметром KV, то есть числом оборотов в минуту без нагрузки на каждый вольт. Мотор на 1000 KV (например, A2212) от трёхбаночного LiPo-аккумулятора (11,1 V) без нагрузки вращается примерно на 11 100 об/мин. Бесколлекторные моторы стоят в дронах, RC-самолётах, электроскейтах и электросамокатах, компьютерных вентиляторах и жёстких дисках.

Чтобы подключить BLDC-мотор к Arduino, нужен ESC (electronic speed controller, электронный регулятор хода). ESC превращает постоянное напряжение батареи в трёхфазные импульсы для мотора; бессенсорные ESC определяют положение ротора по противо-ЭДС в обмотке, на которую в этот момент не подано питание. Приятно то, что управляющий вход ESC такой же, как у сервопривода: в импульсах 50 Hz 1000 µs означает стоп, а 2000 µs полный газ. Допустимый ток ESC (например, 30 A) должен быть выше максимального тока, который может потреблять мотор, а у большинства ESC есть выход BEC, который выдаёт 5 V. Ради безопасности при включении ESC сначала ждёт минимальный газ; это называется взведением (arming), и пока такого сигнала нет, мотор не запустится. В коде ниже сигнальный провод ESC идёт на D9, а средний вывод потенциометра газа на A0.

C++ (Arduino IDE)
1#include <Servo.h>
2
3Servo esc;                         // ESC bir servo gibi sürülür / an ESC is driven like a servo
4const int POT_PIN = A0;            // gaz potansiyometresi / throttle potentiometer
5
6void setup() {
7  esc.attach(9, 1000, 2000);       // 1000–2000 µs aralığı / 1000–2000 µs range
8  esc.writeMicroseconds(1000);     // en düşük gaz: ESC'yi kur (arming) / minimum throttle: arm the ESC
9  delay(3000);                     // bip seslerini bekle / wait for the beeps
10}
11
12void loop() {
13  int throttle = map(analogRead(POT_PIN), 0, 1023, 1000, 2000);   // pot → gaz / pot → throttle
14  esc.writeMicroseconds(throttle);
15  delay(20);                       // bir servo periyodu / one servo period
16}
Всегда снимай пропеллер, когда проверяешь бесколлекторный мотор: мотор на 1000 KV мгновенно разгоняется больше чем до 10 000 об/мин, а пропеллер может нанести серьёзные травмы. Заряжай LiPo-аккумуляторы только подходящим зарядным устройством, никогда не замыкай их и не используй вздувшийся аккумулятор. Если Arduino питается от USB, не подключай красный провод, идущий от BEC в ESC; сигнального провода и GND достаточно.

Частые ошибки и как их исправить

  • Arduino перезагружается, когда работает мотор: мотор или сервопривод питается от пина 5V платы. Используй отдельный источник, соедини земли и поставь на питание конденсатор большой ёмкости.
  • Сервопривод дрожит или дёргается: слабый источник, тонкие и длинные провода или нет общей земли. Подключи сервопривод к источнику на 5–6 V, способному выдать не меньше 1 A.
  • Скорость DC-мотора не меняется, когда используется сервопривод: на Uno пин ENA подключён к 9 или 10, а библиотека Servo отключает PWM на этих пинах. Перенеси ENA на 3, 5, 6 или 11.
  • При малых значениях PWM DC-мотор не вращается, а только гудит: не хватает мощности, чтобы преодолеть трение покоя. Запусти мотор на мгновение с высоким значением, а затем снизь скорость, или держи минимальное значение около 80–100. Учитывай и падение напряжения на L298N примерно на 2 V.
  • Шаговый двигатель вибрирует, но не вращается: неправильный порядок обмоток или слишком высокая скорость. Для 28BYJ-48 используй порядок Stepper(2048, IN1, IN3, IN2, IN4) и держи скорость ниже 15 об/мин.
  • Шаговый двигатель пропускает шаги: слишком тяжёлая нагрузка, слишком резкий разгон или слишком низкое ограничение тока на A4988. Настрой Vref по формуле I = Vref / (8 × Rcs), где Rcs это токоизмерительный резистор на плате, и используй плавный разгон с AccelStepper.
  • Сгорел A4988: кабель мотора подключали или отключали при включённом питании драйвера, Vref был слишком высоким или на VMOT не было конденсатора. Подключай мотор только при выключенном питании.
  • ESC не запускает мотор и постоянно пищит: при включении не пришёл сигнал минимального газа. Проверь, что setup() отправляет writeMicroseconds(1000) и ждёт несколько секунд; если нужно, откалибруй ESC по инструкции к нему.
Если сложно определиться, задай себе один вопрос: мотор будет вращаться непрерывно (DC-мотор), поворачиваться на определённый угол и оставаться там (сервопривод) или делать много оборотов и при этом знать точное положение (шаговый двигатель)? Если нужны очень высокая скорость и КПД, ответ: бесколлекторный мотор с ESC.

Итак, DC-мотор означает скорость, сервопривод означает угол, а шаговый двигатель означает положение; подбери к нужному мотору нужный драйвер, и половина проекта уже решена. Начать с SG90 и TT-мотора, а потом перейти к шаговому двигателю: самый простой способ освоить все три. В приложении BlueGrays есть проекты об основах сервопривода, управлении сервоприводом с помощью потенциометра, основах шагового двигателя, сервоприводе на 360 градусов из шагового двигателя, машинке с управлением по Bluetooth на L298N и роботе, объезжающем препятствия, и каждый из них пошагово, со схемами подключения и кодом.

Частые вопросы

Чем сервопривод отличается от шагового двигателя?

Сервопривод знает своё положение благодаря встроенному потенциометру и обычно поворачивается на нужный угол в пределах 0–180° и остаётся там. Шаговый двигатель может вращаться без ограничений и знает своё положение по числу сделанных шагов, но если он перегружен и пропускает шаги, он этого не замечает. Для коротких и быстрых поворотов на угол выбирай сервопривод, а для точного позиционирования на протяжении многих оборотов шаговый двигатель.

Можно ли подключить DC-мотор прямо к Arduino?

Нет. Пин Arduino выдаёт максимум 40 mA, а маленький DC-мотор потребляет сотни миллиампер и при отключении тока выдаёт выброс обратного напряжения, который может сжечь пин. Для управления в одну сторону используй MOSFET и диод, а для вращения вперёд и назад драйвер с H-мостом, например L298N или L9110S.

Почему шаговый двигатель греется?

Через обмотки шагового двигателя постоянно течёт ток для момента удержания, даже когда мотор стоит, поэтому тёплый или даже горячий корпус это нормально. Если корпус настолько горячий, что руку не удаётся держать на нём дольше нескольких секунд, ограничение тока на A4988 (Vref) выставлено слишком высоко. Когда удерживать положение не нужно, нагрев и потребление можно снизить, переведя пин EN в HIGH или отключив обмотки.

Может ли сервопривод поворачиваться на 360 градусов?

Обычные сервоприводы, как правило, поворачиваются только в пределах 0–180° из-за механического упора внутри. Сервоприводы постоянного вращения (360°), например FS90R, делают полные обороты, но тогда управляешь не углом, а скоростью и направлением, и информация о положении теряется. Если нужны и полные обороты, и точное положение, лучше выбрать шаговый двигатель.

Почему в 3D-принтерах используют шаговые двигатели?

Шаговый двигатель поворачивается на фиксированный угол на каждый полученный импульс, поэтому даёт повторяемое и точное позиционирование без дополнительного датчика. Мотор NEMA 17 с микрошагом 1/16 и ремнём GT2 делает 80 шагов на миллиметр, то есть около 0,0125 мм на шаг. Шаговые двигатели дешёвые, надёжные и простые в управлении, поэтому они стандарт в любительских 3D-принтерах и станках с ЧПУ.

Как управлять бесколлекторным мотором (BLDC) с Arduino?

Бесколлекторным мотором нельзя управлять прямо с пина или через L298N; между ними нужен ESC. Сигнальный провод ESC подключается к пину Arduino, и с библиотекой Servo writeMicroseconds(1000) означает стоп, а writeMicroseconds(2000) полный газ. При включении нужно несколько секунд подавать минимальный газ, чтобы взвести ESC (arming).

Все проекты
Работа с сервоприводом
#35Новичок
Premium

Работа с сервоприводом

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

4.7(48)
67
Работа с шаговым мотором
#67Средний
Premium

Работа с шаговым мотором

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

4.5(31)
42
Машинка на L298N с управлением по Bluetooth
#80Продвинутый
Premium

Машинка на L298N с управлением по Bluetooth

Преврати телефон в пульт и управляй своей машинкой-роботом. Arduino получает команды из приложения-пульта на телефоне через Bluetooth-модуль и вращает колёса через драйвер моторов; машинка едет вперёд

5.0(38)
65
Управление сервоприводом потенциометром
#36Новичок
Premium

Управление сервоприводом потенциометром

Когда ты поворачиваешь ручку потенциометра, рычаг сервопривода поворачивается вместе с ней: одно крайнее положение ручки — ноль градусов, другое — пол-оборота. Arduino всё время читает положение ручки

4.6(37)
52
Сервопривод на 360 градусов из шагового мотора
#68Средний
Premium

Сервопривод на 360 градусов из шагового мотора

Научи обычный шаговый мотор вставать на любой нужный угол по всему кругу. Arduino вычисляет, сколько шагов нужно для каждого угла; мотор по очереди поворачивается на 0, 90, 45, 180, 135 и 360 градусов

4.5(22)
32
Робот, объезжающий препятствия
#81Продвинутый
Premium

Робот, объезжающий препятствия

Как насчёт того, чтобы собрать умную машину, которая сама находит дорогу? Робот, объезжающий препятствия, постоянно осматривает всё вокруг благодаря ультразвуковому датчику спереди. Встретив препятств

5.0(38)
49
Сервопривод на ESP32 (управление потенциометром)
#118Средний
Premium

Сервопривод на ESP32 (управление потенциометром)

В этом проекте сервопривод SG90 управляется потенциометром. Угол сервопривода задаётся сопоставлением аналогового значения потенциометра с диапазоном 0–180 градусов. Библиотека ESP32Servo формирует сигналы сервопривода на подходящих выходных пинах GPIO у ESP32; этот проект использует GPIO 18. Это базовый способ управления для роборук, подвесов камер и механизмов автоматических дверей.

4.3(29)
42
Дверной замок с RFID на ESP32 (RC522 + сервопривод + OLED + зуммер + светодиод)
#137Продвинутый
Premium

Дверной замок с RFID на ESP32 (RC522 + сервопривод + OLED + зуммер + светодиод)

Собираем умный дверной замок на ESP32, модуле RFID RC522, сервоприводе SG90, OLED-дисплее SSD1306, активном зуммере и 2 светодиодах. При поднесении карты её UID сравнивается со списком разрешённых карт в коде: если доступ разрешён, сервопривод поворачивается и открывает дверь (зелёный светодиод + 2 коротких сигнала), а через 5 секунд дверь снова запирается сама. При чужой карте загорается красный светодиод, звучат 3 быстрых сигнала, а прочитанный UID показывается на экране.

4.8(9)
15