ESP32 Урок 17/55 - Управление серводвигателем с помощью ESP32 и потенциометра - Обучающий набор ESP32 для Интернета вещей
В этом руководстве мы научимся управлять сервоприводом с помощью микроконтроллера ESP32 и потенциометра из набора ESP32 IoT Learning kit от SunFounder. К концу этого проекта вы сможете плавно регулировать угол поворота сервопривода с помощью потенциометра, что обеспечит точное управление. Это отличный способ изучить возможности ESP32 и то, как он взаимодействует с двигателями.

Углубляясь в детали, мы рассмотрим необходимые аппаратные компоненты, инструкции по подключению и примеры кода, чтобы всё заработало. Для более наглядного представления обязательно посмотрите видео, связанное с этим руководством (в видео на 0:30).
Объяснение аппаратной части
Основными компонентами этого проекта являются микроконтроллер ESP32, сервопривод (SG90) и потенциометр. ESP32 — это мощный микроконтроллер со встроенными Wi-Fi и Bluetooth, что делает его подходящим для проектов IoT. Он способен управлять различными устройствами, включая двигатели, с высокой точностью.
Сервопривод SG90 — широко используемый компонент, который может поворачиваться примерно на 270 градусов. Он работает на основе сигнала широтно-импульсной модуляции (ШИМ), где угол поворота определяется шириной импульса, отправляемого на него. Потенциометр действует как переменный резистор, позволяя регулировать напряжение, подаваемое на ESP32, которое, в свою очередь, управляет положением сервопривода.
Данные из технического описания
| Производитель | SG |
|---|---|
| Номер детали | SG90 |
| Логическое/IO напряжение | 3,3 В (ESP32) |
| Напряжение питания | 5 В |
| Выходной ток (на канал) | 1,2 А |
| Пиковый ток (на канал) | 2,5 А |
| Рекомендуемая частота ШИМ | 50 Гц |
| Пороги входной логики | 0,2 В (низкий), 2,5 В (высокий) |
| Падение напряжения / RDS(on) / насыщение | 0,5 В |
| Тепловые пределы | Макс. 85 °C |
| Корпус | Пластиковый |
| Примечания / варианты | Доступен с разными типами шестерен |
- Убедитесь, что сервопривод питается от подходящего напряжения (5 В).
- Подключите землю сервопривода к земле ESP32 для общего опорного потенциала.
- Используйте соответствующие ШИМ-сигналы для управления положением сервопривода.
- Учитывайте требования сервопривода по току; при необходимости используйте внешний источник питания.
- Проверьте правильность назначения контактов при подключении, чтобы избежать ошибок конфигурации.
Инструкции по подключению

Чтобы подключить сервопривод и потенциометр к ESP32, начните с соединения провода заземления сервопривода (обычно чёрного или коричневого) с одним из контактов заземления на ESP32. Затем подключите провод питания сервопривода (обычно красный) к контакту 5 В на ESP32. Наконец, подключите сигнальный провод (обычно оранжевый или белый) от сервопривода к контакту 25 на ESP32.
Для потенциометра подключите один крайний контакт к контакту 3,3 В на ESP32, а другой крайний контакт — к земле. Средний контакт потенциометра должен быть подключён к контакту 34 на ESP32. Эта схема позволяет ESP32 считывать изменяющееся выходное напряжение потенциометра, которое будет использоваться для управления положением сервопривода.
Примеры кода и пояснения
Следующий фрагмент кода инициализирует сервопривод и задаёт параметры для управления его движением:
#include
Servo myServo;
const int servoPin = 25;
const int minPulseWidth = 500; // 0,5 мс
const int maxPulseWidth = 2500; // 2,5 мс
void setup() {
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
myServo.setPeriodHertz(50); // Стандартный сервопривод 50 Гц
}
В этом коде мы включаем библиотеку ESP32Servo и создаём экземпляр сервопривода с именем myServo. Мы определяем номер контакта для сервопривода и задаём минимальную и максимальную ширину импульсов, которые соответствуют пределам угла поворота сервопривода.
Далее рассмотрим цикл, который непрерывно перемещает сервопривод вперёд и назад:
void loop() {
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
Этот цикл постепенно изменяет угол от 0 до 180 градусов и обратно, используя функцию map для преобразования угла в соответствующую ширину импульса для сервопривода. Каждое изменение сопровождается короткой задержкой, чтобы сервопривод плавно достиг нового положения.
Демонстрация / Что ожидать
После того как всё будет подключено и код загружен, вы должны увидеть, как сервопривод плавно движется от 0 до 180 градусов и обратно. Если вы повернёте потенциометр, сервопривод должен отразить новое положение в зависимости от напряжения, подаваемого потенциометром. Будьте осторожны с переполюсовкой при подключении, так как это может повредить компоненты (в видео на 3:45).
Временные метки видео
- 00:00 Начало
- 1:56 Что такое сервопривод
- 5:00 Страница документации
- 6:33 Подключение сервопривода объяснено
- 7:45 Выбор COM-порта для ESP32 в Arduino IDE
- 9:27 Объяснение кода Arduino
- 14:31 Демонстрация управления сервоприводом с помощью ESP32
- 16:04 Питание сервопривода не от 5 В
- 18:47 Управление сервоприводом без цикла
- 20:15 Управление сервоприводом с помощью потенциометра
- 21:37 Объяснение кода Arduino для сервопривода с потенциометром
#include <ESP32Servo.h>
// Определите сервопривод и контакт, к которому он подключен.
Servo myServo;
const int servoPin = 25;
// Определите минимальную и максимальную ширину импульса для серво.
const int minPulseWidth = 500; // 0,5 мс
const int maxPulseWidth = 2500; // 2.5 мс
void setup() {
// Прикрепите сервопривод к указанному контакту и установите диапазон ширины его импульса.
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
// Установите частоту ШИМ для сервопривода.
myServo.setPeriodHertz(50); // Стандартный серводвигатель 50Гц
}
void loop() {
// Поверните сервопривод от 0 до 180 градусов.
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
// Поверните серво с 180 до 0 градусов.
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
Common Course Links
Common Course Files
Ресурсы и ссылки
-
ДокументацияДокументация по сервомотору SunFunder ESP32 Учебник 17/55docs.sunfounder.com
Файлы📁
Технический паспорт (pdf)
-
DS5160 Серводвигатель технические характеристики
DS5160_datasheet.pdf0.33 MB
Другие файлы
-
Download SG90 datasheet (PDF)
robojax-servo-sg90_datasheet.pdf