Arduino и сервопривод
Сервопривод, он же сервомашинка, он же просто серво – простейший “модельный” актуатор, использовался в радиоуправляемых моделях ещё до появления Ардуино. Сервопривод поворачивает свой выходной вал в диапазоне ~180 градусов и обладает вполне приличным моментом для перемещения частей механизмов. В маленьком корпусе располагаются:
- Коллекторный моторчик
- Редуктор (пластиковый или металлический)
- Потенциометр обратной связи
- Контроллер (драйвер мотора, обратная связь, управление по интерфейсу PWM)
Серво комплектуется набором “качалок” и винтами для крепления

Характеристики 9-граммового сервопривода:
- Напряжение питания: 3.. 7.2V
- Крутящий момент:
- 1.2кг/см при 4.8V
- 1.6кг/см при 6.0V
Сервопривод управляется ШИМ сигналом, точнее длиной импульса: минимальная (0 градусов) и максимальная (~180 градусов) длина импульса колеблется в зависимости от модели и производителя сервопривода.

Подключение
- Коричневый: GND
- Красный: VCC
- Жёлтый: цифровой пин
Примечание: сервопривод потребляет довольно приличный ток (стартовый до 1А), поэтому рекомендуется питать его от внешнего источника. При питании от компьютера напряжение может просесть и МК перезагрузится, при высокой нагрузке (с 2 и больше приводов) может выгореть защитный диод на плате Arduino!


Библиотеки
Для управления сервоприводом можно использовать стандартную библиотеку Servo. Эта библиотека отбирает у микроконтроллера первый таймер, поэтому в некоторых случаях будет удобно использовать библиотеку SoftServo. Стандартная библиотека управляет сервоприводом очень резко, на максимальной скорости, поэтому для реальных применений лучше использовать библиотеку плавного движения серво – ServoSmooth.
Servo.h
Библиотека стандартная и идёт в комплекте с Arduino IDE. Подключаем и создаём объект сервопривода. При создании никакие аргументы не передаются:
#include Servo myservo;
Библиотека имеет следующие методы:
uint8_t attach(int pin); // "подключить" с указанием пина uint8_t attach(int pin, int min, int max); // "подключить" с указанием пина и мин. макс. сигнала void detach(); // отключить void write(int value); // повернуть на угол в градусах void writeMicroseconds(int value); // повернуть на длину импульса
При “подключении” серво через attach(pin) диапазон длины импульса устанавливается стандартный: 544.. 2400 мкс (задан в библиотеке). Если есть желание настроить серво идеально, чтобы она работала на весь диапазон – нужно попробовать покрутить её через writeMicroseconds() в крайних значениях диапазона и найти минимум и максимум, при которых серво “упирается”.
Примеры
Крутим туда сюда быстро
Вращаем туда сюда быстро (как blink, только серво):
#include Servo myservo; void setup() < myservo.attach(3); // подключаем на пин 3 >void loop() < myservo.write(0); // поворот на 0 градусов delay(1000); myservo.write(180); // поворот на 180 градусов delay(1000); >
Крутим туда сюда плавно
Поворачиваем туда сюда плавно, блокирующее выполнение:
#include Servo myservo; void setup() < myservo.attach(3); >void loop() < for (int i = 0; i for (int i = 180; i > 0; i--) < myservo.write(i); delay(15); >>
Крутим туда сюда плавно асинхронно
Поворачиваем туда сюда плавно, асинхронное выполнение:
#include Servo myservo; void setup() < myservo.attach(3); >uint32_t tmr; // переменная таймера int val = 0; // переменная яркости int dir = 2; // скорость и направление яркости void loop() < // асинхронный таймер на миллис if (millis() - tmr >= 20) < tmr = millis(); val += dir; // прибавляем скорость if (val >= 180|| val >
Домашнее задание
- Попробовать библиотеку ServoSmooth
Связанные уроки
- Документация на ServoSmooth
- Функции времени
Робототехнический комплект на базе VEX IQ Расширенный с техническим зрением

Образовательный набор предназначенны для изучения основ разработки программируемых моделей автономных мобильных роботов.
Образовательный набор предназначенны для изучения основ разработки программируемых моделей автономных мобильных роботов.
В состав набора входит:
- Комплект конструктивных элементов из пластика ;
- Инструмент для работы с крепежными компонентами;
- Сервопривод — 4 шт;
- Пульт управления — 1 шт;
- Датчик касания — 1 шт;
- Датчик цвета — 1 шт;
- Датчик тактильно-сенсорный со светодиодным модулем — 1 шт;
- Камера с возможностью одновременного определения нескольких цветов — 1 шт;
- Аккумуляторная батарея — 1 шт;
- Робототехнический контроллер тип 1 — 1 шт;
- Робототехнический контроллер тип 2 — 1 шт;
Робототехнический контроллер Тип 1 состоит из:
Arduino-робот жук Ringo


Небольшой arduino-проект для начинающих с большими амбициями: с одной стороны, не нужны никакие сложные детали и навыки, с другой — это настоящая мобильная робототехническая платформа, которую можно сделать своими руками.

Для реализации потребуется один день, но проект можно развивать и дорабатывать далее. Не обязательно владеть пайкой, которую многие новички боятся и избегают, в проекте используется бредбоард, и паяльник не нужен.
Программирование является еще одним страхом начинающих, Т.к. это настоящий робот, то, конечно, он имеет программу. Но сначала можно не вникать, а просто найти и скачать готовый код со страницы на GitHub. Это open source проект, программу можно изменять без каких либо ограничений. Возможно, это ваш первый робот и первый урок программирования.
Подготовка
Отлично, если вы знакомы с платформой Arduino. Если нет — не проблема. Построение робота Ringo — отличный способ это исправить. Начните с наших онлайн уроков Arduino для начинающих.

Компоненты, необходимые для разработки робота-жука

Инструменты, которые понадобятся
Необходимые для проекта компоненты: Arduino Uno с кабелем USB, коробочка для одной 9В батареи, батарейка 9В (или аккумулятор 7,2-8,4В), три небольших аналоговых сервоприводов, один инфракрасный (ИК) приемник, мини-бредбоард, соединительные провода, стальная проволока (диаметр 1,5 — 2 мм), 2-3 обычных металлических скрепки. Также пригодятся инструменты.
Как подключить ИК-приемник к Arduino
В проекте используется ИК-приемник и ИК-передатчик (это может быть пульт от вашего телевизора).
Давайте научимся получить команды с ИК-пульта дистанционного управления. Нужно считать и запомнить код сигнала, чтобы позже использовать его для управления роботом.
Возьмите Arduino Uno, бредбоард, соединительные провода и ИК-приемник. Соберите схему как на фотографии.
Подключение ИК-приемника к Arduino UNO

Схема подключения ИК-приемника к Arduino UNO
Эта схема подключения ИК-приемника TSOP2136. Если будете использовать другой приемник — смотрите его спецификацию.
Теперь скачайте пример кода с GitHub. Откройте Arduino IDE и проект /ir_receiver/ir_receiver.ino. Первая строка кода:
Это означает, что скетч использует специальную библиотеку IRremote.h, в которой реализован функционал приема и отправки ИК-сигналов.
IRremote.h не является частью Arduino IDE, ее потребуется установить. Это open source проект с лицензией GNU, поэтому мы можем использовать этот код для своего робота. Откройте Serial Monitor и проверьте скорость передачи. Установите скорость 9600. Возьмите ИК пульт и начните нажимать на кнопки. Если собранная модель работает — вы видите коды в Serial Monitor.
Разные производители — разные коды, также коды могут отличаться для разных моделей ИК-пультов. Чтобы не разбираться в этих кодах и упростить задачу — просто выпишем соответствия кодов, нажатым кнопкам, которые мы будем использовать. Некоторые коды соответствуют повторному нажатию и удержанию кнопки — их не будем использовать.
Наш робот может выполнять 13 команд:
- Двигаться вперед.
- Двигаться Назад.
- Повернуть налево.
- Повернуть направо.
- Движение вперед с левым поворотом.
- Движение вперед с правым поворотом.
- Движение назад с левым поворотом.
- Движение назад с правым поворотом.
- Остановка.
- Установка 1-й скорости (медленная).
- Установка 2-й скорости.
- Установка 3-й скорости.
- Установка 4-й скорости (быстрая).
Выберите кнопки на пульте дистанционного управления для соответствующих команд. Например, кнопки 1-9 для первых девяти команд и цветные кнопки (красная, зеленая, желтая и синяя) — для последних четырех.
Теперь нажимайте соответствующую кнопку и записывайте соответствующие уникальные коды.
Прототип:


Прежде чем приступить к сборке робота, проверим работоспособность железа и программы. Загрузите скетч в микроконтроллер, измените в программе коды в соответствии с таблицей, которую вы составили. Нажимайте на управляющие кнопки пульта, проверьте реагируют ли серводвигатели, все ли работает. Проверьте работоспособность модели не только с питанием по USB, но и с питанием от аккумулятора.
Походка жука
Не все знают как ходят жуки, поэтому несколько слов о походке жуков и алгоритме для подражания. Обычная походка шестиногих жуков — конечности каждой из трех пар ног переставляются в противофазе друг другу, что напоминает «шагающие штативы». Но это не все виды походки жуков, некоторые умеют скакать.
Как мы можем реализовать походку жука? Наш робот имеет три сервопривода. Они установлены в ряд с левой стороны к правой. Левая серво — для левой передней и задних ног. Эти ножки изготовлены в виде одной детали. Правый сервопривод — для правой передней и задних ног. И центральный сервопривод — для средних ног.
Видео, демонстрирующее как это работает:
Монтаж
Чтобы прикрепить батарейный отсек к плате возьмем скрепку и сделаем кронштейн. Все остальные компоненты мы установим на Arduino Uno: сервоприводы, мини-бредбоард.
Распечатайте трафарет (скачать здесь). Возьмите линейку и проверьте длину линий. Если длина не совпадает нужно перед распечаткой поменять настройки в программе просмотра PDF-файлов.




Разогните скрепку, а затем согните ее по трафарету. Подключите булавку-кронштейн к цифровым пинам 9 и 12. Клеем приклейте кронштейн к нижней стороне держателя батареи. Не беспокойтесь о замыкании контактов 9 и 12. Это безопасно, т.к. мы не будем использовать их в скетче.
Рекомендуется использовать бредбоард как можно меньшего размера. Опытным путем автор проекта определи, что размер 5*10 пинов оптимален. Такой бредбоард можно либо купить готовый, либо обрезать от макетной платы кусок нужного размера.


Сервоприводы нужно подготовить — убрать наклейки, т.к. мы будем их склеивать, и отрезать монтажные петли, они занимают слишком много места. Сервоприводы бывают очень хрупкие.


Возьмите один сервопривод и приклейте его на верхней части держателя батареи. Постарайтесь расположить серво так же, как на фотографиях. Обратите внимание, нужно оставить некоторое пространство для миниатюрного бредбоард рядом с сервоприводом. Приклейте сервоприводы к держателю батареи.



Установите макетную плату. Обратите внимание, что ИК-приемник должен быть направлен вверх. Теперь включите выключатель на держателе батареи, попробуйте управлять роботом с ИК-пульта и убедитесь, что все работает.
Как насчет ног?
Автор проекта сделал трафареты, чтобы помочь подобрать размер и форму ног робота-жука. Распечатайте их и проверьте масштаб. Один трафарет для левой и правой фронтальных задних ног, другой трафарет — для средних. Приклейте ноги к серводвигателям. Кажется, все готово!
Этот Arduino-проект для начинающих можно развивать далее. Можно изменить внешний вид и изменить код. Роботу-жуку пригодятся различные датчики, крошечная веб-камера, Bluetooth-адаптер и ваша фантазия!
И чтобы вам не забывался этот проект, arduiono-жуки решили станцевать и спеть песню:
Использованные компоненты: плата arduino, три небольших аналоговых сервоприводов, стальная проволока (диаметр 1,5 — 2 мм), 2-3 обычных металлических скрепки, ИК-приемник, мини-бредбоард, стальная проволока (диаметр 1,5 — 2 мм), 2-3 обычных металлических скрепки

Возможно вас также заинтересует готовый робот-жук.
Другие проекты на этой платформе:
- Робот-миньон-копилка Arduino
- Говорящий робот-пылесос. Универсальное улучшение на Arduino
- Шагающая тыква. Arduino-робот для Хэллоуина
- Sourino — самодельная роботизированная мышь
- Двуногий робот из Arduino, LEGO и деталей 3D печати
- Шестиногий шагающий робот из Arduino, LEGO и деталей 3D печати
- Робот-художник на базе Arduino Uno
- Самодельный робот-собака Spot Micro
- Сферический четвероногий робот Arduino
- Виртуальная игра, управляемая настоящим велосипедом (Arduino)
- Четверногий Arduino-робот mechDOG
- Велосипед, подключенный к Google Street View через Arduino
- Самодельный таймер мытья рук на основе Arduino
- Учебный набор начинающего ситифермера
- Робот на Arduino, управляемый с помощью жестов
- Как сделать аниматронный хвост
- Вездеход из Lego с видео и bluetooth на Raspberry Pi
- Робот Juno: изучай Arduino и программирование
- Робот-манипулятор из настольной лампы IKEA
- Arduino-робот, объезжающий препятствия
- Роботизированная интеллектуальная система — РИС
- Серво-выключатель света для умного дома
- Робот-рыба на Arduino
- Сделай сам большого человекоподобного робота
- Сноуборд в виртуальной реальности с Arduino и Google Cardboard
- Open Source проект робота на Arduino
- Робот-компаньон на основе Arduino и Android-смартфона
- Робот миньон из яйца от Kinder-сюрприза и Arduino
- Робот-собака на Arduino
- Робот WALL-E на Arduino
- Робот-Железяка 1, управляемый по Bluetooth
- Собирай кубик Рубика с Arduino UNO
- ArGo — автомобиль из конструктора Lego Technic и Arduino
- Arduino робот-сортировщик Skittles, напечатанный на 3D-принтере
- Полноразмерный робот T-800 из фильма Терминатор
- Робот Гадкий утенок
- Робот-шлем для чистки зубов
- Noodlebot — шагающий робот на базе Arduino
- Робот телеприсутствия из arduino и нетбука
- Arduino-Lego танк
- Робот для игры в воздушный хоккей из частей для 3D принтера
- Arduino драм машина (Yellow Drum Machine)
- Робот-гуманоид Halley: Ambassador Robot 001
- MobBob — шагающий робот-смартфон
- PopPet — оригинальный образовательный робот
- Робот, рисующий по фотографии
- Робот R2D2, напечатанный на 3D-принтере
- Робот, танцующий как Майкл Джексон
- Запускай кофе-машину, используя Twitter
- Управляй телевизором силой мысли и Arduino
- О’кей Google, Сезам, открой дверь
- Марсоход, напечатанный на 3D-принтере
- Шагающий робот из палочек от мороженого
Перейти в каталог DIY-проектов роботов

Как добавить робопроект в каталог?
Arduino – плавное управление сервоприводом v3.8

Вы наверняка работали с сервоприводами из под Arduino и знаете, как это выглядит: сервоприводу можно приказать повернуться на угол, и он с максимальной скоростью начнёт поворачиваться на этот угол. Это очень неправильно применять в реальных устройствах, потому что создаются лишние нагрузки и растёт потребление тока (большой стартовый ток). Можно ли крутить серво плавно? Можно! Я сделал библиотеку ServoSmooth, которая в этом поможет.
Зачем это нужно? В реальных устройствах, где нужно сервой повернуть/подвинуть тяжёлый объект, стандартный подход (дать сигнал и ждать поворота) работает на уничтожение редуктора привода, потому что объекты инерционные и быстро их разогнать и остановить невозможно! Ограничив максимальную скорость серво, разгон и торможение мы продлеваем ресурс редуктора в десятки раз, а также потребляем меньший ток за счёт плавности прикладывания момента. И очевидно получаем приятный визуальный эффект – нет резких рывков всей конструкции при разгоне-остановке.
Так как ESC контроллеры используют такой же протокол связи, мы автоматически получаем плавный разгон и торможение для бесколлекторных моторов (в этом случае за ускорение мотора отвечает максимальная скорость, метод setSpeed. Подумайте, это уже производная). И это круто!
[УСТАРЕЛО] Алгоритм работы для любопытных: работает всё на экспоненциальном бегущем среднем, именно оно обеспечивает плавный разгон и торможение. Ограничение скорости делается “дроблением” поворота серво по времени: серво поворачивается на несколько градусов по таймеру.
Старый алгоритм
//по таймеру: _newSpeed = _servoTargetPos - _servoCurrentPos; // расчёт скорости if (_servoState) < _newSpeed = constrain(_newSpeed, -_servoMaxSpeed, _servoMaxSpeed); // ограничиваем по макс. _servoCurrentPos += _newSpeed; // получаем новую позицию _newPos += (float)(_servoCurrentPos - _newPos) * _k; // и фильтруем её _newPos = constrain(_newPos, _min, _max); // ограничиваем _servo.writeMicroseconds(_newPos); // отправляем на серво >
Новый алгоритм работает по другому, обеспечивая более плавный разгон. Ускорение осуществляется двойным интегрированием позиции: к ней прибавляется скорость, к которой прибавляется ускорение. Торможение начинается с момента, полученного из школьной формулы S=V*V/(2*a). Для любознательных прикреплю алгоритм ниже.
Новый алгоритм
float err = _targetPos - _currentPos; if (abs(err) > 0.1) < bool thisDir = (_speed * _speed / _maxAcceleration / 2.0 >= abs(err)); // пора тормозить _speed += _maxAcceleration * delta * (thisDir ? -_sign(_speed) : _sign(err)); _speed = constrain(_speed, -_maxSpeed, _maxSpeed); _currentPos += _speed * delta; >

БИБЛИОТЕКА
ServoSmooth v3.8
Библиотека для плавного управления сервоприводами
- Является дополнением к стандартной библиотеке Servo
- Поддерживает работу с расширителем серво PCA9685 (начиная с v3.0)
- Настройка максимальной скорости сервопривода
- Настройка ускорения (разгон и торможение) сервопривода
- Плавный пуск из любого положения при запуске программы (начиная с v3.2)
- При использовании ESC и БК мотора получаем “плавный пуск” мотора
- Установка целевой позиции серво по углу (0-180) и длине импульса (500-2400)
- Автоматическое отключение привода по таймауту неактивности и включение при изменении позиции (настраивается)
- Нативная поддержка серво с любым диапазоном по углу (180, 270, 360), см. документацию
Поддерживаемые платформы: все Arduino-совместимые платы (библиотека является дополнением к стандартной библиотеке Servo и PCA9685)
УСТАНОВКА
- Библиотеку можно найти и установить через менеджер библиотек по названию ServoSmooth в:
-
- Arduino IDE (Инструменты/Управлять библиотеками)
- Arduino IDE v2 (вкладка “Library Manager”)
- PlatformIO (PIO Home, вкладка “Libraries”)
ДОКУМЕНТАЦИЯ
Документация
- write() и writeMicroseconds() — повернут вал серво с максимальной скоростью
- attach() и detach() — подключить и отключить серво от управления
Инициализация
Объект создаётся точно так же, как в Servo.h, без параметров. Также можно передать рабочий угол серво (если не передавать, будет равен стандартному 180 град.)
#include "ServoSmooth.h" // подключили либу ServoSmooth servo; // создали объект ServoSmooth servo(270); // создали с указанием макс. угла серво
- attach(pin); — подключит серво на указанный pin , угол поворота будет установлен на 0 градусов. Длина импульса* мин-макс будет стандартная, 500-2400 мкс
- attach(pin, target); — подключит серво на указанный pin , угол поворота** будет установлен на target градусов. Длина импульса* мин-макс будет стандартная, 500-2400 мкс
- attach(pin, min, max); — подключит серво на указанный pin , угол поворота будет установлен на 0 градусов. Длина импульса* будет установлена min и max соответственно.
- attach(pin, min, max, target); — подключит серво на указанный pin , угол поворота будет установлен на target градусов. Длина импульса* будет установлена min и max соответственно.
Плавный пуск ( new! )
- Заранее знать, на какой угол физически повёрнут привод при запуске и передать его в attach(pin, target) . Как узнать? Зависит от конкретной задачи и логики работы программы. Можно запоминать положение сервы в ЕЕПРОМ и восстанавливать при запуске, можно устанавливать серво в один и тот же угол перед выключением/перезагрузкой системы, и т.д.
- Воспользоваться фичей smoothStart() , которая появилась в версии 3.2 данной библиотеки. Работает она очень просто: аттачит и детачит сервопривод с периодом в пару десятков миллисекунд, таким образом привод плавно движется до заданного угла из любого начального положения. Вызывать smoothStart() нужно однократно (при старте программы) сразу после attach(pin, target) в блоке setup() . Внимание! Функция блокирующая, выполнение занимает 900 миллисекунд. Период «рывка» сервопривода выбран минимальный, при котором серво начинает понимать, чего от неё хотят. Период довольно большой, поэтому движение к заданной позиции происходит рывками, но в целом гораздо плавнее, чем без smoothStart() . В массивном механизме рывки практически незаметны!
servo.attach(2, 35); // стартовый угол 35 градусов servo.smoothStart(); // "плавно" движемся к нему
Управление
- setTarget(длина); — устанавливает целевую позицию для серво в величине длина импульса, мкс (~500-2400)
- setTargetDeg(угол); — устанавливает целевую позицию для серво в градусах (0-180)
- setSpeed(скорость); — установка максимальной скорости (больше нуля) в градусах в секунду
- setAccel(ускорение); — установка ускорения (float числа 0.01 — 1.0). Можно больше 1, будет ещё резче. Если установить ускорение 0 — оно будет отключено и серво будет двигаться по профилю постоянной скорости (с бесконечным ускорением)
- Если передавать ускорение в целых числах (с версии 3.7 библиотеки) — ускорение будет установлено в градусах/сек/сек. Рабочий диапазон ускорений 1 — 1500 , чем больше — тем резче. При значении 0 ускорение будет отключено.
- setDirection(напр); — принимает NORMAL (false) или REVERSE (true), меняет направление серво
- setCurrent(длина); — установка текущей позиции в мкс (500 — 2400). Может пригодиться в ситуации, когда мы знаем реальный угол серво и хотим сообщить о нём программе, чтобы алгоритм не дёргал привод.
- setCurrentDeg(угол); — установка текущей позиции в градусах (0-180). Зависит от min и max.
- getCurrent(); — получение текущей позиции в мкс (500 — 2400)
- getCurrentDeg(); — получение текущей позиции в градусах (0-180). Зависит от min и max
- getTarget(); — получение целевой позиции в мкс (500 — 2400)
- getTargetDeg(); — получение целевой позиции в градусах (0-180). Зависит от min и max
- setMaxAngle(); — установка макс. угла серво, по умолчанию 180 . Позволяет удобно работать с разными сервами (на 270 и 360 градусов)
Расширитель серво PCA9685
- ServoDriverSmooth servo; // по умолчанию (адрес 0x40, угол 180)
- ServoDriverSmooth servo(0x40); // с указанием адреса драйвера
- ServoDriverSmooth servo(0x40, 270); // с указанием адреса и макс. угла
Список функций
void write(uint16_t angle); // аналог метода из библиотеки Servo void writeMicroseconds(uint16_t angle); // аналог метода из библиотеки Servo void attach(uint8_t pin); // аналог метода из библиотеки Servo void attach(uint8_t pin, int min, int max); // аналог метода из библиотеки Servo. min по умолч. 500, max 2400 void detach(); // аналог метода detach из библиотеки Servo void start(); // attach + разрешает работу tick void stop(); // detach + запрещает работу tick boolean tick(); // метод, управляющий сервой, должен опрашиваться как можно чаще. // Возвращает true, когда целевая позиция достигнута. // Имеет встроенный таймер с периодом SERVO_PERIOD boolean tickManual(); // метод, управляющий сервой, без встроенного таймера. // Возвращает true, когда целевая позиция достигнута void setSpeed(int speed); // установка максимальной скорости (градусы в секунду) void setAccel(float accel); // установка ускорения (0.05 - 1.0). При значении 1 ускорение максимальное. 0 - отключено void setAccel(int accel); // установка ускорения в градусах/сек/сек (рабочее от 1 до ~1500). 0 - отключено void setTarget(int target); // установка целевой позиции в мкс (500 - 2400) void setTargetDeg(int target); // установка целевой позиции в градусах (0-макс. угол). Зависит от min и max void setAutoDetach(boolean set); // вкл/выкл автоматического отключения (detach) при достижении угла. По умолч. вкл void setCurrent(int target); // установка текущей позиции в мкс (500 - 2400) void setCurrentDeg(int target); // установка текущей позиции в градусах (0-макс. угол). Зависит от min и max void setMaxAngle(int maxAngle); // установка макс. угла привода int getCurrent(); // получение текущей позиции в мкс (500 - 2400) int getCurrentDeg(); // получение текущей позиции в градусах (0-макс. угол). Зависит от min и max int getTarget(); // получение целевой позиции в мкс (500 - 2400) int getTargetDeg(); // получение целевой позиции в градусах (0-макс. угол). Зависит от min и max void smoothStart(); // вызывать сразу после attach(пин, таргет). Смягчает движение серво из неизвестной позиции к стартовой. БЛОКИРУЮЩАЯ НА 1 СЕК!
-