SG90 сервопривод: управление двумя сервами тремя кнопками на ESP8266
Полный рабочий проект: две сервы SG90 (micro servo) управляются тремя обычными кнопками на ESP8266 (NodeMCU / Wemos). Три положения ворот: открытие наружу, закрытие, открытие внутрь. Плавное движение с регулируемой скоростью, защита от дребезга, синхронное или последовательное открытие створок — всё в одном скетче!
Что понадобится
- ESP8266 (NodeMCU / Wemos D1 mini)
- 2 × сервопривод SG90
- 3 кнопки тактовые
- Внешнее питание 5 В (рекомендуется)
Схема подключения
- Сигнал сервы 1 → D1 (GPIO5)
- Сигнал сервы 2 → D2 (GPIO4)
- Кнопки: один контакт → GND, второй → D5, D6, D7
- Питание серв → внешний 5 В или VIN
Финальный скетч с плавным движением и регулируемой скоростью
#include <Servo.h>
Servo servo1;
Servo servo2;
const int btnOpenIn = D5; // открыть внутрь
const int btnClose = D6; // закрыть
const int btnOpenOut = D7; // открыть наружу
int pos1 = 90; // текущее положение
int pos2 = 90;
void setup() {
servo1.attach(D1);
servo2.attach(D2);
pinMode(btnOpenIn, INPUT_PULLUP);
pinMode(btnClose, INPUT_PULLUP);
pinMode(btnOpenOut, INPUT_PULLUP);
servo1.write(90);
servo2.write(90);
delay(500);
}
void loop() {
if (digitalRead(btnOpenIn) == LOW) {
moveTo(180, 0); // внутрь
delay(300);
}
if (digitalRead(btnClose) == LOW) {
moveTo(90, 90); // закрыть
delay(300);
}
if (digitalRead(btnOpenOut) == LOW) {
moveTo(0, 180); // наружу
delay(300);
}
}
void moveTo(int target1, int target2) {
while (pos1 != target1 || pos2 != target2) {
if (pos1 < target1) pos1++; else if (pos1 > target1) pos1--;
if (pos2 < target2) pos2++; else if (pos2 > target2) pos2--;
servo1.write(pos1);
servo2.write(pos2);
delay(15); // скорость: чем больше — тем медленнее
}
}
«Закрыть» → оба на 90°.
«Открыть наружу» → оба на 0°/180°.
движение плавное с шагом 1° и задержкой 15 мс.
Варианты доработки
- Последовательное открытие створок (сначала одна, потом вторая)
- Добавление концевых выключателей
- Управление через Telegram-бот (как просили подписчики)
- Звук подтверждения
- Сохранение последнего положения в EEPROM
Итог
Теперь у вас есть полностью готовый и очень гибкий проект управления двумя SG90 сервоприводами с помощью трёх кнопок: плавное движение, регулируемая скорость, защита от дребезга и простая схема. Идеальная основа для автоматических ворот, жалюзи, штор, клапанов и десятков других механизмов.
Ставьте лайк, если открыли свои «ворота» с первого раза, и пишите в комментариях — для чего вы используете SG90: ворота, робот, модель самолёта или что-то ещё?
FAQ — Управление двумя сервами SG90 тремя кнопками на ESP8266
Почему сервоприводы дёргаются при включении ESP8266?
SG90 чувствителен к скачкам питания и случайным PWM-импульсам при старте.
Используйте отдельное питание 5 В, подключайте сервоприводы только после вызова
servo.attach(), а также добавляйте небольшую задержку перед первой командой.
Можно ли питать два SG90 напрямую от ESP8266?
Не рекомендуется. Два SG90 могут потреблять до 1 А при пуске. ESP8266 не рассчитан на такие токи, поэтому сервы должны питаться от внешнего источника 5 В, а земля должна быть общей с ESP8266.
Почему кнопки срабатывают несколько раз подряд?
Это дребезг контактов. ESP8266 регистрирует несколько импульсов за одну физическую нажатие. Добавьте программную задержку (40–80 мс), используйте внутренний INPUT_PULLUP или реализуйте программный антидребезг через контроль времени.
Можно ли менять скорость движения сервоприводов?
Да, скорость регулируется задержкой в цикле перемещения.
Чем больше значение delay() в функции плавного движения, тем
медленнее поворот. Можно заменить задержку на таймер для полностью
неблокирующей работы.
Как сделать последовательное открытие створок?
Вместо одновременного изменения двух углов задайте паузу между
движением сервоприводов. Например, сначала изменяйте pos1, после достижения
целевого положения начинайте движение pos2. Логика полностью задаётся в функции
moveTo().
Нужно ли заземление между ESP8266 и внешним БП?
Да. Общий GND обязателен. Если ESP8266 и сервы питаются от разных источников без общей земли, PWM-сигнал не будет корректно считываться, и сервы будут дёргаться или не двигаться.
Можно ли использовать ESP32 вместо ESP8266?
Да. ESP32 имеет больше аппаратных PWM-каналов и работает стабильнее при управлении сервоприводами. Код остаётся почти таким же: меняются только номера пинов и используется библиотека ESP32Servo.
Как сохранить последнее положение сервоприводов?
Можно сохранить значения pos1 и pos2 в EEPROM или LittleFS.
При следующей загрузке прочитайте данные и выставьте сервы в сохранённое положение.
Такой подход применяют в автоматических воротах и жалюзи.
Почему SG90 шумит, когда стоит неподвижно?
SG90 постоянно удерживает положение и подает корректирующие импульсы.
Это нормально. Чтобы убрать шум, снимайте питание серв или отключайте сигнал через
servo.detach() после достижения конечного положения.
Можно ли заменить кнопки на датчики или беспроводное управление?
Да. Кнопки можно заменить на датчики движения, концевики,
радиоканал, Bluetooth, Telegram-бот или web-интерфейс. Логика останется прежней —
изменяются лишь условия вызова функции moveTo().