Сервопривод: точный поворот на угол
Светодиоды светят, датчики чувствуют — а теперь что-то наконец задвигается. Сервопривод поворачивается ровно на тот угол, который ты ему назовёшь.
Сервопривод — это мотор, который умеет вставать в точную позицию: «повернись на 90 градусов». Идеален для рук роботов, стрелок приборов и поворотных механизмов.
Сейчас заставим сервопривод плавно поворачиваться от 0 до 180 градусов и обратно. Это первое настоящее движение, которое создаёт твой код.
Схема подключения
Сервопривод Arduino коричневый/чёрный --- GND красный ------ 5V оранжевый/жёлтый ---- пин 9 (сигнал) ВНИМАНИЕ: мощный сервопривод питай ОТ ОТДЕЛЬНОГО источника, а не от 5V платы - иначе Arduino перезагружается от просадки!
Код
#include <Servo.h>
Servo myServo;
void setup() {
myServo.attach(9); // сигнал на пине 9
}
void loop() {
for (int angle = 0; angle <= 180; angle++) {
myServo.write(angle); // повернись на angle градусов
delay(15);
}
for (int angle = 180; angle >= 0; angle--) {
myServo.write(angle);
delay(15);
}
}
Как работает под капотом
Внутри сервопривода — обычный моторчик, шестерёнки и датчик угла (потенциометр на оси) плюс маленькая плата управления. Ты не управляешь мотором напрямую: ты шлёшь по сигнальному проводу ШИМ-импульсы определённой длины. Импульс ~1 мс → 0 градусов, ~1.5 мс → 90, ~2 мс → 180. Плата внутри серво крутит мотор, пока встроенный потенциометр не покажет нужный угол — это обратная связь. Библиотека Servo формирует эти импульсы за тебя, а ты просто пишешь градусы.
# Та же логика на Python: угол -> длина управляющего импульса (мкс)
def angle_to_pulse(angle):
angle = max(0, min(180, angle)) # сервопривод понимает 0..180
# 0 град = 1000 мкс, 180 град = 2000 мкс (линейно)
return round(1000 + angle / 180 * 1000)
for a in (0, 45, 90, 135, 180):
print(a, "градусов ->", angle_to_pulse(a), "мкс импульс")
Частые ошибки
- Питают мощный серво от 5V платы. На старте мотор тянет большой ток — напряжение проседает — Arduino перезагружается. Используй внешнее питание и общий GND.
- Шлют угол больше 180. Серво «упирается» и гудит, перегревается. Держись 0–180.
- Забыли #include Servo.h. Компилятор ругается на неизвестный Servo.
Best practices
- Для нескольких или мощных серво ставь отдельный источник 5–6 В и обязательно соединяй земли (GND платы и питания вместе).
- Не держи серво долго в крайнем положении под нагрузкой — оно греется.
- Связка потенциометр + map(0,1023,0,180) + servo.write — классический «ручной» поворот серво.
Серво под управлением потенциометра
Самый наглядный способ почувствовать сервопривод — связать его с потенциометром: крутишь ручку — синхронно поворачивается «рука» серво. Здесь сходятся целых три раздела курса: читаем крутилку через analogRead (0–1023), переводим в градусы через map(raw, 0, 1023, 0, 180) и отдаём серво методом write. Получается прямое, почти «живое» управление механикой движением пальцев — именно так устроены пульты, манипуляторы и радиоуправляемые модели.
Полезно понимать разницу между обычным и continuous-серво. Стандартный сервопривод поворачивается в пределах 0–180 градусов и держит позицию — идеален для рулей, заслонок, поворотных голов. Существуют и серво непрерывного вращения (continuous rotation): у них write задаёт не угол, а скорость и направление бесконечного вращения (90 — стоп, меньше — в одну сторону, больше — в другую). Их удобно ставить колёсами на простого робота: вся силовая логика драйвера уже спрятана внутри серво.
Итоги
Сервопривод встаёт в точный угол благодаря внутренней обратной связи: ты задаёшь градусы, библиотека шлёт ШИМ-импульсы. Мощные серво — на отдельное питание с общей землёй. Серво умеет точный угол, но не умеет крутиться без конца. Для этого нужны обычные моторы и драйвер.