Библиотека для плавного управления сервоприводами
- Дополнение к стандартной библиотеке Servo
- Настройка максимальной скорости сервопривода
- Настройка ускорения (разгон и торможение) сервопривода
- Неблокирующая работа
- Трапецеидальный профиль скорости
- При использовании ESC и БК мотора получаем "плавный пуск" мотора
- Установка целевой позиции серво по углу (0-180) и длине импульса (500-2400)
- Автоматическое отключение (detach) при достижении цели
- Плавный пуск при подключении серво
- Поддержка расширителя PCA9685
Совместима со всеми Arduino платформами (используются Arduino-функции)
К библиотеке есть расширенная документация
- Библиотеку можно найти по названию ServoSmooth и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
После подключения библиотеки, в platformio.ini необходимо добавить arduino-libraries/Servo и Wire. Таким образом, список должен будет состоять как минимум из 3х библиотек:
lib_deps = gyverlibs/ServoSmooth arduino-libraries/Servo Wire
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
ServoSmooth servo;
ServoDriverSmooth servo; // для PCA9685
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 СЕК!
Остальные примеры смотри в examples!
/*
Данный код плавно управляет одной сервой (на пине 2)
при помощи потенциометра (на пине А0)
Документация: https://alexgyver.ru/servosmooth/
*/
#include <ServoSmooth.h>
ServoSmooth servo;
void setup() {
Serial.begin(9600);
servo.attach(2, 600, 2400); // 600 и 2400 - длины импульсов, при которых
// серво поворачивается максимально в одну и другую сторону, зависят от самой серво
// и обычно даже указываются продавцом. Мы их тут указываем для того, чтобы
// метод setTargetDeg() корректно отрабатывал полный диапазон поворота сервы
servo.setSpeed(50); // ограничить скорость
servo.setAccel(0.3); // установить ускорение (разгон и торможение)
servo.setAutoDetach(false); // отключить автоотключение (detach) при достижении целевого угла (по умолчанию включено)
}
void loop() {
// желаемая позиция задаётся методом setTarget (импульс) или setTargetDeg (угол), далее
// при вызове tick() производится автоматическое движение сервы
// с заданным ускорением и ограничением скорости
servo.tick(); // здесь происходит движение серво по встроенному таймеру!
int newPos = map(analogRead(0), 0, 1023, 0, 180); // берём с потенцометра значение 0-180
servo.setTargetDeg(newPos); // и отправляем на серво
}
-
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)
-
v3.0
- Добавлен полностью новый, более плавный алгоритм
- Почищен мусор
- Добавлена поддержка PCA9685
- "Плавность" вынесена в базовый класс для упрощения добавления поддержки новых библиотек серво
-
v3.1 - оптимизирован и облегчён алгоритм, скорость задаётся в градусах/сек
-
v3.2 - исправлен баг с резким поворотом при первом tick, добавлена smoothStart
-
v3.3 - исправлен баг, возникающий если не вызывать tick
-
v3.4 - при установке ускорения в 0 активируется профиль постоянной скорости
-
v3.5
- Улучшена/исправлена работа 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
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код