Плавное вращение сервопривода ардуино

Сервоприводы PDM постоянного вращения: особенности применения и примеры кода

Сервоприводы PDM постоянного вращения — это моторы, которые управляются сигналом PDM (Pulse Duration Modulation) и поддерживает скорость вращения вала в любом направлении без ограничений по углу поворота.

Сервоприводы непрерывного вращения используются для моделирования движения различных механизмов. На основе сервопривода можно собрать вращающийся столик для предметной фотосъёмки, мобильного бота или радар кругового обзора.

Список моделей

Модель Форм-фактор Сигнал управления Обратная связь Назначение Внутренний интерфейс Диапазон вращения
Feetech FS90R / Документация Микро PDM Нет Постоянное вращение Аналоговый 360°
Feetech FT90R / Документация Микро PDM Нет Постоянное вращение Цифровой 360°
Feetech FS5103R Стандарт PDM Нет Постоянное вращение Аналоговый 360°
Feetech FS5113R Стандарт PDM Нет Постоянное вращение Аналоговый 360°
Feetech FB5317M-360 / Документация Стандарт PDM Да Постоянное вращение Цифровой 360°

Интерфейс управления

В сервоприводах PDM постоянного вращения скорость вращения вала зависит от длины импульса. Для управления мотором необходимо подавать особый сигнал PDM (Pulse Duration Modulation) — импульсы постоянной частоты и переменной ширины. При поступлении с внешнего контроллера управляющего импульса начинка сервопривода генерирует свой сигнал мотору.

В сигнале PDM частота импульсов постоянна и равна 50 Гц, т. е. период подачи импульсов равен 20 мс. А вот ширина импульса изменяется, и именно от неё зависит направление и скорость вращения мотора. Принято считать, что рабочая ширина импульса лежит в пределах 544–2400 мкс.

В качестве примера приведём данные для популярного хобби-сервопривода Feetech FS90R.

Период импульсов Ширина импульса Положение сервопривода
20 мс 544 мкс Вал сервопривода вращается по часовой стрелке (CW) с максимальной скоростью.
20 мс 1540 мкс Вал сервопривода стоит на месте.
20 мс 2400 мкс Вал сервопривода вращается против часовой стрелки (CWW) с максимальной скоростью.

На разных приводах диапазон ширины импульсов и скорости поворота вала может отличатся от стандартного. Эти данные можно уточнить в характеристиках.

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

Часто способ управления сервоприводами называют PWM (Pulse Width Modulation) или PPM (Pulse Position Modulation). Это не так, и использование этих способов может даже повредить привод. Корректный термин — PDM (Pulse Duration Modulation) в котором важна длина импульсов, а не частота.

Если ваш сервопривод дребезжит, дёргается или стоит задача управлять несколькими серво, обратите внимание на плату расширения Multiservo Shield.

Сервоприводы с обратной связью

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

Обычно наличие сигнала обратной связи явно указывается в характеристиках сервопривода.

Питание сервопривода

Сервопривод можно запитать двумя способами: напрямую от контроллера (если позволяют характеристики) или же от внешнего источника питания.

Без внешнего источника питания

Если сервопривод питается напряжением 5 вольт и потребляет ток менее 500 мА, есть возможность запитать сервомотор непосредственно от контроллера.

Схема подключения

Цвет провода Контакт Функция Подключение
Оранжевый / Жёлтый / Белый S Пин управления сервоприводом Подключите к пину ввода-вывода контроллера.
Красный V Питание Подключите к питанию контроллера.
Коричневый / Чёрный G Земля Подключите к земле контроллера.

С внешним источником питания

Если сервопривод питается напряжением свыше 5 вольт или потребляет ток более 500 мА, то ему необходим внешний источник питания.

Схема подключения

Цвет провода Контакт Функция Подключение
Оранжевый / Жёлтый / Белый S Пин управления сервоприводом Подключите к пину ввода-вывода контроллера.
Красный V Питание Подключите к внешнему источнику питания с подходящим вольтажом.
Коричневый / Чёрный G Земля Подключите к земле внешнего источника питания и земле контроллера.

Примеры работы для Arduino

Возьмём для тестовых проектов популярный сервопривод Feetech FS90R. А мозгом выступит платформа Arduino Uno.

Подключение и настройка

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

Источник

Arduino – плавное управление сервоприводом v3.8

ОБНОВЛЕНИЯ

  • v3.6 – Исправлены мелкие баги, вырезан дебаг с 3.5
  • v3.7 – Добавлено задание ускорения в градусах/сек/сек
  • v3.8 – Исправлен невозврат тика при autoDetach(false)

ТЕОРИЯ

Вы наверняка работали с сервоприводами из под Arduino и знаете, как это выглядит: сервоприводу можно приказать повернуться на угол, и он с максимальной скоростью начнёт поворачиваться на этот угол. Это очень неправильно применять в реальных устройствах, потому что создаются лишние нагрузки и растёт потребление тока (большой стартовый ток). Можно ли крутить серво плавно? Можно! Я сделал библиотеку ServoSmooth, которая в этом поможет.

Зачем это нужно? В реальных устройствах, где нужно сервой повернуть/подвинуть тяжёлый объект, стандартный подход (дать сигнал и ждать поворота) работает на уничтожение редуктора привода, потому что объекты инерционные и быстро их разогнать и остановить невозможно! Ограничив максимальную скорость серво, разгон и торможение мы продлеваем ресурс редуктора в десятки раз, а также потребляем меньший ток за счёт плавности прикладывания момента. И очевидно получаем приятный визуальный эффект – нет резких рывков всей конструкции при разгоне-остановке.

Так как ESC контроллеры используют такой же протокол связи, мы автоматически получаем плавный разгон и торможение для бесколлекторных моторов (в этом случае за ускорение мотора отвечает максимальная скорость, метод setSpeed. Подумайте, это уже производная). И это круто!

[УСТАРЕЛО] Алгоритм работы для любопытных: работает всё на экспоненциальном бегущем среднем, именно оно обеспечивает плавный разгон и торможение. Ограничение скорости делается “дроблением” поворота серво по времени: серво поворачивается на несколько градусов по таймеру.

Новый алгоритм работает по другому, обеспечивая более плавный разгон. Ускорение осуществляется двойным интегрированием позиции: к ней прибавляется скорость, к которой прибавляется ускорение. Торможение начинается с момента, полученного из школьной формулы S=V*V/(2*a). Для любознательных прикреплю алгоритм ниже.

БИБЛИОТЕКА

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”)
  • Про ручную установку читай здесь

ДОКУМЕНТАЦИЯ

Инициализация

Плавный пуск ( new! )

Управление

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 градусов)

    Источник

    GyverLibs/ServoSmooth

    Use Git or checkout with SVN using the web URL.

    Work fast with our official CLI. Learn more.

    Launching GitHub Desktop

    If nothing happens, download GitHub Desktop and try again.

    Launching GitHub Desktop

    If nothing happens, download GitHub Desktop and try again.

    Launching Xcode

    If nothing happens, download Xcode and try again.

    Launching Visual Studio Code

    Your codespace will open once ready.

    There was a problem preparing your codespace, please try again.

    Latest commit

    Git stats

    Files

    Failed to load latest commit information.

    README.md

    Библиотека для плавного управления сервоприводами

    • Дополнение к стандартной библиотеке Servo
    • Настройка максимальной скорости сервопривода
    • Настройка ускорения (разгон и торможение) сервопривода
    • Неблокирующая работа
    • Трапецеидальный профиль скорости
    • При использовании ESC и БК мотора получаем «плавный пуск» мотора
    • Установка целевой позиции серво по углу (0-180) и длине импульса (500-2400)
    • Автоматическое отключение (detach) при достижении цели
    • Плавный пуск при подключении серво
    • Поддержка расширителя PCA9685

    Совместима со всеми Arduino платформами (используются Arduino-функции)

    • Библиотеку можно найти по названию ServoSmooth и установить через менеджер библиотек в:
      • Arduino IDE
      • Arduino IDE v2
      • PlatformIO
    • Скачать библиотеку .zip архивом для ручной установки:
      • Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
      • Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
      • Распаковать и положить в Документы/Arduino/libraries/
      • (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
    • Читай более подробную инструкцию по установке библиотек здесь
    • Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
    • Через менеджер библиотек IDE: найти библиотеку как при установке и нажать «Обновить»
    • Вручную: удалить папку со старой версией, а затем положить на её место новую. «Замену» делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

    Остальные примеры смотри в examples!

    v1.1 — автоматическое отключение (detach) при достижении цели

    v1.2 — вкл/выкл автоотключения серво

    v1.3 — отдельный метод для установки и чтения текущего положения. Добавлен вариант метода attach

    v1.4 — улучшена совместимость

    v1.5 — исправлены getCurrent и getCurrentDeg

    v1.6 — чуть оптимизирована инициализация

    v1.7 — исправлен баг с низкой скоростью/ускорением, код оптимизирован

    v1.8 — улучшена стабильность

    v1.9 — добавлена настройка макс. угла серво

    v1.10 — исправлен баг когда текущая позиция совпадает с позицией таргета

    v2.0 — упрощён алгоритм

    v2.1 — добавлена смена направления

    v2.2 — фикс движения в инверсии (спасибо VICLER) и функций write (спасибо CheDima)

    • Добавлен полностью новый, более плавный алгоритм
    • Почищен мусор
    • Добавлена поддержка PCA9685
    • «Плавность» вынесена в базовый класс для упрощения добавления поддержки новых библиотек серво

    v3.1 — оптимизирован и облегчён алгоритм, скорость задаётся в градусах/сек

    v3.2 — исправлен баг с резким поворотом при первом tick, добавлена smoothStart

    v3.3 — исправлен баг, возникающий если не вызывать tick

    v3.4 — при установке ускорения в 0 активируется профиль постоянной скорости

    • Улучшена/исправлена работа stop
    • Поправлены ошибки с округлением
    • Исправлена проблема с медленным изменением target

    v3.6 — Исправлены мелкие баги, вырезан дебаг с 3.5

    v3.7 — Добавлено задание ускорения в градусах/сек/сек

    v3.8 — Исправлен невозврат тика при autoDetach(false)

    v3.9 — поддержка ESP32

    Баги и обратная связь

    При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
    Библиотека открыта для доработки и ваших Pull Request‘ов!

    При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:

    • Версия библиотеки
    • Какой используется МК
    • Версия SDK (для ESP)
    • Версия Arduino IDE
    • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
    • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
    • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код

    About

    Библиотека для плавного управления сервоприводами с Arduino

    Источник

    Adblock
    detector