Библиотека для плавного управления сервоприводами
Совместима со всеми Arduino платформами (используются Arduino-функции)
К библиотеке есть расширенная документация
После подключения библиотеки, в platformio.ini необходимо добавить arduino-libraries/Servo и Wire. Таким образом, список должен будет состоять как минимум из 3х библиотек:
lib_deps = gyverlibs/ServoSmooth arduino-libraries/Servo Wire
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
v3.1 - оптимизирован и облегчён алгоритм, скорость задаётся в градусах/сек
v3.2 - исправлен баг с резким поворотом при первом tick, добавлена smoothStart
v3.3 - исправлен баг, возникающий если не вызывать tick
v3.4 - при установке ускорения в 0 активируется профиль постоянной скорости
v3.5
v3.6 - Исправлены мелкие баги, вырезан дебаг с 3.5
v3.7 - Добавлено задание ускорения в градусах/сек/сек
v3.8 - Исправлен невозврат тика при autoDetach(false)
v3.9 - поддержка ESP32
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать: