Я задумал снимать таймлапс кормушки для птиц — камера должна была медленно поворачиваться за стайкой. Купил двухсервовый кронштейн-краб, прикрутил камеру, залил скетч из примеров: pan.write(0), delay, pan.write(180). Получилась не панорама, а судорога: платформа рывками перелетала от края до края, кадр дёргался так, что птиц в монтаже приходилось вырезать. А через неделю выяснилось и второе: камеру я посадил прямо на качалку верхнего серво одним длинным винтом, и когда платформу слегка повернуло кабелем, шлицы качалки сорвались. Обе поломки были не про код — про конструкцию.
Пан-тилт — самая честная двухсервовая механика: две оси, два угла, никакого обратного движения. Но именно из-за этой простоты в ней легко промахнуться по мелочам: какая серво внизу и почему, какой ход реально доступен каждой оси, как сделать движение плавным, а не ступенчатым. Здесь я разберу конструкцию, которую после той истории собрал заново и использую до сих пор, — и покажу два скетча: ручное управление джойстиком для живой платы и плавный скан, который можно посмотреть в симуляторе.
Пан внизу, тилт наверху — и не наоборот
Две оси имеют имена: пан — поворот влево-вправо вокруг вертикали, тилт — наклон вверх-вниз вокруг горизонтали. Снизу всегда стоит пан: она несёт на себе всё — верхнюю серво, кронштейн, камеру. Если перепутать и поставить тилт вниз, вся конструкция будет балансировать на качалке серво наклона, а это самый хрупкий узел из возможных. Вес камеры — первый критерий выбора серво: веб-камера на 90–120 г на кронштейне с плечом 3–4 см даёт 300–480 г·см — SG90 с её 1,8 кг·см хватает с запасом. Смартфон весит 180–220 г, и на том же плече это уже 540–880 г·см — формально тоже влезает, но я бы поставил MG996R: платформа на грани момента начинает гудеть в удержании, а гул камеры в кадре не заглушишь.
Готовые кронштейны-«крабы» из двух плат — нормальный путь, не стыдно. Внутри них ровно та кинематика, что описана выше: нижняя серво крутит верхнюю плату, верхняя качает площадку. Собирая такой, проверьте одну вещь: винты качалок должны сидеть на резьбе в пластиковых втулках, а не «на честном слове» в гладких отверстиях — вторые разбалтываются за неделю.
| Ось | Серво и пин | Рабочий ход | Почему не весь 0–180° |
|---|---|---|---|
| Пан (низ) | SG90, пин 11 | 30–150° | кабель камеры и выступ кронштейна бьют по основанию у краёв |
| Тилт (верх) | SG90, пин 10 | 45–135° | на малых углах камера цепляет плату, центр тяжести уходит за ось |
Отступы от краёв здесь не перестраховка, а результат замеров: кабель, идущий к камере, на краю хода натягивается и начинает сам поворачивать платформу — серво с перегрузом упирается в упор каждые 20 мс. Пятнадцать–двадцать градусов запаса с каждой стороны снимают проблему целиком; правило я сформулировал ещё в уроке про серво-переключатель: два положения и отступ от упоров.
Самодельный кронштейн тоже имеет право на жизнь, и я делал оба варианта. Фанерная площадка 4 мм на серво М2-винтами собирается за вечер и стоит копейки, но требует аккуратной соосности: перекос оси на пару градусов на конце плеча превращается в сантиметры биения камеры, и на краю хода она начинает цеплять основание. Печатный или покупной краб собран уже соосным — за это просят от 300 рублей, и для первой платформы я бы платил без раздумий: вечер сборки и вечер правки перекосов стоят дороже. Бонус краба — разборность: отказавшую серво в нём меняешь за пять минут, а не пересверливаешь фанеру.
Управлять двумя осями удобнее всего джойстиком: ось X — пан, ось Y — тилт, обе через analogRead и map. Схема и код аналогичны управлению сервой от потенциометра — ручное управление через map, а разбор самого модуля с осями и кнопкой SW лежит в разделе основ: аналоговый джойстик: две оси. Одна деталь, которую я добавляю всегда, — мёртвая зона: у дешёвых джойстиков центр гуляет на 20–50 единиц АЦП, и без неё платформа медленно плывёт, когда вы руки убрали. Вилка 460–560 вокруг центра 512 решает.
Отладку веду через Serial, но не в каждом такте: печать пары pan= tilt= на каждый проход loop при delay(20) — это пятьдесят строк в секунду, монитор захлёбывается, а сама печать ест время цикла. Раз в 200–300 мс достаточно, на живой плате — millis-меткой. И про питание ручки: джойстик, потенциометры и кнопки я сажаю на ту же землю и то же 5 В, что и плату — АЦП меряет относительно опоры Arduino, и отдельный источник для ручки уводит центр в сторону.
#include <Servo.h> Servo pan; // нижняя серво — пин 11Servo tilt; // верхняя серво — пин 10 int panUgol = 90, tiltUgol = 90; void setup() { pan.attach(11); tilt.attach(10); pan.write(panUgol); tilt.write(tiltUgol); Serial.begin(9600);} void loop() { int ox = analogRead(A0); // ось X джойстика int oy = analogRead(A1); // ось Y джойстика if (ox < 460) panUgol = panUgol - 1; // мёртвая зона 460-560 if (ox > 560) panUgol = panUgol + 1; if (oy < 460) tiltUgol = tiltUgol + 1; // ось Y инвертирована if (oy > 560) tiltUgol = tiltUgol - 1; panUgol = constrain(panUgol, 30, 150); tiltUgol = constrain(tiltUgol, 45, 135); pan.write(panUgol); tilt.write(tiltUgol); delay(20); // 50 градусов в секунду; для медленной съёмки ставьте 80-100}Для видео решает не куда, а как плавно. Кадр становится кинематографичным, когда платформа движется на скорости единиц градусов в секунду: я снимал облака на один градус за 80 мс — 12,5°/с, для таймлапса это верхняя граница, для обзора комнаты нормально. Техника — та же интерполяция шагами: держим целевой угол и каждый такт двигаем текущий угол на градус к цели. Развернутый разбор с вариантами без блокировки loop — в уроке плавное движение серво без delay; в симуляторе ниже — упрощённая версия именно для двух осей.
И питание: две SG90 с лёгкой камерой USB обычно вывозит, но пики старта обеих осей складываются, и я видел перезагрузки на второй секунде движения. Если камера тяжелее украшения из картона — сразу внешний блок и общий GND: внешнее питание и общий GND для серво.
Ручная ручка — не единственный режим. Как только интерполяция заработала, платформу можно отдать автомату: скан по таймеру с произвольными целями, реакция на датчик движения, слежение по координате из Serial. Все эти режимы используют ту же пару переменных «текущий угол / цель», поэтому мой совет такой: сначала добейтесь плавного ручного хода, а автоматику прикручивайте поверх — иначе будете отлаживать одновременно и движение, и логику режимов.
Механика: центр тяжести и кабели
Центр тяжести камеры должен стоять над осью тилта, а не висеть в 5 см сбоку от неё: смещённый вес — это момент, который верхняя серво вынуждена удерживать постоянно, греясь и гудя. Проверка на собранной платформе элементарна: выключите питание и покачайте площадку пальцем — она не должна сама заваливаться ни в одну сторону. Если заваливается, двигайте камеру по площадке или добавьте противовес: пара гаек М8 на хвостовом краю лечат почти любой перекос.
Второй тихий убийца — кабель. USB-хвост камеры, свободно свисающий вдоль кронштейна, на повороте работает как пружина: сначала он просто виляет платформой, через месяц изгибов — треснет в разъёме. Я теперь веду кабель стяжками вдоль кронштейна с кольцевым запасом у оси пан — так петля скручивается, а не изгибается, и живёт годами. И про тот мой сорванный шлиц: камеру крепите через штатную площадку кронштейна двумя-четырьмя винтами М2, а не одним длинным винтом прямо в качалку — рычаг из винта в мягком пластике выкрашивает пазы за неделю.
Прежде чем доверять платформе камеру, я прогоняю стенд без неё: час-другой скана в холостую, с рукой на серво — ладонь честно расскажет о перегреве раньше термометра. Симулятор в этом смысле — репетиция логики: он не покажет нагрев и перекос кабеля, зато позволяет спокойно посмотреть на характер движения и на пары pan= tilt= в мониторе, не отключая каждый раз камеру от USB.
- 1. Какая серво должна стоять внизу пан-тилт и почему?
- 2. Зачем в скетче с джойстиком нужна мёртвая зона вокруг центра 512?
- 3. Какой рабочий ход разумно оставить оси пан и почему?
- 4. Какого порядка скорость делает движение платформы кинематографичным?
- 5. Когда уместен detach() на камерной платформе?
- Пан всегда внизу и несёт всё; вес камеры на плече 3–4 см — критерий выбора между SG90 (до ~120 г) и MG996R (смартфон).
- Рабочий ход с отступами: пан 30–150°, тилт 45–135° — кабель и кронштейн не должны добираться до упоров.
- Джойстик → map + мёртвая зона 460–560; без неё платформа плывёт от гуляющего центра.
- Плавность — это шаг 1° каждые 15–80 мс; для видео скорость единиц–десятка градусов в секунду.
- Механика: центр тяжести над осью тилта, кабель по кронштейну стяжками, камера — через площадку на винтах М2, не на один винт в качалку.
- В простое — detach(), перед движением — write(); тяжёлая камера — внешний блок 5–6 В и общий GND.
Частые вопросы по теме урока
- Какая серво должна стоять внизу пан-тилт и почему?
- Пан несёт на себе всю верхнюю конструкцию. Тилт внизу — значит вся конструкция балансирует на самой хрупкой оси. пан — она несёт вес верхней серво, кронштейна и камеры
- Зачем в скетче с джойстиком нужна мёртвая зона вокруг центра 512?
- Центр дешёвого джойстика гуляет на 20–50 единиц АЦП. Без зоны 460–560 платформа будет медленно дрейфовать при отпущенной ручке. чтобы платформа не плыла сама из-за гуляющего центра джойстика
- Какой рабочий ход разумно оставить оси пан и почему?
- На краях хода кабель натягивается, а выступ кронштейна бьёт по основанию. Отступ 15–20° с каждой стороны снимает перегруз упора. 30–150° — кабель и кронштейн у краёв упираются в основание
- Какого порядка скорость делает движение платформы кинематографичным?
- Шаг 1° каждые 15–80 мс даёт 12–66°/с. Мой таймлапс облаков снят на 1° за 80 мс — 12,5°/с. единицы–десяток градусов в секунду: один градус за десятки миллисекунд
- Когда уместен detach() на камерной платформе?
- detach() снимает гул и нагрев в статике, но вал становится свободным. Перед движением верните заказанный угол через write(). в простое, когда платформа статична; перед новым движением — снова write()