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

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

| Устройство | Что означает ширина импульса | Пример |
|---|---|---|
| Обычный сервопривод (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, 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 при заторможенном валу |
| Сервопривод SG90 | 4,8–6 V | 0,1 с / 60° | 1,8 кг·см | ≈ 1° | В покое очень мало, в движении может превышать 0,5 A |
| Сервопривод MG996R | 4,8–7,2 V | 0,17 с / 60° (4,8 V) | 9,4–11 кг·см | ≈ 1° | 0,5–0,9 A в работе, 2,5 A при заторможенном валу |
| Шаговый 28BYJ-48 | 5 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, TB6612FNG | 2 пина направления и 1 пин PWM | H-мост меняет направление, PWM задаёт скорость |
| Сервопривод | Не нужен (встроен) | 1 пин, сигнал 50 Hz | Для множества сервоприводов: плата PCA9685 (16 каналов, I2C) |
| Униполярный шаговый (28BYJ-48) | ULN2003 | 4 пина | Включает обмотки по очереди, 500 mA на канал |
| Биполярный шаговый (NEMA 17) | A4988, DRV8825, TMC2209 | 2 пина (STEP, DIR) | Ограничение тока задаётся через Vref, умеет микрошаг |
| Бесколлекторный мотор (BLDC) | ESC | 1 пин, сигнал как у сервопривода | Допустимый ток должен подходить мотору (например, 30 A) |

Потребление: сколько тока берёт каждый мотор?
По току три мотора ведут себя очень по-разному, и источник питания нужно выбирать с учётом этого. 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 Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| L298N ENA (скорость, PWM) | D5 | GPIO 25 | GP15 |
| L298N IN1 | D7 | GPIO 26 | GP14 |
| L298N IN2 | D8 | GPIO 27 | GP13 |
| Сигнал сервопривода (оранжевый) | D9 | GPIO 18 | GP16 |
| ULN2003 IN1 | D10 | GPIO 19 | GP2 |
| ULN2003 IN2 | D11 | GPIO 21 | GP3 |
| ULN2003 IN3 | D12 | GPIO 22 | GP4 |
| ULN2003 IN4 | D13 | GPIO 23 | GP5 |
| GND (всех источников) | GND | GND | GND |
- Сними перемычку ENA на L298N; подключи ENA, IN1 и IN2 к пинам из таблицы, а DC-мотор к клеммам OUT1 и OUT2. Питание мотора (например, два последовательных аккумулятора 18650, 7,4 V) подай на клемму 12V.
- Подключи коричневый провод сервопривода к GND, красный к отдельному источнику на 5–6 V, а оранжевый сигнальный к D9.
- Вставь белый разъём 28BYJ-48 в плату ULN2003, подключи IN1–IN4 к D10–D13 и подай на клемму + платы питание 5 V.
- Соедини между собой минусы всех источников и GND Arduino.
- Загрузи код через Arduino IDE; библиотеки Servo и Stepper входят в состав 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?
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?
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.
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}Частые ошибки и как их исправить
- 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-мотор означает скорость, сервопривод означает угол, а шаговый двигатель означает положение; подбери к нужному мотору нужный драйвер, и половина проекта уже решена. Начать с 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).
Что собрать после прочтения
Все проекты
Работа с сервоприводом
Рычаг маленького сервопривода по очереди поворачивается в три положения: до упора в начало, ровно на середину и до упора в конец, задерживаясь на каждой остановке на две секунды. Arduino сообщает мото

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

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

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

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

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

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

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

