Понятное описание схемы работы, подключения и управления сервоприводов для Ардуино. Обзор популярных моделей SG90, MG995. Серводвигатели 180, 270 и 360 градусов. Переделка серво непрерывного вращения.
Cервопривод
Контакты сервопривода. Желтый контакт — контакт управления
Серводвигателю нужен отдельный источник питания. Как и плата ардуино он работает от 5 вольт. Но при выполнении команд потребляет ток в несколько сотен миллиампер. При питании ардуино от usb максимально возможный ток равен 500 мА.
Однако, в неподвижном состоянии серводвигатель потребляет малый ток. Поэтому для теста мы подключим привод к ардуино напрямую.
Но помните, что для настоящих проектов или для подключения нескольких сервоприводов отдельный источник питания необходим. Кроме того, при недостаточном питании вал привода будет перемещаться неустойчиво, а перемещение вала приводит к скачкам напряжения через схему и может повредить плату.
Для того, чтобы постоянно поддерживать точное положение вала привода, нужно отправлять сигналы каждые 20 миллисекунд. Для упрощения программирования приводов уже написана библиотека Arduino Servo, которую мы будем использовать, чтобы не переписывать весь код. Кроме того, в стандартной библиотеке примеров уже есть программа управления двигателем от потенциометра, так что рассмотрим ее.
ДОКУМЕНТАЦИЯ
Данная библиотека является “дополнением” к стандартной библиотеке Servo.h и позволяет плавно управлять сервоприводом. Суть работы кроется в методе tick(), который нужно вызывать постоянно в loop (или прерывании таймера), внутри тика находится алгоритм с собственным таймером, который по чуть чуть поворачивает серво к нужному положению. Библиотека дублирует несколько методов из Servo.h (attach имеет расширенную инициализацию):
- write() и writeMicroseconds() – повернут вал серво с максимальной скоростью
- attach() и detach() – подключить и отключить серво от управления
Инициализация
Объект создаётся точно так же, как в Servo.h, без параметров. Также можно передать рабочий угол серво (если не передавать, будет равен стандартному 180 град.)
#include «ServoSmooth.h» // подключили либуServoSmooth servo; // создали объектServoSmooth servo(270); // создали с указанием макс. угла серво
По инициализации attach() есть несколько вариантов:
- 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 соответственно.
*Длина импульса – сервопривод управляется ШИМ сигналом, в котором длина импульса прямо управляет углом поворота, то есть подавая минимальную и максимальную длину мы получаем рабочий угол 180 градусов. По умолчанию мин. и макс. длина установлены 500 и 2400 соответственно, что подходит большинству сервоприводов, но желательно посмотреть и “откалибровать” свой привод так, чтобы он работал на все 180 градусов. Мин. и макс. время импульса отличаются у разных производителей и моделей серво.
**Указание угла поворота при инициализации устанавливает серво на нужный угол сразу при подаче сигнала, а также выставляет текущую и целевую позицию равными этой.
Плавный пуск (new!)
Сервопривод не имеет обратной связи по углу (для программы), поэтому при запуске будет “резко” повёрнут на стартовый угол (“в ноль” по умолчанию или на указанный в attach(pin, target). Есть два варианта избежать резких рывков в механизме при запуске программы:
- Заранее знать, на какой угол физически повёрнут привод при запуске и передать его в attach(pin, target). Как узнать? Зависит от конкретной задачи и логики работы программы. Можно запоминать положение сервы в ЕЕПРОМ и восстанавливать при запуске, можно устанавливать серво в один и тот же угол перед выключением/перезагрузкой системы, и т.д.
- Воспользоваться фичей smoothStart(), которая появилась в версии 3.2 данной библиотеки. Работает она очень просто: аттачит и детачит сервопривод с периодом в пару десятков миллисекунд, таким образом привод плавно движется до заданного угла из любого начального положения. Вызывать smoothStart() нужно однократно (при старте программы) сразу после attach(pin, target) в блоке setup(). Внимание! Функция блокирующая, выполнение занимает 900 миллисекунд. Период “рывка” сервопривода выбран минимальный, при котором серво начинает понимать, чего от неё хотят. Период довольно большой, поэтому движение к заданной позиции происходит рывками, но в целом гораздо плавнее, чем без smoothStart(). В массивном механизме рывки практически незаметны!
servo.attach(2, 35); // стартовый угол 35 градусовservo.smoothStart(); // «плавно» движемся к нему
Управление
Движение серво происходит автоматически в методе tick(), нам нужно всего лишь вызывать его как можно чаще в loop() (tick() имеет встроенный таймер на 20 миллисекунд). Также есть метод tickManual(), который поворачивает серву на следующий “шаг” при каждом вызове (тот же tick(), но не имеет своего таймера). Оба метода tick() возвращают false, пока серво движется, и true, когда серво достигла установленного угла, это можно использовать. Также серво автоматически отключается от управления при достижении заданного угла поворота (это уменьшает жужжание серво в простое). Эту функцию можно отключить, вызвав setAutoDetach(false). Инструменты для управления движением привода:
- setTarget(длина); – устанавливает целевую позицию для серво в величине длина импульса, мкс (~500-2400)
- setTargetDeg(угол); – устанавливает целевую позицию для серво в градусах (0-180)
- setSpeed(скорость); – установка максимальной скорости (больше нуля) в градусах в секунду
- setAccel(ускорение); – установка ускорения (float числа 0.01 – 1.0). Можно больше 1, будет ещё резче. Если установить ускорение 0 – оно будет отключено и серво будет двигаться по профилю постоянной скорости (с бесконечным ускорением)
- Если передавать ускорение в целых числах (с версии 3.7 библиотеки) – ускорение будет установлено в градусах/сек/сек. Рабочий диапазон ускорений 1 — 1500, чем больше – тем резче. При значении 0 ускорение будет отключено.
- start(); – автоматический attach + разрешает работу tick – серво движется к заданной позиции
- stop(); – detach + запрещает работу tick – серво останавливается
Полезные вспомогательные методы для различных ситуаций:
- 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
В версии библиотеки 3 и выше добавлена поддержка драйвера PCA9685, подключать нужно файл #include «ServoDriverSmooth.h»
- ServoDriverSmooth servo; // по умолчанию (адрес 0x40, угол 180)
- ServoDriverSmooth servo(0x40); // с указанием адреса драйвера
- ServoDriverSmooth servo(0x40, 270); // с указанием адреса и макс. угла
Метод attach(pin) принимает номер вывода на драйвере. В остальном всё работает точно так же, как с обычной сервой.
О сервоприводах
Сервопривод Ардуино (англ. — arduino servo) — устройство с электрическим мотором, которое можно повернуть на определенный угол и оставить в этом положении на определенное время.
Сервомоторы Ардуино по сути своей отличные устройства, которые могут поворачиваться в указанное положение и могут применяться в огромном количестве областей. Особенно сейчас их чаще всего применяют в робототехнике.
Обычно у них есть выходной вал, который может поворачиваться на 180 градусов. Используя Arduino мы можем задать сервомотору определенное положение в которое он перейдет.
Изначально сервоприводы начали использовать еще задолго до появления Ардуино, скажем так, в мире пультов дистанционного управления (RC), как правило, для управления рулевым колесом игрушечных машинок или крыльями самолетов. Со временем они нашли свое применение в робототехнике, автоматизации и, конечно же, в мире Ардуино.
В нашем материале мы увидим как подключить сервопривод Ардуино, а затем как управлять этим полезным механизмом и поворачивать его в определенные положения.
Общие сведения о сервоприводах
По определению: сервопривод — это двигатель, управляемый отрицательной обратной связью. Если сказать простым языком, то это двигатель, способный находиться в заданном положении, и при воздействии на вал, его принудительном отклонении, привод удерживает его положение.
Большинство сервоприводов подключаются по трём проводам, их назначение такое:
1. Плюс питания.
2. Минус питания.
3. Управляющий сигнал.
Сам же сервопривод состоит из: Двигателя постоянного тока (или двигателя другого типа), платы управления и датчика положения. Если вал сервопривода способен поворачиваться на 360 градусов, то в качестве датчика положения используется энкодер, а у приводов, вал которых поворачивается лишь на 180° используется потенциометр. Кроме этого, двигатель и вал сервопривода соединяются через понижающий редуктор, который понижая скорость вращения вала двигателя, повышает момент на валу сервы.
Плата управления анализирует сигнал на управляющем проводе, и если информация об угле поворота содержащаяся в сигнале отличается от фактического положения вала, то он поворачивается до тех пор, пока его положение не равняется с заданным.
Перечислим основные характеристики сервоприводов:
- Скорость поворота (время поворота на угол 60°);
- Крутящий момент (кг/см), эта величина говорит о том, какой вес в килограммах выдерживает двигатель, при длине рычага в 1 см от вала);
- Напряжение питания и потребляемый ток;
Сервоприводы различают по способу управления — цифровые и аналоговые. Цифровые срабатывают быстрее и работают стабильнее.
В большинстве серводвигателей используются одинаковые сигналы управления, а именно период сигнала — 20 мс, а длительность управляющего импульса зависит от угла, на который нужно повернуть вал, например, 544 мкс – 0°, 2400 мкс – 180°.
Диаграмма управляющих сигналов
Реже может быть и другая длина сигналов для разных углов, например, 760 и 1520 мкс для 0° и 180° соответственно. Поэтому при использовании не знакомых вам сервоприводов уточняйте длину управляющих сигналов в технической документации.
Необходимые узлы
Для того, чтобы освоить приведенные в статье методики управления сервоприводом вам понадобятся:
1 сервомотор
1 переменный резистор (потенциометр) на 10 кОм
Монтажная плата
1 микроконтроллер Arduino Uno
Коннекторы папа-папа
1 конденсатор на 100 мкФ (не обязательно)
Как это работает
Сервоприводы Arduino — это умные устройства. Используя только один входной пин, они получают значения для позиционирования от микроконтроллера и переходят в это положение. Как можно увидеть на рисунке в самом начале статьи внутри они имеют двигатель и цепь обратной связи, которая гарантирует, что вал/рычаг сервопривода достигнет желаемого положения.
Но какой сигнал сервомоторы получают на входе? Это прямоугольная волна, подобная PWM (англ. — pulse-width modulation, широтно-импульсная модуляция). Каждый цикл в сигнале длится 20 миллисекунд, и большая часть времени в значении LOW. В начале каждого цикла значение сигнала становится HIGH на время от 1 до 2 миллисекунд.
При 1 миллисекунде она составляет 0 градусов, а при 2 миллисекундах — 180 градусов, а в промежутке значение от 0 до 180. Это очень хороший и надежный метод. График выше упрощает понимание.
Программа
Откроем программу Knob из меню File — Examples — Servo.
Подключим библиотеку Servo.h в самом начале программы, чтобы иметь возможность использовать функции из этой библиотеки. И создадим экземпляр объекта Servo через который будем обращаться к методам.
#include <Servo.h>Servo myservo; // create servo object to control a servo
Добавим в программу возможность вывода информации в последовательный порт и загрузим в ардуино.
Принципиальная схема подключения сервопривода
Управление сервоприводом
Решающее значение в управлении сервоприводами выполняет управляющий сигнал, который представляет собой импульсы постоянной частоты и переменной ширины. Длина импульса – это один из важнейших параметров, который определяет положение сервопривода. Эту длину можно задать в программе вручную методом подбора через угол или использовать команды библиотеки. Для каждой марки устройства длина может быть различной.
Когда сигнал попадает в управляющую схему, генератор подает свой импульс, длительность которого определяется с помощью потенциометра. В другой части схемы происходит сравнение длительности поданного сигнала и сигнала с генератора. Если эти сигналы разные по длительности, включается электромотор, направление вращения которого определяется тем, какой из импульсов короче. При равенстве длины импульсов мотор останавливается.
Стандартная частота, с которой подаются импульсы, равна 50 Гц, то есть 1 импульс в 20 миллисекунд. При таких значениях длительность составляет 1520 микросекунд, и сервопривод занимает среднее положение. Изменение длины импульса приводит к повороту сервопривода – при увеличении длительности поворот осуществляется по часовой стрелке, при уменьшении – против часовой стрелки. Имеются границы длительности – в Ардуино в библиотеке Servo для 0° установлено значение импульса в 544 мкс (нижняя граница), для 180° – 2400 мкс (верхняя граница).
(Использовано изображение с сайта amperka.ru)
Важно учитывать, что на конкретном устройстве настройки могут несколько отличаться от общепринятых значений. У некоторых устройств среднее положение и ширина импульса может быть равной 760 мкс. Все принятые значения также могут незначительно отличаться из-за погрешности, которая может быть допущена при производстве устройства.
Способ управления приводом часто по ошибке называют PWM/ШИМ, но это не совсем корректно. Управление напрямую зависит именно от длины импульса, частота их появления не так важна. Корректная работа будет обеспечена как при 40 Гц, так и при 60 Гц, вклад внесет только сильное уменьшение или увеличение частоты. При резком спаде сервопривод начнет работать рывками, при завышении частоты выше 100 Гц устройство может перегреться. Поэтому правильнее называть PDM.
По внутреннему интерфейсу можно выделить аналоговые и цифровые сервоприводы. Внешних отличий нет – все различия только во внутренней электронике. Аналоговый сервопривод внутри содержит специальную микросхему, цифровой – микропроцессор, принимающий и анализирующий импульсы.
При получении сигнала аналоговый сервопривод принимает решение, менять или нет положение, и по необходимости подает на мотор сигнал с частотой 50 Гц. За время реакции (20 мс) могут произойти внешние воздействия, которые изменят положение сервопривода, и устройство не успеет среагировать. Цифровой сервопривод использует процессор, который подает и обрабатывает сигналы с большей частотой – от 200 Гц, поэтому он может быстрее отреагировать на внешние воздействия, быстрее развивать нужную скорость и крутящий момент. Следовательно, цифровой сервопривод будет лучше удерживать заданное положение. При этом для работы цифрового сервопривода требуется больше электроэнергии, что повышает их стоимость. Большой вклад в цену делает и сложность их производства. Высокая стоимость – единственный недостаток цифровых сервоприводов, в техническом плане они намного лучше аналоговых устройств.
Сервоприводы: подключение, управление, примеры работы
Познакомимся поближе с сервоприводами. Рассмотрим их разновидности, предназначение, подсказки по подключению и управлению.
БАГИ И ОШИБКИ
Если вы нашли баг или ошибку в исходнике или примерах, или у вас есть идеи по доработке библиотеки – пишите пожалуйста на почту alex@alexgyver.ru. В комментарии на страницах я заглядываю очень редко, на форум – ещё реже.
ОСТАЛЬНЫЕ БИБЛИОТЕКИ

У меня есть ещё очень много всего интересного! Смотрите полный список библиотек вот здесь.
Алекс2020-11-25T20:04:27+03:00
Внутри сервы
На видео, которое приведено ниже, показано, что происходит внутри сервомотора.
Будьте аккуратны. Если вы разберете серву подобным образом, есть вероятность, что собрать обратно ее не получится.
Дополнительное чтение
Сервопривод для ESP32
Реклама
Случайные повороты
Будем поворачивать серводвигатель на случайную величину. Практического смысла немного, но для демонстрации подойдёт.
Источник