Сервопривод: точный поворот на угол

Светодиоды светят, датчики чувствуют — а теперь что-то наконец задвигается. Сервопривод поворачивается ровно на тот угол, который ты ему назовёшь.

Сервопривод — это мотор, который умеет вставать в точную позицию: «повернись на 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 — стоп, меньше — в одну сторону, больше — в другую). Их удобно ставить колёсами на простого робота: вся силовая логика драйвера уже спрятана внутри серво.

Итоги

Сервопривод встаёт в точный угол благодаря внутренней обратной связи: ты задаёшь градусы, библиотека шлёт ШИМ-импульсы. Мощные серво — на отдельное питание с общей землёй. Серво умеет точный угол, но не умеет крутиться без конца. Для этого нужны обычные моторы и драйвер.

Проверьте себя
1. Как сервопривод узнаёт, что доехал до нужного угла?
AПо таймеру
BПо встроенной обратной связи (потенциометр на оси)
CСлучайно
DПо температуре
2. Почему мощный сервопривод не стоит питать от 5V Arduino?
AОн не поместится
BПусковой ток просаживает напряжение и перезагружает плату
CСерво сгорит
DЭто запрещено библиотекой